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) |