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