Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feat/ajout statuts fiche espece #594

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
55 changes: 55 additions & 0 deletions atlas/atlasRoutes.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
vmCorTaxonAttribut,
vmTaxonsMostView,
vmCorTaxonOrganismRepository,
vmStatutBdcRepository,
)


Expand Down Expand Up @@ -297,6 +298,10 @@ 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)
groupes_statuts_have_labels = any([groupe.get("label") for groupe in groupes_statuts])

connection.close()
db_session.close()
return render_template(
Expand All @@ -319,9 +324,59 @@ def ficheEspece(cd_nom):
taxonDescription=taxonDescription,
observers=observers,
organisms=organisms,
groupesStatuts=groupes_statuts,
groupesStatutsHaveLabels=groupes_statuts_have_labels,
)


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):
for filter_item in groupe["filters"]:
if filter_item.get("cd_type_statut"):
has_valid_type = statut["cd_type_statut"] == filter_item.get("cd_type_statut")
else:
has_valid_type = True

if filter_item.get("cd_sig"):
has_valid_sig = statut["cd_sig"] == filter_item.get("cd_sig")
else:
has_valid_sig = True

if has_valid_type and has_valid_sig:
return True
else:
return False

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("/area/<id_area>", methods=["GET", "POST"])
def ficheArea(id_area):
session = db.session
Expand Down
39 changes: 39 additions & 0 deletions atlas/configuration/config.py.example
Original file line number Diff line number Diff line change
Expand Up @@ -240,6 +240,45 @@ COLOR_PIE_CHARTS = [
"#0B5563",
"#54DEFD",
]
# 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 filters 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 de ce groupe. '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",
"filters": [
{"cd_type_statut": "LRM", "cd_sig": "WORLD"}
]
},
{
"label": "Europe",
"filters": [
{"cd_type_statut": "LRE", "cd_sig": "EUROPE"}
]
},
{
"label": "France métropolitaine",
"filters": [
{"cd_type_statut": "LRN", "cd_sig": "TERFXFR"}
]
},
{
"label": "Région",
"filters": [
{"cd_type_statut": "LRR", "cd_sig": <votre code région>} # par exemple "INSEER52"
]
},
{
"filters": [
{"cd_type_statut": "ZDET", "cd_sig": <votre code département>} # 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

Expand Down
13 changes: 13 additions & 0 deletions atlas/configuration/config_schema.py
Original file line number Diff line number Diff line change
Expand Up @@ -161,6 +161,18 @@ class Meta:
COLOR_STACKED_BAR_CHARTS = fields.List(
fields.String(), load_default=["#E1CE7A", "#FBFFB9", "#FDD692"]
)
AFFICHAGE_STATUTS = fields.Boolean(load_default=True)
GROUPES_STATUTS = fields.List(
fields.Dict,
load_default=[
{"label": "Monde", "filters": [{"cd_type_statut": "LRM", "cd_sig": "WORLD"}]},
{"label": "Europe", "filters": [{"cd_type_statut": "LRE", "cd_sig": "EUROPE"}]},
{
"label": "France métropolitaine",
"filters": [{"cd_type_statut": "LRN", "cd_sig": "TERFXFR"}],
},
],
)

COLOR_PIE_CHARTS = fields.List(
fields.String(),
Expand Down Expand Up @@ -260,6 +272,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
Expand Down
19 changes: 19 additions & 0 deletions atlas/modeles/repositories/vmStatutBdcRepository.py
Original file line number Diff line number Diff line change
@@ -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
142 changes: 142 additions & 0 deletions atlas/static/css/ficheEspece.css
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,19 @@ p.imgDescription.main {
margin-top: 15px;
}

#taxonName {
display: flex;
justify-content: space-between;
}

#statuts-and-links-container {
display: flex;
align-items: center;
gap: 1.2rem;
justify-content: start;
margin: 1.5rem 0;
}

.nav>li>a {
padding: 10px 7px;
}
Expand Down Expand Up @@ -334,3 +347,132 @@ text {
#organisms>ul h3 {
font-size: 1.5rem;
}

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 {
margin: 1.5rem 0;
}

div#statut-bdc span.bloc-statut-bdc {
border: solid 2px grey;
padding-left: 5px;
padding-right: 5px;
border-radius: 5px;
}

