diff options
Diffstat (limited to 'archaeological_files/models.py')
| -rw-r--r-- | archaeological_files/models.py | 80 | 
1 files changed, 76 insertions, 4 deletions
| diff --git a/archaeological_files/models.py b/archaeological_files/models.py index db33ed9b2..b3dd99edf 100644 --- a/archaeological_files/models.py +++ b/archaeological_files/models.py @@ -1,6 +1,6 @@  #!/usr/bin/env python  # -*- coding: utf-8 -*- -# Copyright (C) 2012-2013 Étienne Loks  <etienne.loks_AT_peacefrogsDOTnet> +# Copyright (C) 2012-2014 Étienne Loks  <etienne.loks_AT_peacefrogsDOTnet>  # This program is free software: you can redistribute it and/or modify  # it under the terms of the GNU Affero General Public License as @@ -21,15 +21,16 @@ import datetime  from django.conf import settings  from django.contrib.gis.db import models +from django.core.cache import cache  from django.db.models import Q, Count, Sum  from django.db.models.signals import post_save, m2m_changed  from django.utils.translation import ugettext_lazy as _, ugettext -from ishtar_common.utils import cached_label_changed +from ishtar_common.utils import cached_label_changed, get_cache  from ishtar_common.models import GeneralType, BaseHistorizedItem, \      HistoricalRecords, OwnPerms, Person, Organization, Department, Town, \ -    Dashboard, IshtarUser, ValueGetter +    Dashboard, IshtarUser, ValueGetter, ShortMenuItem  class FileType(GeneralType):      class Meta: @@ -60,7 +61,7 @@ if settings.COUNTRY == 'fr':              verbose_name_plural = u"Types Saisine"              ordering = ('label',) -class File(BaseHistorizedItem, OwnPerms, ValueGetter): +class File(BaseHistorizedItem, OwnPerms, ValueGetter, ShortMenuItem):      TABLE_COLS = ['numeric_reference', 'year', 'internal_reference',                    'file_type', 'saisine_type', 'towns', ]      year = models.IntegerField(_(u"Year"), @@ -162,6 +163,71 @@ class File(BaseHistorizedItem, OwnPerms, ValueGetter):      def short_class_name(self):          return _(u"FILE") +    @property +    def delay_date(self): +        cache_key, val = get_cache(self.__class__, [self.pk, 'delay_date']) +        if val: +            return val +        return self.update_delay_date(cache_key) + +    def update_delay_date(self, cache_key=None): +        if not cache_key: +            cache_key, val = get_cache(self.__class__, +                                       [self.pk, 'delay_date']) +        date = self.reception_date +        if not date: +            date = datetime.date(2500, 1, 1) +        elif settings.COUNTRY == 'fr' and self.saisine_type \ +           and self.saisine_type.delay: +            date += datetime.timedelta(days=self.saisine_type.delay) +        cache.set(cache_key, date, settings.CACHE_TIMEOUT) +        return date + +    @property +    def has_adminact(self): +        cache_key, val = get_cache(self.__class__, [self.pk, +                                                    'has_adminact']) +        if val: +            return val +        return self.update_has_admin_act(cache_key) + +    def update_has_admin_act(self, cache_key=None): +        if not cache_key: +            cache_key, val = get_cache(self.__class__, [self.pk, +                                                    'has_adminact']) +        has_adminact = self.administrative_act.count() +        cache.set(cache_key, has_adminact, settings.CACHE_TIMEOUT) +        return has_adminact + +    def get_short_menu_class(self): +        cache_key, val = get_cache(self.__class__, [self.pk, +                                                    'short_class_name']) +        if val: +            return val +        return self.update_short_menu_class(cache_key) + +    def update_short_menu_class(self, cache_key=None): +        if not cache_key: +            cache_key, val = get_cache(self.__class__, [self.pk, +                                                    'short_class_name']) +        cls = 'normal' +        if not self.has_adminact and self.reception_date: +            delta = datetime.date.today() - self.reception_date +            cls = 'red' +            if self.saisine_type and self.saisine_type.delay: +                if delta.days < (self.saisine_type.delay*1/3): +                    cls = 'green' +                elif delta.days < (self.saisine_type.delay*2/3): +                    cls = 'orange' +        cache.set(cache_key, cls, settings.CACHE_TIMEOUT) +        return cls + +    @classmethod +    def get_owns(cls, user): +        owns = super(File, cls).get_owns(user) +        return sorted(owns.all(), key=lambda x:(x.has_adminact, +                                                x.delay_date)) +      @classmethod      def get_years(cls):          return [res['year'] for res in list(cls.objects.values('year').annotate( @@ -263,6 +329,12 @@ class File(BaseHistorizedItem, OwnPerms, ValueGetter):                  acts.append(act)          return acts +    def save(self, *args, **kwargs): +        returned = super(File, self).save(*args, **kwargs) +        self.update_delay_date() +        self.update_short_menu_class() +        return returned +      def is_preventive(self):          return FileType.is_preventive(self.file_type.pk) | 
