diff --git a/loko/assets/migrations/0031_naturetree_amenity_value_and_more.py b/loko/assets/migrations/0031_naturetree_amenity_value_and_more.py new file mode 100644 index 0000000..07f9885 --- /dev/null +++ b/loko/assets/migrations/0031_naturetree_amenity_value_and_more.py @@ -0,0 +1,108 @@ +# Generated by Django 6.0.7 on 2026-10-07 15:23 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('assets', '0030_managementzone_managementzonedocument_and_more'), + ] + + operations = [ + migrations.AddField( + model_name='naturetree', + name='amenity_value', + field=models.FloatField(blank=True, null=True, verbose_name="Valeur d'aménité (€)"), + ), + migrations.AddField( + model_name='naturetree', + name='biodiversity_index', + field=models.FloatField(blank=True, null=True, verbose_name='Indice de biodiversité'), + ), + migrations.AddField( + model_name='naturetree', + name='carbon_stock', + field=models.FloatField(blank=True, null=True, verbose_name='Stock de carbone (t CO2)'), + ), + migrations.AddField( + model_name='naturetree', + name='cooling_energy_indicator', + field=models.FloatField(blank=True, null=True, verbose_name='Énergie de refroidissement (kWh)'), + ), + migrations.AddField( + model_name='naturetree', + name='cooling_indicator', + field=models.FloatField(blank=True, null=True, verbose_name='Indice de rafraîchissement'), + ), + migrations.AddField( + model_name='naturetree', + name='cultivar', + field=models.CharField(blank=True, max_length=100, null=True, verbose_name='Cultivar / Variété'), + ), + migrations.AddField( + model_name='naturetree', + name='death_date', + field=models.DateField(blank=True, null=True, verbose_name='Date de dépérissement / mort'), + ), + migrations.AddField( + model_name='naturetree', + name='genus', + field=models.CharField(blank=True, max_length=100, null=True, verbose_name='Genre botanique'), + ), + migrations.AddField( + model_name='naturetree', + name='is_chronoxyle', + field=models.BooleanField(default=False, verbose_name='Arbre sénescent / Chronoxyle (bois mort sur pied)'), + ), + migrations.AddField( + model_name='naturetree', + name='is_dead', + field=models.BooleanField(default=False, verbose_name='Arbre mort'), + ), + migrations.AddField( + model_name='naturetree', + name='is_stump', + field=models.BooleanField(default=False, verbose_name='Souche'), + ), + migrations.AddField( + model_name='naturetree', + name='management_type', + field=models.CharField(blank=True, choices=[('municipal', 'Communal (Régie communale)'), ('regional', 'Régional (Bruxelles Mobilité / Région)'), ('community', 'Intercommunal / Autre pouvoir public'), ('private', 'Privé / Tiers')], default='municipal', max_length=50, null=True, verbose_name='Type de gestionnaire'), + ), + migrations.AddField( + model_name='naturetree', + name='managing_authority', + field=models.CharField(blank=True, max_length=200, null=True, verbose_name='Autorité gestionnaire'), + ), + migrations.AddField( + model_name='naturetree', + name='number_of_trunks', + field=models.IntegerField(blank=True, default=1, null=True, verbose_name='Nombre de troncs / Cépée'), + ), + migrations.AddField( + model_name='naturetree', + name='plantation_coefficient', + field=models.FloatField(blank=True, null=True, verbose_name='Coefficient de plantation'), + ), + migrations.AddField( + model_name='naturetree', + name='planting_date', + field=models.DateField(blank=True, null=True, verbose_name='Date de plantation réelle'), + ), + migrations.AddField( + model_name='naturetree', + name='scientific_name', + field=models.CharField(blank=True, max_length=200, null=True, verbose_name='Nom scientifique / latin'), + ), + migrations.AddField( + model_name='naturetree', + name='situation_coefficient', + field=models.FloatField(blank=True, null=True, verbose_name='Coefficient de situation'), + ), + migrations.AddField( + model_name='naturetree', + name='vernacular_name', + field=models.CharField(blank=True, max_length=200, null=True, verbose_name='Nom vernaculaire / Essence'), + ), + ] diff --git a/loko/assets/models/nature.py b/loko/assets/models/nature.py index f65b28d..668d11c 100644 --- a/loko/assets/models/nature.py +++ b/loko/assets/models/nature.py @@ -146,6 +146,13 @@ TREE_PRUNING_CHOICES = [ ('none', _("Non taillé / Entretien minimal")), ] +TREE_MANAGEMENT_TYPE_CHOICES = [ + ('municipal', _("Communal (Régie communale)")), + ('regional', _("Régional (Bruxelles Mobilité / Région)")), + ('community', _("Intercommunal / Autre pouvoir public")), + ('private', _("Privé / Tiers")), +] + BULB_TYPE_CHOICES = [ ('tulipes', _('Tulipes')), @@ -224,6 +231,37 @@ class NatureTree(AbstractGeoAsset): pruning_frequency_years = models.IntegerField(null=True, blank=True, verbose_name=_("Périodicité de taille (années)")) last_pruning_date = models.DateField(null=True, blank=True, verbose_name=_("Dernière taille / élagage")) + # Gestionnaire & Compétence + managing_authority = models.CharField(max_length=200, null=True, blank=True, verbose_name=_("Autorité gestionnaire")) + management_type = models.CharField(max_length=50, choices=TREE_MANAGEMENT_TYPE_CHOICES, default='municipal', null=True, blank=True, verbose_name=_("Type de gestionnaire")) + + # Taxonomie & Botanique + vernacular_name = models.CharField(max_length=200, null=True, blank=True, verbose_name=_("Nom vernaculaire / Essence")) + scientific_name = models.CharField(max_length=200, null=True, blank=True, verbose_name=_("Nom scientifique / latin")) + genus = models.CharField(max_length=100, null=True, blank=True, verbose_name=_("Genre botanique")) + cultivar = models.CharField(max_length=100, null=True, blank=True, verbose_name=_("Cultivar / Variété")) + + # Dendrométrie & Morphologie complémentaire + number_of_trunks = models.IntegerField(null=True, blank=True, default=1, verbose_name=_("Nombre de troncs / Cépée")) + + # Éco-services & Valeur patrimoniale (Indicateurs écosystémiques) + amenity_value = models.FloatField(null=True, blank=True, verbose_name=_("Valeur d'aménité (€)")) + carbon_stock = models.FloatField(null=True, blank=True, verbose_name=_("Stock de carbone (t CO2)")) + cooling_indicator = models.FloatField(null=True, blank=True, verbose_name=_("Indice de rafraîchissement")) + cooling_energy_indicator = models.FloatField(null=True, blank=True, verbose_name=_("Énergie de refroidissement (kWh)")) + biodiversity_index = models.FloatField(null=True, blank=True, verbose_name=_("Indice de biodiversité")) + + # Évaluation patrimoniale & Barème + situation_coefficient = models.FloatField(null=True, blank=True, verbose_name=_("Coefficient de situation")) + plantation_coefficient = models.FloatField(null=True, blank=True, verbose_name=_("Coefficient de plantation")) + + # Statut biologique particulier + is_dead = models.BooleanField(default=False, verbose_name=_("Arbre mort")) + is_stump = models.BooleanField(default=False, verbose_name=_("Souche")) + is_chronoxyle = models.BooleanField(default=False, verbose_name=_("Arbre sénescent / Chronoxyle (bois mort sur pied)")) + death_date = models.DateField(null=True, blank=True, verbose_name=_("Date de dépérissement / mort")) + planting_date = models.DateField(null=True, blank=True, verbose_name=_("Date de plantation réelle")) + # Références des choix pour utilisation simple dans les templates DEVELOPMENT_STAGE_CHOICES = TREE_DEVELOPMENT_STAGE_CHOICES VITALITY_CHOICES = TREE_VITALITY_CHOICES @@ -233,6 +271,7 @@ class NatureTree(AbstractGeoAsset): PIT_TYPE_CHOICES = TREE_PIT_TYPE_CHOICES PROTECTION_CHOICES = TREE_PROTECTION_CHOICES PRUNING_CHOICES = TREE_PRUNING_CHOICES + MANAGEMENT_TYPE_CHOICES = TREE_MANAGEMENT_TYPE_CHOICES indexes = [ models.Index(fields=["code"]), diff --git a/loko/assets/templates/assets/nature_index.html b/loko/assets/templates/assets/nature_index.html index 55bd964..6dcb422 100644 --- a/loko/assets/templates/assets/nature_index.html +++ b/loko/assets/templates/assets/nature_index.html @@ -64,6 +64,16 @@ {% endfor %} +
| {% translate "Nombre de troncs (cépée)" %} | +
+
+
+ {% if asset.number_of_trunks and asset.number_of_trunks > 1 %}
+ {{ asset.number_of_trunks }} {% translate "troncs" %}
+ {% else %}
+ 1 {% translate "(tronc unique)" %}
+ {% endif %}
+
+
+
+
+
+ |
+ |||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| {% translate "Hauteur totale (m)" %} | @@ -518,6 +656,173 @@ +{# ── CARTE ÉCO-SERVICES & VALEUR PATRIMONIALE (GRALITY / BARÈME DE L'ARBRE) ── #} +
| {% translate "Énergie de refroidissement (kWh)" %} | +
+
+
+ {% if asset.cooling_energy_indicator %}
+ {{ asset.cooling_energy_indicator|floatformat:1 }} kWh
+ {% else %}
+ -
+ {% endif %}
+
+
+
+
+
+ |
+
|---|---|
| {% translate "Coefficient de situation (barème)" %} | +
+ {{ asset.situation_coefficient|default:"-" }}
+
+
+
+ |
+
| {% translate "Coefficient de plantation (barème)" %} | +
+ {{ asset.plantation_coefficient|default:"-" }}
+
+
+
+ |
+
| {% translate "Date de plantation constatée" %} | +
+
+
+ {% if asset.planting_date %}
+ {{ asset.planting_date|date:"d/m/Y" }}
+ {% else %}
+ -
+ {% endif %}
+
+
+
+
+
+ |
+
| {% translate "Date de mort / dépérissement" %} | +
+
+
+ {% if asset.death_date %}
+ {{ asset.death_date|date:"d/m/Y" }}
+ {% else %}
+ -
+ {% endif %}
+
+
+
+
+
+ |
+