/* statuts groupes sans labels : tout inline avec espacement margin */

div#statut-bdc ul.groupes-list.without-labels,
div#statut-bdc ul.groupes-list.without-labels ul.statuts-list {
display: inline;
margin: 0;
padding: 0;
}

div#statut-bdc ul.groupes-list.without-labels > li {
display: inline;
}

div#statut-bdc ul.groupes-list.without-labels span.groupe-label {
white-space: nowrap;
}

div#statut-bdc ul.groupes-list.without-labels {
margin-right: 1rem;
}

div#statut-bdc ul.groupes-list.without-labels ul.statuts-list > li {
margin-right: 1rem;
white-space: nowrap;
}

/* statuts groupes avec labels : display flex avec espacement gap*/

div#statut-bdc ul.groupes-list.with-labels,
div#statut-bdc ul.groupes-list.with-labels ul.statuts-list {
display: flex;
flex-wrap: wrap;
margin: 0;
padding: 0;
gap: 0.5rem 1.3rem;
}

div#statut-bdc ul.groupes-list.with-labels > li {
display: flex;
flex-wrap: wrap;
gap: 0 0.4rem;
}

div#statut-bdc ul.groupes-list.with-labels {
gap: 0.5rem 1.3rem;
}

div#statut-bdc ul.groupes-list.with-labels ul.statuts-list {
gap: 0.2rem 1.3rem;
}


div#statut-bdc ul.statuts-list li {
display: inline;
}

div#statut-bdc .img-statut-bdc {
max-height: 1.3rem;
}
62 changes: 62 additions & 0 deletions atlas/static/custom/templates/statuts.html.sample
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
<div id="statut-bdc">
<ul class="groupes-list {% if groupesStatutsHaveLabels %}with-labels{% else %}without-labels{% endif %}">
{% for groupe in groupesStatuts %}
<li>
{% if groupe.label %}
<span class="groupe-label"><strong>{{ groupe.label }}</strong></span>
{% endif %}
<ul class="statuts-list">
{% for statut in groupe.statuts %}
{% if statut.cd_type_statut == 'ZDET' %}
<li>
<span
data-toggle='tooltip'
data-placement='right'
data-original-title="{{ statut.lb_type_statut }} ({{ statut.lb_adm_tr }}) : {{ statut.label_statut }}"
>
<img
class="img-statut-bdc"
alt="{{ statut.label_statut }}"
src="{{ url_for('static', filename='images/znieff_logo_small.png') }}">
</span>
</li>
{% elif statut.cd_type_statut[:2] == 'LR' %}
{% if 'Nicheur' in statut.rq_statut or 'nicheur' in statut.rq_statut %}
{% set population = 'Nicheur' %}
{% elif 'Visiteur' in statut.rq_statut or 'visiteur' in statut.rq_statut %}
{% set population = 'Visiteur' %}
{% elif 'Hivernant' in statut.rq_statut or '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 %}
<li>
<span
data-toggle='tooltip'
data-placement='right'
data-original-title="{{ statut.lb_type_statut }} ({{ statut.lb_adm_tr }}{% if population %}{{ ' - ' + population }}{% endif %}) : {{ statut.label_statut }}"
>
{{ cd_type_statut }} :
<span class="{{ statut.code_statut }} bloc-statut-bdc">{{ statut.code_statut }}</span>
</span>
</li>
{% else %}
<li>
<span
data-toggle='tooltip'
data-placement='right'
data-original-title="{{ statut.lb_type_statut }} ({{ statut.lb_adm_tr }}) : {{ statut.label_statut }}"
>
<span class="bloc-statut-bdc">{{ statut.cd_type_statut }} ({{ statut.cd_sig }}) : {{ statut.code_statut }}</span>
</span>
</li>
{% endif %}
{% endfor %}
</ul> <!-- end of statuts list -->
</li>
{% endfor %}
</ul> <!-- end of groupes list -->
</div>
Binary file added atlas/static/images/znieff_logo_small.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading