diff options
Diffstat (limited to 'archaeological_operations/models.py')
-rw-r--r-- | archaeological_operations/models.py | 73 |
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 |