def sauvegarder_modif(self): inst = self.instance cls = type(inst) for reponse in self.form.reponses: if is_related(cls, reponse.champ): champ = getmember(inst, reponse.champ) vide_refs(champ) rajoute_refs(champ, reponse.get_value()) inst.save() elif reponse.get_value() != getmember(inst, reponse.champ): inst = modifier_champ(cls, inst, reponse.champ, reponse.get_value())
def ajouter_nouveau(classe, **elems): # Malheureusement, la création d'un nouvel objet en base ne peut pas se faire # directement avec des cross-reference (ManyToMany). # On crée d'abord l'objet, ensuite on ajoute les cross-ref cross_ref = { cr: elems[cr] for cr in elems.keys() if is_related(classe, cr) } not_cross_ref = {r: elems[r] for r in elems.keys() if r not in cross_ref} obj = classe.create(**not_cross_ref) for elem in cross_ref.keys(): getmember(obj, elem).add(cross_ref[elem]) obj.save()
def consultationElements(classe): elems = list() # D'abord, on voit s'il y a une image dans le modèle try: chemin = getmember(classe, 'image')[0] except Exception as e: chemin = '' for elem in formation_db.liste_par_classe(classe): elem_details = OrderedDict() if chemin: path = getmember(elem, chemin) elem_details[chemin] = ImageViewCell(path, width=80, name='Photo') elem_details[chemin].hidden = elem elem_details = cells(elem, elem_details) elems.append(elem_details) return elems
def modifier_champ(cls, inst, champ, valeur): q = cls.update({getmember(cls, champ): valeur}).where(cls.id == inst.id) q.execute() # On met à jour la valeur de l'instance qu'on vient de modifier # Opération nécessaire : en cas d'absence, il n'y a pas de mise-à-jour # si l'instance ne contient qu'un champ dans cette base de donnée... # (va comprendre) return cls.get(cls.id == inst.id)
def gti(nom_champ, class_obj, current_values=None): # Si jamais, dans le design, on limite les choix à un ensemble fermé if getmember(class_obj, 'choices'): liste_de_vals = [value for enum, value in class_obj.choices] return GestionListeChoixUnique(nom_champ, liste_de_vals, current_values=current_values) else: return GestionTextInput(current_values=current_values)
def generateForm(classe, instance=None): box = GridLayout(cols=2) box.reponses = list() # D'abord, on voit s'il y a une image dans le modèle try: images = getmember(classe, 'image') if not images: images = [] except Exception as e: images = [] for image in images: if image in classe.requis: elem = getmember(classe, image) box.add_widget(Label(text=elem.verbose_name)) if instance: values = getmember(instance, image) else: values = None reponse = widgetDict['E_ImageField'](image, elem, values) reponse.champ = image box.add_widget(reponse) box.reponses.append(reponse) others = [champ for champ in classe.requis if champ not in images] fdict = dict([(name, obj) for name, obj in inspect.getmembers( classe, lambda x: dbHelper.isType(type(x))) if name in others]) for nom_champ in others: box.add_widget(Label(text=fdict[nom_champ].verbose_name)) ty = dbHelper.whatType(type(fdict[nom_champ])) if instance: values = getmember(instance, nom_champ) if is_related(classe, nom_champ): values = list(values) else: values = None reponse = widgetDict[ty](nom_champ, fdict[nom_champ], values) reponse.champ = nom_champ box.add_widget(reponse) box.reponses.append(reponse) box.add_widget(Widget()) return box
def is_related(classe, elem): return whatType(type(getmember(classe, elem))) == 'E_MultiLinkField' \ or whatType(type(getmember(classe, elem))) == 'E_LinkField'