summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
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
commita91fea6542cd6ab8dd0b5e22dc87bab10c1b1cec (patch)
tree172baf27252b73d87e71d35f83c9a480b713a7b6
parent8935c2bd0ecade7dda1b877e28ad0ae56e216323 (diff)
downloadIshtar-a91fea6542cd6ab8dd0b5e22dc87bab10c1b1cec.tar.bz2
Ishtar-a91fea6542cd6ab8dd0b5e22dc87bab10c1b1cec.zip
Preventive file: add extra field for export
-rw-r--r--archaeological_files/models.py105
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())