Projet

Général

Profil

0001-wip.patch

Valentin Deniaud, 18 novembre 2020 17:28

Télécharger (2,76 ko)

Voir les différences:

Subject: [PATCH] wip

 src/authentic2/apps/journal/models.py | 36 ++++++++++++++++++++++++++-
 1 file changed, 35 insertions(+), 1 deletion(-)
src/authentic2/apps/journal/models.py
23 23
from django.conf import settings
24 24
from django.contrib.auth import get_user_model
25 25
from django.contrib.postgres.fields import ArrayField, JSONField
26
from django.contrib.postgres.fields.jsonb import KeyTextTransform
26 27
from django.contrib.contenttypes.models import ContentType
27 28
from django.core.exceptions import ObjectDoesNotExist
28 29
from django.db import models
29
from django.db.models import QuerySet, Q, F, Value
30
from django.db.models import QuerySet, Q, F, Value, Count
31
from django.db.models.functions import Trunc
30 32
from django.utils.translation import ugettext_lazy as _
31 33
from django.utils.timezone import utc, now
32 34

  
......
108 110
    def get_message(self, event, context=None):
109 111
        return self.label
110 112

  
113
    @classmethod
114
    def get_statistics(cls, start_datetime=None, end_datetime=None, group_by_time='timestamp', group_by_field=None, group_by_reference=None):
115
        if group_by_time and not group_by_time in ('timestamp', 'day', 'week', 'month', 'year'):
116
            raise ValueError('Usupported value for group_by_time: %s' % time_group_by)
117

  
118
        event_type = EventType.objects.get_for_name(cls.name)
119
        qs = Event.objects.filter(type=event_type)
120

  
121
        if start_datetime:
122
            qs = qs.filter(timestamp__gte=start_datetime)
123
        if end_datetime:
124
            qs = qs.filter(timestamp__lte=end_datetime)
125

  
126
        value_fields = []
127
        if group_by_time:
128
            qs = qs.annotate(**{group_by_time: Trunc('timestamp', kind=group_by_time)})
129
            value_fields.append(group_by_time)
130

  
131
        if group_by_field:
132
            if group_by_field not in ('user', 'session'):
133
                # get it from JSONField called 'data'
134
                qs = qs.annotate(**{group_by_field: KeyTextTransform(group_by_field, 'data')})
135
            value_fields.append(group_by_field)
136

  
137
        if group_by_reference:
138
            qs = qs.which_references(group_by_reference)
139
            value_fields.append('reference_ids')
140

  
141
        qs = qs.values(*value_fields)
142

  
143
        qs = qs.annotate(count=Count('id'))
144
        return qs.order_by(group_by_time)
111 145
    def __repr__(self):
112 146
        return '<EventTypeDefinition %r %s>' % (self.name, self.label)
113 147

  
114
-