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