diff options
Diffstat (limited to 'ishtar_common/models.py')
-rw-r--r-- | ishtar_common/models.py | 90 |
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() |