summaryrefslogtreecommitdiff
path: root/archaeological_files/models.py
diff options
context:
space:
mode:
Diffstat (limited to 'archaeological_files/models.py')
-rw-r--r--archaeological_files/models.py80
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)