diff options
-rw-r--r-- | archaeological_files/models.py | 95 | ||||
-rw-r--r-- | ishtar_common/utils.py | 9 |
2 files changed, 103 insertions, 1 deletions
diff --git a/archaeological_files/models.py b/archaeological_files/models.py index c0b668514..04a4ccc2c 100644 --- a/archaeological_files/models.py +++ b/archaeological_files/models.py @@ -31,7 +31,7 @@ from django.db.models.signals import post_save, m2m_changed, post_delete from django.urls import reverse from ishtar_common.models_common import OrderedHierarchicalType -from ishtar_common.utils import ugettext_lazy as _, pgettext_lazy, get_current_profile +from ishtar_common.utils import ugettext_lazy as _, pgettext_lazy, get_current_profile, InlineClass from ishtar_common.utils import ( cached_label_changed, @@ -1072,9 +1072,99 @@ class File( values[prefix + key_time_worked] = value return values + @property + def montant_subvention_dotation(self): + """ + France specific value used by templates + """ + if not self.operation_type_for_royalties or not self.total_developed_surface: + return + return (self.total_developed_surface or 0) * ( + self.operation_type_for_royalties.increased_final_value or 0) + + @property + def jobs_list_permanent(self): + return self.jobs_list() + + @property + def jobs_list_non_permanent(self): + return self.jobs_list(permanent=False) + + def jobs_list(self, permanent=True): + jobs = {} + total_ground_cost_planned = 0 + total_ground_cost_worked = 0 + for job in self.ground_jobs.filter(job__permanent_contract=permanent).all(): + name = job.job.label + ground_cost_total = ( + (job.man_by_day_planned or 0) * (job.days_planned or 0) * + (job.cost_planned or 0) + ) + total_ground_cost_planned += ground_cost_total + ground_cost_total_worked = ( + (job.man_by_day_worked or 0) * (job.days_worked or 0) * + (job.cost_worked or 0) + ) + total_ground_cost_worked += ground_cost_total_worked + jobs[name] = { + "ground_man_by_day_planned": job.man_by_day_planned, + "ground_days_planned": job.days_planned, + "ground_cost_planned": job.cost_planned, + "ground_cost_total_planned": ground_cost_total or "", + "ground_man_by_day_worked": job.man_by_day_worked, + "ground_days_worked": job.days_worked, + "ground_cost_worked": job.cost_worked, + "ground_cost_total_worked": ground_cost_total_worked or "", + } + total_cost_planned = 0 + total_cost_worked = 0 + for job in self.jobs.filter(job__permanent_contract=permanent).all(): + name = job.job.label + if name not in jobs: + jobs[name] = {} + cost_total_planned = ( + (job.man_by_day_planned or 0) * (job.days_planned or 0) * + (job.cost_planned or 0) + ) + total_cost_planned += cost_total_planned + cost_total_worked = ( + (job.man_by_day_worked or 0) * (job.days_worked or 0) * + (job.cost_worked or 0) + ) + total_cost_worked += cost_total_worked + jobs[name].update({ + "man_by_day_planned": job.man_by_day_planned, + "days_planned": job.days_planned, + "cost_planned": job.cost_planned, + "cost_total_planned": cost_total_planned or "", + "man_by_day_worked": job.man_by_day_worked, + "days_worked": job.days_worked, + "cost_worked": job.cost_worked, + "cost_total_worked": cost_total_worked or "", + }) + result = [] + for k in jobs: + dct = jobs[k] + dct["name"] = k + result.append(InlineClass(dct)) + return result, total_ground_cost_planned, total_ground_cost_worked, \ + total_cost_planned, total_cost_worked + def get_extra_values(self, prefix="", no_values=False, filtr=None, **kwargs): values = get_values_town_related(self, prefix, {}, filtr=filtr) values = self.get_dynamic_values(prefix, values, filtr=filtr) + values["montant_subvention_dotation"] = self.montant_subvention_dotation + values["jobs_list_permanent"], values["permanent_ground_cost_planned"], \ + values["permanent_ground_cost_worked"], \ + values["permanent_cost_planned"], \ + values["permanent_cost_worked"] = self.jobs_list_permanent + values["jobs_list_non_permanent"], values["non_permanent_ground_cost_planned"], \ + values["non_permanent_ground_cost_worked"], \ + values["non_permanent_cost_planned"], \ + values["non_permanent_cost_worked"] = self.jobs_list_non_permanent + values["used_equipments"] = self.used_equipments + values["equipments_cost_planned"] = sum([cost for _1, cost, _2, _3, _4 in self.used_equipments]) + values["equipments_cost_worked"] = sum([cost for _1, _2, cost, _3, _4 in self.used_equipments]) return values def render_parcels(self): @@ -1303,6 +1393,9 @@ class File( @property def used_equipments(self): + """ + -> [("Engins mécaniques", cost_planned, cost_worked, diff planned - worked, [cost1, cost2, ...])] + """ equipments = [] service_types = list(GenericEquipmentServiceType.objects.all()) for service_type in service_types: diff --git a/ishtar_common/utils.py b/ishtar_common/utils.py index 9aee643c4..bca7ce181 100644 --- a/ishtar_common/utils.py +++ b/ishtar_common/utils.py @@ -108,6 +108,15 @@ def debug_line_no(): return currentframe().f_back.f_lineno +class InlineClass: + """ + Dynamic class used in templates + """ + def __init__(self, dct): + for k in dct: + setattr(self, k, dct[k]) + + def fake_task(*args): def fake(func): return func |