diff --git a/.gitignore b/.gitignore index 7367652f2..883f966ac 100644 --- a/.gitignore +++ b/.gitignore @@ -43,6 +43,7 @@ atlas/static/custom/templates/credits.html atlas/static/custom/templates/mentions-legales.html atlas/static/custom/templates/personal-data.html atlas/static/custom/templates/navbar.html +atlas/static/custom/templates/statuts.html data/ref/emprise_territoire.* data/ref/communes.dbf diff --git a/atlas/atlasRoutes.py b/atlas/atlasRoutes.py index 21b95163d..652811f01 100644 --- a/atlas/atlasRoutes.py +++ b/atlas/atlasRoutes.py @@ -31,6 +31,7 @@ vmMedias, vmCorTaxonAttribut, vmTaxonsMostView, + vmStatutBdcRepository, ) @@ -263,6 +264,9 @@ def ficheEspece(cd_nom): organisms = vmOrganismsRepository.getListOrganism(connection, cd_ref) + statuts = vmStatutBdcRepository.get_taxons_statut_bdc(connection, cd_ref) + groupes_statuts = _make_groupes_statuts(statuts) + connection.close() db_session.close() @@ -284,9 +288,46 @@ def ficheEspece(cd_nom): taxonDescription=taxonDescription, observers=observers, organisms=organisms, + groupesStatuts=groupes_statuts, ) +def _make_groupes_statuts(statuts): + """Groupe les statuts de la BDC suivant la configuration GROUPES_STATUTS. + + Retourne une liste de groupes. Un groupe est de la forme : + + { + "label": "Monde", + "statuts": [ + { + "cd_type_statut": "LRM", + "lb_type_statut": "Liste Rouge Mondiale", + "cd_sig": "WORLD", + "code_statut": "LC", + "label_statut": "Préoccupation mineure", + "rq_statut": "" + } + ] + } + """ + + def is_statut_in_groupe(statut, groupe): + group_types = {origin["cd_type_statut"] for origin in groupe["origins"]} + group_sigs = {origin["cd_sig"] for origin in groupe["origins"]} + return statut["cd_type_statut"] in group_types and statut["cd_sig"] in group_sigs + + groupes_statuts = [] + for config_groupe in current_app.config["GROUPES_STATUTS"]: + groupe = {"label": config_groupe.get("label", ""), "statuts": []} + for statut in statuts: + if is_statut_in_groupe(statut, config_groupe): + groupe["statuts"].append(statut) + if groupe["statuts"]: + groupes_statuts.append(groupe) + return groupes_statuts + + @main.route("/commune/", methods=["GET", "POST"]) def ficheCommune(insee): session = db.session diff --git a/atlas/configuration/config.py.example b/atlas/configuration/config.py.example index bd7da925e..cb99a4b58 100644 --- a/atlas/configuration/config.py.example +++ b/atlas/configuration/config.py.example @@ -193,6 +193,45 @@ AFFICHAGE_GRAPH_ALTITUDES = True # Afficher le graphique de la phénologie. Affichage True/False AFFICHAGE_GRAPH_PHENOLOGIE = True +# Afficher les statuts de protection. Affichage True/False +AFFICHAGE_STATUTS = True + +# Configure quels statuts de protection sont affichés et dans quel ordre. +# - il est possible de définir plusieurs origines pour un groupe (pour grouper les listes rouges et les marqueurs znieff d'une même zone par exemple). +# - 'label' du groupe sera affiché devant l'ensemble des statuts provenant des origines spécifiées. 'label' est optionnel. +# - les valeurs des propriétés `cd_type_statut` et `cd_sig` correspondent aux valeurs présentes dans la BDD `atlas.vm_bdc_statut`. +GROUPES_STATUTS = [ + { + "label": "Monde", + "origins": [ + {"cd_type_statut": "LRM", "cd_sig": "WORLD"} + ] + }, + { + "label": "Europe", + "origins": [ + {"cd_type_statut": "LRE", "cd_sig": "EUROPE"} + ] + }, + { + "label": "France métropolitaine", + "origins": [ + {"cd_type_statut": "LRN", "cd_sig": "TERFXFR"} + ] + }, + { + "label": "Région", + "origins": [ + {"cd_type_statut": "LRR", "cd_sig": } # par exemple "INSEER52" + ] + }, + { + "origins": [ + {"cd_type_statut": "ZDET", "cd_sig": } # par exemple "INSEED44" + ] + } +] + # Rang taxonomique qui fixe jusqu'à quel taxon remonte la filiation taxonomique (hierarchie dans la fiche d'identite : Famille, Ordre etc... ) LIMIT_RANG_TAXONOMIQUE_HIERARCHIE = 13 diff --git a/atlas/configuration/config_schema.py b/atlas/configuration/config_schema.py index e1e292cd1..7f849826a 100644 --- a/atlas/configuration/config_schema.py +++ b/atlas/configuration/config_schema.py @@ -139,6 +139,18 @@ class Meta: AFFICHAGE_RECHERCHE_AVANCEE = fields.Boolean(load_default=False) AFFICHAGE_GRAPH_ALTITUDES = fields.Boolean(load_default=True) AFFICHAGE_GRAPH_PHENOLOGIE = fields.Boolean(load_default=True) + AFFICHAGE_STATUTS = fields.Boolean(load_default=True) + GROUPES_STATUTS = fields.List( + fields.Dict, + load_default=[ + {"label": "Monde", "origins": [{"cd_type_statut": "LRM", "cd_sig": "WORLD"}]}, + {"label": "Europe", "origins": [{"cd_type_statut": "LRE", "cd_sig": "EUROPE"}]}, + { + "label": "France métropolitaine", + "origins": [{"cd_type_statut": "LRN", "cd_sig": "TERFXFR"}], + }, + ], + ) RANG_STAT = fields.List( fields.Dict, @@ -207,6 +219,7 @@ class Meta: SPLIT_NOM_VERN = fields.Boolean(load_default=True) INTERACTIVE_MAP_LIST = fields.Boolean(load_default=True) AVAILABLE_LANGUAGES = fields.Dict(load_default=LANGUAGES) + AFFICHAGE_STATUTS = fields.Boolean(load_default=True) # Flask parameter enabling auto reload of templates # (no need to restart the atlas service when updating templates) # Defaults to False to have the best performance in production diff --git a/atlas/configuration/settings.ini.sample b/atlas/configuration/settings.ini.sample index f8eddf134..2cb50812e 100644 --- a/atlas/configuration/settings.ini.sample +++ b/atlas/configuration/settings.ini.sample @@ -137,6 +137,19 @@ attr_chorologie=103 # 15 jours par défaut time=15 +# Les paramètres `bdc_statuts_types` et `bdc_statuts_sigs` permettent de réduire les données de la BDC Statuts aux statuts qui +# seront effectivement utilisés. Permet un gain d'espace non négligeable et un léger gain de performance. + +# La liste des types de statuts à importer pour l'affichage des statuts de protection des espèces. Les valeurs attendues +# permettent de filtrer la colonne `cd_type_statut` de la VM générée à partir de `taxonomie.bdc_statut`. +bdc_statuts_types = ['LRM', 'LRE', 'LRN', 'LRR', 'ZDET'] + +# La liste des zones géographiques à importer pour l'affichage des statuts de protection des espèces. Les valeurs attendues +# permettent de filtrer la colonne `cd_sig` de la VM générée à partir de `taxonomie.bdc_statut`. +# Ajustez la valeur donnée en exemple avec vos codes régions et départements, par exemple : +# bdc_statuts_sigs = ['WORLD', 'EUROPE', 'TERFXFR', 'INSEER52', 'INSEED44'] +bdc_statuts_sigs = ['WORLD', 'EUROPE', 'TERFXFR'] + ################################################## ########## Paramatre administrateur avancé ####### ################################################## diff --git a/atlas/modeles/repositories/vmStatutBdcRepository.py b/atlas/modeles/repositories/vmStatutBdcRepository.py new file mode 100644 index 000000000..9b21bb9d3 --- /dev/null +++ b/atlas/modeles/repositories/vmStatutBdcRepository.py @@ -0,0 +1,19 @@ +from sqlalchemy.sql import text + + +def get_taxons_statut_bdc(connection, cd_ref): + sql = "SELECT * FROM atlas.vm_bdc_statut WHERE cd_ref = :thiscdref" + result = connection.execute(text(sql), thiscdref=cd_ref) + statuts = list() + for row in result: + statut = { + "rq_statut": row.rq_statut, + "code_statut": row.code_statut, + "label_statut": row.label_statut, + "cd_type_statut": row.cd_type_statut, + "lb_type_statut": row.lb_type_statut, + "lb_adm_tr": row.lb_adm_tr, + "cd_sig": row.cd_sig, + } + statuts.append(statut) + return statuts diff --git a/atlas/static/css/ficheEspece.css b/atlas/static/css/ficheEspece.css index 554cf640d..f3106ff18 100644 --- a/atlas/static/css/ficheEspece.css +++ b/atlas/static/css/ficheEspece.css @@ -79,23 +79,17 @@ p.imgDescription.main { /* */ -#groupLogoCol { - padding-left: 0px; - position: absolute; - right: 2%; - top: 4%; -} - #taxonName { - max-width: 85%; -} - -#taxonomy { - margin-top: 15px; + display: flex; + justify-content: space-between; } -#inpnLink { - margin-top: 15px; +#statuts-and-links-container { + display: flex; + align-items: center; + gap: 1.2rem; + justify-content: start; + margin: 1.5rem 0; } .nav > li > a { @@ -284,3 +278,85 @@ text { .carousel-indicators { bottom: 0px; } + +div#statut-bdc span.NT { + background-color: #fbf2ca ; +} + +div#statut-bdc span.LC { + background-color: #78b74a ; +} + +div#statut-bdc span.EN { + background-color: #fbbf00 ; +} + +div#statut-bdc span.VU { + background-color: #ffed00 ; +} + +div#statut-bdc span.CR { + background-color: #d3001b ; +} + +div#statut-bdc span.RE { + color: white; + background-color: #5a1a63 ; +} + +div#statut-bdc span.EW { + color: white; + background-color: #3d1951 ; +} + +div#statut-bdc span.EX { + color: white; + background-color: black ; +} + +div#statut-bdc span.NA { + color: white; + background-color: #919291 ; +} + +div#statut-bdc span.NE { + background-color: white ; +} + +div#statut-bdc span.DD { + background-color: #d3d4d5 ; +} + +div#statut-bdc span.DHFF { + color: white; + background-color: #afdde9 ; +} + +div#statut-bdc span.PN { + color: white; + background-color: #ffccaa ; +} + +div#statut-bdc span.bloc-statut-bdc { + border: solid 2px grey; + padding-left: 5px; + padding-right: 5px; + border-radius: 5px; +} + +div#statut-bdc ul { + display: flex; + flex-wrap: wrap; + padding: 0; + margin: 1.5rem 0; + gap: 0.1rem 1rem; +} + +div#statut-bdc li { + display: inline; + white-space: nowrap; +} + +div#statut-bdc .img-statut-bdc { + max-height: 1.3rem; +} diff --git a/atlas/static/custom/templates/statuts.html.sample b/atlas/static/custom/templates/statuts.html.sample new file mode 100644 index 000000000..ed55a3b13 --- /dev/null +++ b/atlas/static/custom/templates/statuts.html.sample @@ -0,0 +1,55 @@ +
+
    + {% for groupe in groupesStatuts %} + {% for statut in groupe.statuts %} + {% if statut.cd_type_statut == 'ZDET' %} +
  • + + {{ statut.label_statut }} + +
  • + {% elif statut.cd_type_statut[:2] == 'LR' %} + {% if statut.cd_type_statut == 'LRN' and 'Nicheur' in statut.rq_statut %} + {% set population = 'Nicheur' %} + {% elif statut.cd_type_statut == 'LRN' and 'Visiteur' in statut.rq_statut %} + {% set population = 'Visiteur' %} + {% elif statut.cd_type_statut == 'LRN' and 'Hivernant' in statut.rq_statut %} + {% set population = 'Hivernant' %} + {% endif %} + {% if population %} + {% set cd_type_statut = statut.cd_type_statut + population|first|lower %} + {% else %} + {% set cd_type_statut = statut.cd_type_statut %} + {% endif %} +
  • + + {{ cd_type_statut }} : + {{ statut.code_statut }} + +
  • + {% else %} +
  • + + {{ statut.cd_type_statut }} ({{ statut.cd_sig }}) : {{ statut.code_statut }} + +
  • + {% endif %} + {% endfor %} + {% endfor %} +
