summaryrefslogtreecommitdiff
path: root/archaeological_operations/models.py
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2025-09-26 16:38:26 +0200
committerÉtienne Loks <etienne.loks@iggdrasil.net>2025-09-29 17:54:01 +0200
commit4b9b29bb5b62df6e9982fed5c9e14dd9b68174b9 (patch)
tree3eda90e6536090906547e93024d79c9c55c2f571 /archaeological_operations/models.py
parent447c972cf4f9f99c02434b96097d0e914d96056c (diff)
downloadIshtar-4b9b29bb5b62df6e9982fed5c9e14dd9b68174b9.tar.bz2
Ishtar-4b9b29bb5b62df6e9982fed5c9e14dd9b68174b9.zip
✨ sheet operation: find statistics with number of remains
Diffstat (limited to 'archaeological_operations/models.py')
-rw-r--r--archaeological_operations/models.py73
1 files changed, 48 insertions, 25 deletions
diff --git a/archaeological_operations/models.py b/archaeological_operations/models.py
index 48bdfb450..614ee69aa 100644
--- a/archaeological_operations/models.py
+++ b/archaeological_operations/models.py
@@ -31,7 +31,7 @@ from django.contrib.gis.db.models.functions import Centroid
from django.contrib.postgres.indexes import GinIndex
from django.contrib.sites.models import Site
from django.db import transaction, OperationalError, IntegrityError
-from django.db.models import Q, Max
+from django.db.models import Q, Max, Sum
from django.db.models.signals import post_save, m2m_changed, post_delete
from django.forms import ValidationError
from django.urls import reverse, reverse_lazy
@@ -2500,12 +2500,26 @@ class Operation(
return q.count()
@property
- def nb_finds_by_material_type(self, update=False):
+ def nb_remains(self, update=False):
+ _("Number of remains")
+ return self._get_or_set_stats("_nb_remains", update)
+
+ def _nb_remains(self):
+ Find = apps.get_model("archaeological_finds", "Find")
+ q = Find.objects.filter(
+ base_finds__context_record__operation=self,
+ upstream_treatment_id__isnull=True,
+ find_number__isnull=False
+ ).distinct()
+ return q.aggregate(Sum("find_number"))["find_number__sum"]
+
+ @property
+ def nb_finds_by_material_type_full(self, update=False):
return self._get_or_set_stats(
- "_nb_finds_by_material_type", update, expected_type=list
+ "_nb_finds_by_material_type_full", update, expected_type=list
)
- def _nb_finds_by_material_type(self):
+ def _nb_finds_by_material_type_full(self):
Find = apps.get_model("archaeological_finds", "Find")
nbs = []
@@ -2520,23 +2534,26 @@ class Operation(
.order_by("material_types__label")
)
for res in q.all():
- nbs.append(
- (
- str(res["material_types__label"] or "-"),
- Find.objects.filter(
+ q2 = Find.objects.filter(
base_finds__context_record__operation=self,
upstream_treatment_id__isnull=True,
material_types__pk=res["material_types__pk"],
- ).count(),
+ )
+ q3 = q2.filter(find_number__isnull=False)
+ nbs.append(
+ (
+ str(res["material_types__label"] or "-"),
+ q2.count(),
+ q3.aggregate(Sum("find_number"))["find_number__sum"],
)
)
return nbs
@property
- def nb_finds_by_types(self, update=False):
- return self._get_or_set_stats("_nb_finds_by_types", update, expected_type=list)
+ def nb_finds_by_types_full(self, update=False):
+ return self._get_or_set_stats("_nb_finds_by_types_full", update, expected_type=list)
- def _nb_finds_by_types(self):
+ def _nb_finds_by_types_full(self):
Find = apps.get_model("archaeological_finds", "Find")
nbs = []
@@ -2550,25 +2567,28 @@ class Operation(
label = str(res["object_types__label"])
if label == "None":
label = str(_("No type"))
+ q2 = Find.objects.filter(
+ base_finds__context_record__operation=self,
+ upstream_treatment_id__isnull=True,
+ object_types=res["object_types"],
+ )
+ q3 = q2.filter(find_number__isnull=False)
nbs.append(
(
label,
- Find.objects.filter(
- base_finds__context_record__operation=self,
- upstream_treatment_id__isnull=True,
- object_types=res["object_types"],
- ).count(),
+ q2.count(),
+ q3.aggregate(Sum("find_number"))["find_number__sum"],
)
)
return nbs
@property
- def nb_finds_by_periods(self, update=False):
+ def nb_finds_by_periods_full(self, update=False):
return self._get_or_set_stats(
- "_nb_finds_by_periods", update, expected_type=list
+ "_nb_finds_by_periods_full", update, expected_type=list
)
- def _nb_finds_by_periods(self):
+ def _nb_finds_by_periods_full(self):
Find = apps.get_model("archaeological_finds", "Find")
nbs = []
@@ -2579,14 +2599,17 @@ class Operation(
.order_by("datings__period__order")
)
for res in q.all():
+ q2 = Find.objects.filter(
+ base_finds__context_record__operation=self,
+ upstream_treatment_id__isnull=True,
+ datings__period=res["datings__period"]
+ )
+ q3 = q2.filter(find_number__isnull=False)
nbs.append(
(
str(res["datings__period__label"] or "-"),
- Find.objects.filter(
- base_finds__context_record__operation=self,
- upstream_treatment_id__isnull=True,
- datings__period=res["datings__period"],
- ).count(),
+ q2.count(),
+ q3.aggregate(Sum("find_number"))["find_number__sum"],
)
)
return nbs