diff options
| -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()) | 
