diff options
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 |
commit | aef3dfa74b0e2a0a7563d4798ebcf6b0f9998b02 (patch) | |
tree | 8cab67c39be48d93c3b571b2fe8aa620ac9ecf25 | |
parent | a95c19bc58e1ce57ef50ba56d18969ee51c2edc4 (diff) | |
download | Ishtar-aef3dfa74b0e2a0a7563d4798ebcf6b0f9998b02.tar.bz2 Ishtar-aef3dfa74b0e2a0a7563d4798ebcf6b0f9998b02.zip |
🐛 archaeological files sheet: fix preventive formset equipment service order (refs #6173)
-rw-r--r-- | archaeological_files/forms.py | 5 | ||||
-rw-r--r-- | archaeological_files/models.py | 33 |
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 |