From e0f01dec48435b7de2c2a997f2a728ac15eee174 Mon Sep 17 00:00:00 2001 From: amandine-sahl Date: Thu, 14 Sep 2023 17:52:18 +0200 Subject: [PATCH] Join taxref medias and attributes on cd_nom --- apptax/admin/admin_view.py | 58 +++++++++++-------- apptax/admin/filters.py | 9 ++- .../admin/templates/admin/details_taxref.html | 28 +++++---- apptax/admin/templates/admin/edit_taxref.html | 36 +++++++++--- apptax/taxonomie/models.py | 4 +- 5 files changed, 87 insertions(+), 48 deletions(-) diff --git a/apptax/admin/admin_view.py b/apptax/admin/admin_view.py index b90d5073..edb444b3 100644 --- a/apptax/admin/admin_view.py +++ b/apptax/admin/admin_view.py @@ -356,12 +356,19 @@ def render(self, template, **kwargs): def details_view(self): id = get_mdict_item_or_list(request.args, "id") taxon_name = db.session.query(Taxref).get(id) + if not taxon_name.cd_nom == taxon_name.cd_ref: + taxon_valid = db.session.query(Taxref).get(taxon_name.cd_ref) + else: + taxon_valid = taxon_name + # Get attributes - theme_attributs_def = self._get_theme_attributes(taxon_name) - attributes_val = self._get_attributes_value(taxon_name, theme_attributs_def) + theme_attributs_def = self._get_theme_attributes(taxon_valid) + attributes_val = self._get_attributes_value(taxon_valid, theme_attributs_def) self._template_args["theme_attributs_def"] = theme_attributs_def self._template_args["attributes_val"] = attributes_val + # Get media + self._template_args["medias"] = taxon_valid.medias return super(TaxrefView, self).details_view() @expose("/edit/", methods=("GET", "POST")) @@ -370,29 +377,32 @@ def edit_view(self): id = get_mdict_item_or_list(request.args, "id") taxon_name = db.session.query(Taxref).get(id) - # Get attributes - theme_attributs_def = self._get_theme_attributes(taxon_name) - attributes_val = self._get_attributes_value(taxon_name, theme_attributs_def) - if request.method == "POST": - for f in request.form: - if request.form.getlist(f) and f.startswith("attr."): - id_attr = f.split(".")[1] - value = "&".join(request.form.getlist(f)) - try: - model = ( - db.session.query(CorTaxonAttribut) - .filter_by(cd_ref=taxon_name.cd_ref) - .filter_by(id_attribut=id_attr) - .one() - ) - except Exception: - model = CorTaxonAttribut(cd_ref=taxon_name.cd_ref, id_attribut=id_attr) - model.valeur_attribut = value - db.session.add(model) - db.session.commit() - self._template_args["theme_attributs_def"] = theme_attributs_def - self._template_args["attributes_val"] = attributes_val + # Get attributes only if cd_nom is cd_ref + if taxon_name.cd_nom == taxon_name.cd_ref: + theme_attributs_def = self._get_theme_attributes(taxon_name) + attributes_val = self._get_attributes_value(taxon_name, theme_attributs_def) + + self._template_args["theme_attributs_def"] = theme_attributs_def + self._template_args["attributes_val"] = attributes_val + if request.method == "POST": + for f in request.form: + if request.form.getlist(f) and f.startswith("attr."): + id_attr = f.split(".")[1] + value = "&".join(request.form.getlist(f)) + try: + model = ( + db.session.query(CorTaxonAttribut) + .filter_by(cd_ref=taxon_name.cd_ref) + .filter_by(id_attribut=id_attr) + .one() + ) + except Exception: + model = CorTaxonAttribut(cd_ref=taxon_name.cd_ref, id_attribut=id_attr) + model.valeur_attribut = value + db.session.add(model) + db.session.commit() self._template_args["url_cancel"] = request.referrer or url_for("taxons.index_view") + return super(TaxrefView, self).edit_view() diff --git a/apptax/admin/filters.py b/apptax/admin/filters.py index 4a2bed91..6a94a735 100644 --- a/apptax/admin/filters.py +++ b/apptax/admin/filters.py @@ -6,6 +6,7 @@ from flask_admin.contrib.sqla.filters import FilterEqual from flask_admin.babel import lazy_gettext +from sqlalchemy.orm import aliased from apptax.taxonomie.models import ( Taxref, @@ -77,7 +78,9 @@ def operation(self): class FilterMedia(BaseFilter): def apply(self, query, value, alias=None): - medias_filter = Taxref.medias.any() + TaxonValid = aliased(Taxref) + query = query.join(TaxonValid, Taxref.cd_ref == TaxonValid.cd_ref) + medias_filter = TaxonValid.medias.any() if int(value) == 1: return query.filter(medias_filter) else: @@ -89,7 +92,9 @@ def operation(self): class FilterAttributes(BaseFilter): def apply(self, query, value, alias=None): - attr_filter = Taxref.attributs.any() + TaxonValid = aliased(Taxref) + query = query.join(TaxonValid, Taxref.cd_ref == TaxonValid.cd_ref) + attr_filter = TaxonValid.attributs.any() if int(value) == 1: return query.filter(attr_filter) else: diff --git a/apptax/admin/templates/admin/details_taxref.html b/apptax/admin/templates/admin/details_taxref.html index 2a6155e0..5ec68e25 100644 --- a/apptax/admin/templates/admin/details_taxref.html +++ b/apptax/admin/templates/admin/details_taxref.html @@ -14,7 +14,7 @@
{{model.nom_complet}} {% if model.nom_vern %} - {
- +
@@ -44,16 +44,16 @@
-
+ diff --git a/apptax/admin/templates/admin/edit_taxref.html b/apptax/admin/templates/admin/edit_taxref.html index 00165fac..ef1eeaf6 100644 --- a/apptax/admin/templates/admin/edit_taxref.html +++ b/apptax/admin/templates/admin/edit_taxref.html @@ -11,11 +11,21 @@ {% call lib.form_tag(action=action) %}
+ +
{{model.nom_complet}} {% if model.nom_vern %} - {{model.nom_vern}} {% endif %}
+ + {% if model.cd_nom != model.cd_ref %} + + {% endif %} + -
-
+ +
{{ lib.render_field(form, form.liste) }} -
+
+ {% if model.cd_nom == model.cd_ref %}
- {{ lib.render_field(form, form.medias) }} + {{ lib.render_field(form, form.medias) }}
+ {% endif %} + + {% if model.cd_nom == model.cd_ref %}
{% for theme in theme_attributs_def %}
-
+
{{theme}}
-
+
{% for attr in theme.attributs %}
@@ -86,7 +105,7 @@
{{theme}}
{% else %} NOT IMPLEMENTED {{ attr.type_widget }} {% endif %} - +
{% endfor %} @@ -94,10 +113,11 @@
{{theme}}
{% endfor %}
+ {% endif %}
- + {{ lib.render_form_buttons(url_cancel) }}
diff --git a/apptax/taxonomie/models.py b/apptax/taxonomie/models.py index 4c7451e0..b10cb7e2 100644 --- a/apptax/taxonomie/models.py +++ b/apptax/taxonomie/models.py @@ -47,7 +47,7 @@ class CorTaxonAttribut(db.Model): ) cd_ref = db.Column( db.Integer, - ForeignKey("taxonomie.taxref.cd_ref"), + ForeignKey("taxonomie.taxref.cd_nom"), nullable=False, primary_key=True, ) @@ -255,7 +255,7 @@ class TMedias(db.Model): id_media = db.Column(db.Integer, primary_key=True) cd_ref = db.Column( db.Integer, - ForeignKey(Taxref.cd_ref), + ForeignKey(Taxref.cd_nom), nullable=False, primary_key=False, )