api: split statistics filters code (#63368)

This commit is contained in:
Valentin Deniaud 2023-02-20 17:52:28 +01:00
parent 30997475f3
commit 9e232c337e
1 changed files with 41 additions and 23 deletions

View File

@ -30,6 +30,7 @@ from django.db import models, transaction
from django.shortcuts import get_object_or_404
from django.utils.dateparse import parse_datetime
from django.utils.encoding import force_str
from django.utils.functional import cached_property
from django.utils.text import slugify
from django.utils.timezone import now
from django.utils.translation import gettext_lazy as _
@ -1620,19 +1621,6 @@ class StatisticsAPI(ViewSet):
def list(self, request):
statistics = []
services_ous = [
{'id': ou.slug, 'label': ou.name}
for ou in OrganizationalUnit.objects.exclude(service__isnull=True)
]
users_ous = [
{'id': ou.slug, 'label': ou.name}
for ou in OrganizationalUnit.objects.exclude(user__isnull=True).order_by('name')
]
services = [
{'id': '%s %s' % (service['slug'], service['ou__slug']), 'label': service['name']}
for service in Service.objects.values('slug', 'name', 'ou__slug').order_by('ou__name', 'name')
]
time_interval_field = StatisticsSerializer().get_fields()['time_interval']
common_filters = [
{
@ -1648,16 +1636,7 @@ class StatisticsAPI(ViewSet):
for action in self.get_extra_actions():
url = self.reverse_action(action.url_name)
filters = common_filters.copy()
if 'service' in action.filters:
filters.append({'id': 'service', 'label': _('Service'), 'options': services})
if 'services_ou' in action.filters and len(services_ous) > 1:
filters.append(
{'id': 'services_ou', 'label': _('Services organizational unit'), 'options': services_ous}
)
if 'users_ou' in action.filters and len(users_ous) > 1:
filters.append(
{'id': 'users_ou', 'label': _('Users organizational unit'), 'options': users_ous}
)
filters.extend(self.get_additional_filters(action.filters))
data = {
'name': action.kwargs['name'],
'url': url,
@ -1673,6 +1652,45 @@ class StatisticsAPI(ViewSet):
}
)
@cached_property
def services_ous(self):
return [
{'id': ou.slug, 'label': ou.name}
for ou in OrganizationalUnit.objects.exclude(service__isnull=True)
]
@cached_property
def users_ous(self):
return [
{'id': ou.slug, 'label': ou.name}
for ou in OrganizationalUnit.objects.exclude(user__isnull=True).order_by('name')
]
@cached_property
def services(self):
return [
{'id': '%s %s' % (service['slug'], service['ou__slug']), 'label': service['name']}
for service in Service.objects.values('slug', 'name', 'ou__slug').order_by('ou__name', 'name')
]
def get_additional_filters(self, filter_ids):
filters = []
if 'service' in filter_ids:
filters.append({'id': 'service', 'label': _('Service'), 'options': self.services})
if 'services_ou' in filter_ids and len(self.services_ous) > 1:
filters.append(
{
'id': 'services_ou',
'label': _('Services organizational unit'),
'options': self.services_ous,
}
)
if 'users_ou' in filter_ids and len(self.users_ous) > 1:
filters.append(
{'id': 'users_ou', 'label': _('Users organizational unit'), 'options': self.users_ous}
)
return filters
def get_statistics(self, request, klass, method):
serializer = StatisticsSerializer(data=request.query_params)
if not serializer.is_valid():