Skip to content

Commit ce998b1

Browse files
committed
ajout superficie dans chasse analyse détaillé
1 parent c6fb289 commit ce998b1

4 files changed

Lines changed: 83 additions & 0 deletions

File tree

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
"""add_superficie_to_t_zone_indicatives
2+
3+
Revision ID: 71ace03ca6a3
4+
Revises: bb34c60299a3
5+
Create Date: 2026-09-02 14:39:16.328394
6+
7+
"""
8+
9+
from alembic import op
10+
import sqlalchemy as sa
11+
12+
# revision identifiers, used by Alembic.
13+
revision = "71ace03ca6a3"
14+
down_revision = "bb34c60299a3"
15+
branch_labels = None
16+
depends_on = None
17+
18+
19+
def upgrade():
20+
op.execute(
21+
"ALTER TABLE oeasc_chasse.t_zone_indicatives "
22+
"ADD COLUMN IF NOT EXISTS superficie DOUBLE PRECISION"
23+
)
24+
25+
# Bien que la colonne geom soit typée SRID 4326 au niveau du modèle, les
26+
# géométries sont en réalité stockées projetées en Lambert-93 (EPSG:2154,
27+
# mètres) comme le reste des géométries oeasc_* de la base. ST_Area(geom)
28+
# renvoie donc directement une surface en m2, sans transformation.
29+
op.execute("""
30+
UPDATE oeasc_chasse.t_zone_indicatives
31+
SET superficie = ROUND((ST_Area(geom) / 10000)::numeric, 4)
32+
WHERE geom IS NOT NULL
33+
""")
34+
35+
36+
def downgrade():
37+
op.execute("""
38+
DO $$ BEGIN
39+
IF EXISTS (
40+
SELECT 1 FROM information_schema.tables
41+
WHERE table_schema = 'oeasc_chasse' AND table_name = 't_zone_indicatives'
42+
) THEN
43+
ALTER TABLE oeasc_chasse.t_zone_indicatives DROP COLUMN IF EXISTS superficie;
44+
END IF;
45+
END $$;
46+
""")

backend/oeasc/modules/oeasc/chasse/models.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ class TZoneIndicatives(CustomModel):
7474
)
7575

7676
geom: Mapped[object] = Column(Geometry("GEOMETRY", 4326))
77+
superficie: Mapped[float] = Column(Float)
7778

7879

7980
@serializable

backend/oeasc/modules/oeasc/chasse/repositories.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,37 @@ def chasse_get_infos():
213213
)
214214
)
215215

216+
#################################################################################################
217+
# Calcul de la superficie totale (en hectares) selon la même priorité que l'échelle :
218+
# zone indicative > zone cynégétique > secteur > Cœur (= tout le périmètre).
219+
if args["id_zone_indicative"]:
220+
select_superficie = select(
221+
func.coalesce(func.sum(TZoneIndicatives.superficie), 0)
222+
).where(TZoneIndicatives.id_zone_indicative.in_(args["id_zone_indicative"]))
223+
elif args["id_zone_cynegetique"]:
224+
select_superficie = select(
225+
func.coalesce(func.sum(TZoneIndicatives.superficie), 0)
226+
).where(TZoneIndicatives.id_zone_cynegetique.in_(args["id_zone_cynegetique"]))
227+
elif args["id_secteur"]:
228+
# ZI -> ZC -> Secteur (pas de FK directe ZI -> Secteur)
229+
select_superficie = (
230+
select(func.coalesce(func.sum(TZoneIndicatives.superficie), 0))
231+
.select_from(TZoneIndicatives)
232+
.join(
233+
TZoneCynegetiques,
234+
TZoneCynegetiques.id_zone_cynegetique
235+
== TZoneIndicatives.id_zone_cynegetique,
236+
)
237+
.where(TZoneCynegetiques.id_secteur.in_(args["id_secteur"]))
238+
)
239+
else:
240+
# Cœur : aucune zone sélectionnée -> superficie totale du périmètre OEASC
241+
select_superficie = select(
242+
func.coalesce(func.sum(TZoneIndicatives.superficie), 0)
243+
)
244+
245+
superficie = round(DB.session.scalar(select_superficie), 2)
246+
216247
# Récupération du nom de la saison à partir de son id
217248
select_saison = select(TSaisons.nom_saison).where(
218249
TSaisons.id_saison == args["id_saison"]
@@ -235,6 +266,7 @@ def chasse_get_infos():
235266
"nom_saison": nom_saison, # Nom de la saison sélectionnée
236267
"nom_espece": nom_espece, # Nom de l'espèce sélectionnée
237268
"echelle": echelle, # Texte décrivant l'échelle de la zone
269+
"superficie": superficie, # Superficie en hectares de la zone sélectionnée (ou totale)
238270
"last_5_id_saison": last_5_id_saisons, # Liste des 5 dernières saisons (id)
239271
"nom_saison": nom_saison, # (doublon, peut être nettoyé)
240272
**get_attribution_result(args), # Statistiques d'attribution/réalisation

frontend/src/modules/chasse/page-chasse-bilan-detaille.vue

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,10 @@
3434
<b>Echelle</b>
3535
: {{ infos.echelle }}
3636
</li>
37+
<li>
38+
<b>Superficie en ha</b>
39+
: {{ infos.superficie }}
40+
</li>
3741
<li>
3842
<b>Espèce</b>
3943
: {{ infos.nom_espece }}

0 commit comments

Comments
 (0)