+
diff --git a/atlas/static/images/znieff_logo_small.png b/atlas/static/images/znieff_logo_small.png new file mode 100644 index 000000000..2ad47d6a7 Binary files /dev/null and b/atlas/static/images/znieff_logo_small.png differ diff --git a/atlas/templates/speciesSheet/identityCard.html b/atlas/templates/speciesSheet/identityCard.html index f54a82bc8..29f7b3b3b 100644 --- a/atlas/templates/speciesSheet/identityCard.html +++ b/atlas/templates/speciesSheet/identityCard.html @@ -38,41 +38,24 @@
{% endif %} -
- - {{ taxon.taxonSearch.group2_inpn }} - -
-
- {% if taxon.taxonSearch.nom_vern != None %} -

{{ taxon.taxonSearch.nom_vern }}

-

{{ taxon.taxonSearch.nom_complet_html|safe }}

- {% else %} -

{{ taxon.taxonSearch.nom_complet_html|safe }}

- {% endif %} - {% if taxon.taxonSearch.protection == 'oui' %} -
- - - {% endif %} - {% if configuration.DISPLAY_PATRIMONIALITE and taxon.taxonSearch.patrimonial in configuration.PATRIMONIALITE.config %} - - {% endif %} +
+
+
+ {% if taxon.taxonSearch.nom_vern != None %} +

{{ taxon.taxonSearch.nom_vern }}

+

{{ taxon.taxonSearch.nom_complet_html|safe }}

+ {% else %} +

{{ taxon.taxonSearch.nom_complet_html|safe }}

+ {% endif %} +
+ + {{ taxon.taxonSearch.group2_inpn }} + +
{% for taxon in taxonomyHierarchy %} @@ -91,14 +74,40 @@

{{ taxon.taxonSearch.nom_complet_html|safe }}

{% endfor %}
-