diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2022-07-11 00:52:00 +0200 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2022-07-11 00:52:00 +0200 |
commit | 14d2b404f418045c05de8b310d7bc56456697442 (patch) | |
tree | 172baf27252b73d87e71d35f83c9a480b713a7b6 /archaeological_files | |
parent | caef7b0a7e90466f08f824b1076e1ba7c80add8c (diff) | |
download | Ishtar-14d2b404f418045c05de8b310d7bc56456697442.tar.bz2 Ishtar-14d2b404f418045c05de8b310d7bc56456697442.zip |
Preventive file: add extra field for export
Diffstat (limited to 'archaeological_files')
-rw-r--r-- | archaeological_files/models.py | 105 |
1 files changed, 103 insertions, 2 deletions
diff --git a/archaeological_files/models.py b/archaeological_files/models.py index 5881710e6..7d9391178 100644 --- a/archaeological_files/models.py +++ b/archaeological_files/models.py @@ -26,7 +26,7 @@ from django.contrib.gis.db import models from django.contrib.postgres.indexes import GinIndex from django.core.cache import cache from django.core.validators import MinValueValidator, MaxValueValidator -from django.db.models import Q, Count, Sum +from django.db.models import Q, Count, Sum, Max from django.db.models.signals import post_save, m2m_changed, post_delete from django.core.urlresolvers import reverse from ishtar_common.utils import ugettext_lazy as _, pgettext_lazy @@ -188,6 +188,13 @@ ES_UNITS = ( DCT_ES_UNITS = dict(ES_UNITS) +ES_UNITS_DAYS = { + "D": 1, + "W": 7, + "M": 30, + "L": 0 +} + class EquipmentServiceCost(models.Model): price_agreement = models.ForeignKey( @@ -719,6 +726,14 @@ class File( "general_contractor_address_2", "general_contractor_address_3", "get_locality", + "excavation_working_time_planned", + "excavation_working_time_worked", + "study_working_time_planned", + "study_working_time_worked", + "excavation_average_team_planned", + "excavation_average_team_worked", + "study_average_team_planned", + "study_average_team_worked", ] class Meta: @@ -914,11 +929,49 @@ class File( ) return cls._return_get_owns(owns, values, get_short_menu_class) + def get_dynamic_values(self, prefix, values, filtr=None): + q = GenericEquipmentServiceType.objects.filter(available=True) + for equipment_service in q.all(): + pk = equipment_service.pk + #if not filtr or not any( + # key for f in filtr if f.startswith(prefix + key) + #): + q = self.equipment_costs.filter( + equipment_service_cost__equipment_service_type__generic_equipment_type_id=pk, + equipment_service_cost__unit__isnull=False, + ).exclude( + equipment_service_cost__unit__in=("L", ""), # exclude linear meter + ) + slug = equipment_service.txt_idx.replace("-", "_") + key_time_planned = slug + "_equipment_time_planned" + values[prefix + key_time_planned] = 0 + key_time_worked = slug + "_equipment_time_worked" + values[prefix + key_time_worked] = 0 + key_qt_planned = slug + "_equipment_sum_planned" + values[prefix + key_qt_planned] = 0 + key_qt_worked = slug + "_equipment_sum_worked" + values[prefix + key_qt_worked] = 0 + for cost in q.all(): + values[prefix + key_qt_planned] += (cost.quantity_by_day_planned or 0) + values[prefix + key_qt_worked] += (cost.quantity_by_day_worked or 0) + print() + value = ES_UNITS_DAYS[cost.equipment_service_cost.unit] * ( + cost.days_planned or 0) + if value > values[prefix + key_time_planned]: + values[prefix + key_time_planned] = value + value = ES_UNITS_DAYS[cost.equipment_service_cost.unit] * ( + cost.days_worked or 0) + if value > values[prefix + key_time_planned]: + values[prefix + key_time_worked] = value + return values + def get_values(self, prefix="", no_values=False, filtr=None, **kwargs): values = super(File, self).get_values( prefix=prefix, no_values=no_values, filtr=filtr, **kwargs ) - return get_values_town_related(self, prefix, values, filtr=filtr) + values = get_values_town_related(self, prefix, values, filtr=filtr) + values = self.get_dynamic_values(prefix, values, filtr=filtr) + return values def render_parcels(self): Parcel = apps.get_model("archaeological_operations", "Parcel") @@ -1070,6 +1123,54 @@ class File( return True @property + def excavation_working_time_planned(self): + return self.ground_jobs.all().aggregate(Max("days_planned"))["days_planned__max"] or 0 + + @property + def study_working_time_planned(self): + return self.jobs.all().aggregate(Max("days_planned"))["days_planned__max"] or 0 + + @property + def excavation_working_time_worked(self): + return self.ground_jobs.all().aggregate(Max("days_worked"))["days_worked__max"] or 0 + + @property + def study_working_time_worked(self): + return self.jobs.all().aggregate(Max("days_worked"))["days_worked__max"] or 0 + + @property + def excavation_average_team_planned(self): + return round( + sum([(job.man_by_day_planned or 0) * (job.days_planned or 0) + for job in self.ground_jobs.all()]) / + (self.excavation_working_time_planned or 1) + ) + + @property + def excavation_average_team_worked(self): + return round( + sum([(job.man_by_day_worked or 0) * (job.days_worked or 0) + for job in self.ground_jobs.all()]) / + (self.excavation_working_time_worked or 1) + ) + + @property + def study_average_team_planned(self): + return round( + sum([(job.man_by_day_planned or 0) * (job.days_planned or 0) + for job in self.jobs.all()]) / + (self.study_working_time_planned or 1) + ) + + @property + def study_average_team_worked(self): + return round( + sum([(job.man_by_day_worked or 0) * (job.days_worked or 0) + for job in self.jobs.all()]) / + (self.study_working_time_worked or 1) + ) + + @property def job_cost_planned(self): return sum(job.cost_planned for job in self.jobs.all()) |