summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2025-02-14 14:46:17 +0100
committerÉtienne Loks <etienne.loks@iggdrasil.net>2025-02-14 14:46:17 +0100
commitaef3dfa74b0e2a0a7563d4798ebcf6b0f9998b02 (patch)
tree8cab67c39be48d93c3b571b2fe8aa620ac9ecf25
parenta95c19bc58e1ce57ef50ba56d18969ee51c2edc4 (diff)
downloadIshtar-aef3dfa74b0e2a0a7563d4798ebcf6b0f9998b02.tar.bz2
Ishtar-aef3dfa74b0e2a0a7563d4798ebcf6b0f9998b02.zip
🐛 archaeological files sheet: fix preventive formset equipment service order (refs #6173)
-rw-r--r--archaeological_files/forms.py5
-rw-r--r--archaeological_files/models.py33
2 files changed, 35 insertions, 3 deletions
diff --git a/archaeological_files/forms.py b/archaeological_files/forms.py
index 4c7feaa04..6c18d675c 100644
--- a/archaeological_files/forms.py
+++ b/archaeological_files/forms.py
@@ -1085,6 +1085,11 @@ class PreventiveFileEquipmentServiceBaseFormSet(FileBaseFormset):
queryset = queryset.filter(q).order_by("-equipment_service_cost__parent")
return queryset
+ def get_queryset(self):
+ if getattr(self, "__costs", None):
+ return self.__costs
+ return self.model.get_sorted_costs(self.get_base_queryset())
+
class AdministrativeActFileModifySelect(TableSelect):
_model = AdministrativeAct
diff --git a/archaeological_files/models.py b/archaeological_files/models.py
index c27086d34..5e586aa28 100644
--- a/archaeological_files/models.py
+++ b/archaeological_files/models.py
@@ -1520,12 +1520,18 @@ class File(
equipments = []
service_types = list(GenericEquipmentServiceType.objects.all())
for service_type in service_types:
- q = self.equipment_costs.filter(
- equipment_service_cost__equipment_service_type__generic_equipment_type=service_type)
+ query = Q(
+ equipment_service_cost__equipment_service_type__generic_equipment_type=service_type,
+ equipment_service_cost__parent__isnull=True
+ ) | Q(
+ equipment_service_cost__parent__generic_equipment_type=service_type
+ )
+ q = self.equipment_costs.filter(query)
if not q.count():
continue
equipments.append([service_type.label, 0, 0, 0, []])
- for cost in q.all():
+
+ for cost in PreventiveFileEquipmentServiceCost.get_sorted_costs(q):
equipments[-1][-4] += cost.cost_planned
equipments[-1][-3] += cost.cost_worked
equipments[-1][-1].append(cost)
@@ -1772,3 +1778,24 @@ class PreventiveFileEquipmentServiceCost(models.Model):
@property
def cost_worked(self):
return (self.equipment_service_cost.unitary_cost or 0) * self.quantity_worked
+
+ @classmethod
+ def get_sorted_costs(cls, query, values=None):
+ # group costs by parents in order to sort
+ costs = {}
+ for cost in query.all():
+ ec = cost.equipment_service_cost
+ et = ec.equipment_service_type
+ if ec.parent_id:
+ key = ec.parent_id
+ else:
+ key = et.id
+ if key not in costs:
+ costs[key] = []
+ costs[key].append((ec.id if ec.parent_id else 0, cost))
+
+ cost_list = []
+ for key in costs:
+ for __, cost in sorted(costs[key], key=lambda x: x[0]):
+ cost_list.append(cost)
+ return cost_list