api: split statistics filters code (#63368)
This commit is contained in:
parent
30997475f3
commit
9e232c337e
|
@ -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():
|
||||
|
|
Loading…
Reference in New Issue