summaryrefslogtreecommitdiff
path: root/ishtar_common/models.py
diff options
context:
space:
mode:
Diffstat (limited to 'ishtar_common/models.py')
-rw-r--r--ishtar_common/models.py90
1 files changed, 76 insertions, 14 deletions
diff --git a/ishtar_common/models.py b/ishtar_common/models.py
index 98f4addb7..3df557806 100644
--- a/ishtar_common/models.py
+++ b/ishtar_common/models.py
@@ -25,6 +25,7 @@ import datetime
from PIL import Image
import os
import tempfile
+import copy
from django.conf import settings
from django.core.exceptions import ObjectDoesNotExist, ValidationError
@@ -560,11 +561,53 @@ class UserDashboard:
self.types = types.annotate(number=Count('pk'))\
.order_by('person__person_types')
+class DashboardFormItem(object):
+ @classmethod
+ def get_periods(cls, slice='month', fltr={}, date_source='creation'):
+ date_var = date_source + '_date'
+ q = cls.objects.filter(**{date_var+'__isnull':False})
+ if fltr:
+ q = q.filter(**fltr)
+ if slice == 'year':
+ return [res[date_var].year for res in list(q.values(date_var
+ ).annotate(Count("id")).order_by())]
+ elif slice == 'month':
+ return [(res[date_var].year, res[date_var].month)
+ for res in list(q.values(date_var
+ ).annotate(Count("id")).order_by())]
+ return []
+
+ @classmethod
+ def get_by_year(cls, year, fltr={}, date_source='creation'):
+ date_var = date_source + '_date'
+ q = cls.objects.filter(**{date_var+'__isnull':False})
+ if fltr:
+ q = q.filter(**fltr)
+ return q.filter(**{date_var+'__year':year}).distinct('pk')
+
+ @classmethod
+ def get_by_month(cls, year, month, fltr={}, date_source='creation'):
+ date_var = date_source + '_date'
+ q = cls.objects.filter(**{date_var+'__isnull':False})
+ if fltr:
+ q = q.filter(**fltr)
+ q = q.filter(**{date_var+'__year':year, date_var+'__month':month})
+ return q.distinct('pk')
+
+ @classmethod
+ def get_total_number(cls, fltr={}):
+ q = cls.objects
+ if fltr:
+ q = q.filter(**fltr)
+ return q.distinct('pk').count()
+
class Dashboard:
- def __init__(self, model, slice='year', date_source=None, fltr={}):
+ def __init__(self, model, slice='year', date_source=None, show_detail=None,
+ fltr={}):
# don't provide date_source if it is not relevant
self.model = model
self.total_number = model.get_total_number(fltr)
+ self.show_detail = show_detail
history_model = self.model.history.model
# last edited - created
self.recents, self.lasts = [], []
@@ -587,31 +630,50 @@ class Dashboard:
obj.history_date = idx['hd']
last_lst.append(obj)
# years
- base_kwargs = {'fltr':fltr}
+ base_kwargs = {'fltr':fltr.copy()}
if date_source:
base_kwargs['date_source'] = date_source
- periods_kwargs = base_kwargs.copy()
+ periods_kwargs = copy.deepcopy(base_kwargs)
periods_kwargs['slice'] = slice
self.periods = model.get_periods(**periods_kwargs)
self.periods = list(set(self.periods))
self.periods.sort()
if not self.total_number or not self.periods:
return
+ kwargs_num = copy.deepcopy(base_kwargs)
+ self.serie_labels = [_(u"Total")]
# numbers
if slice == 'year':
- self.values = [('year', _(u"Year"), reversed(self.periods))]
- self.numbers = [model.get_by_year(year, **base_kwargs).count()
+ self.values = [('year', "",
+ list(reversed(self.periods)))]
+ self.numbers = [model.get_by_year(year, **kwargs_num).count()
for year in self.periods]
- self.values += [('number', _(u"Number"), reversed(self.numbers))]
+ self.values += [('number', _(u"Number"),
+ list(reversed(self.numbers)))]
if slice == 'month':
- self.numbers = [model.get_by_month(*period, **base_kwargs).count()
- for period in self.periods]
- periods = reversed(self.periods)
- self.periods = ["%d-%s-01" % (period[0], ('0'+str(period[1]))
- if len(str(period[1])) == 1 else period[1])
- for period in periods]
- self.values = [('month', _(u"Month"), self.periods)]
- self.values += [('number', _(u"Number"), reversed(self.numbers))]
+ periods = list(reversed(self.periods))
+ self.periods = ["%d-%s-01" % (p[0], ('0'+str(p[1]))
+ if len(str(p[1])) == 1 else p[1])
+ for p in periods]
+ self.values = [('month', "", self.periods)]
+ if show_detail:
+ for dpt in settings.ISHTAR_DPTS:
+ self.serie_labels.append(unicode(dpt))
+ idx = 'number_' + unicode(dpt)
+ kwargs_num['fltr']["towns__numero_insee__startswith"] = \
+ unicode(dpt)
+ numbers = [model.get_by_month(*p.split('-')[:2],
+ **kwargs_num).count()
+ for p in self.periods]
+ self.values += [(idx, dpt, list(numbers))]
+ # put "Total" at the end
+ self.serie_labels.append(self.serie_labels.pop(0))
+ kwargs_num = base_kwargs.copy()
+ self.numbers = [model.get_by_month(*p.split('-')[:2],
+ **kwargs_num).count()
+ for p in self.periods]
+ self.values += [('number', _(u"Total"),
+ list(self.numbers))]
# calculate
self.average = self.get_average()
self.variance = self.get_variance()