|
1 | 1 | from distutils.util import strtobool
|
2 |
| -from typing import Dict, List |
3 | 2 |
|
4 |
| -from django.db.models import Count, F |
| 3 | +from django.db.models import F |
5 | 4 | from django.http import Http404
|
6 | 5 | from django.http.response import HttpResponse, JsonResponse
|
7 | 6 | from django_filters.rest_framework import DjangoFilterBackend
|
|
13 | 12 | from rest_framework.permissions import BasePermission, IsAuthenticated
|
14 | 13 | from rest_framework.request import Request
|
15 | 14 | from rest_framework.response import Response
|
16 |
| -from rest_framework.serializers import Serializer |
17 | 15 |
|
18 | 16 | from airone.lib.acl import ACLType, get_permitted_objects
|
19 | 17 | from airone.lib.drf import ObjectNotExistsError, YAMLParser, YAMLRenderer
|
@@ -263,44 +261,40 @@ def get_object(self) -> dict:
|
263 | 261 | @extend_schema(
|
264 | 262 | parameters=[
|
265 | 263 | OpenApiParameter("entity_ids", OpenApiTypes.STR, OpenApiParameter.QUERY),
|
| 264 | + OpenApiParameter("referral_attr", OpenApiTypes.STR, OpenApiParameter.QUERY), |
266 | 265 | ],
|
267 | 266 | )
|
268 | 267 | class EntityAttrNameAPI(generics.GenericAPIView):
|
269 | 268 | serializer_class = EntityAttrNameSerializer
|
270 | 269 |
|
271 | 270 | def get_queryset(self):
|
272 | 271 | entity_ids = list(filter(None, self.request.query_params.get("entity_ids", "").split(",")))
|
| 272 | + referral_attr = self.request.query_params.get("referral_attr") |
273 | 273 |
|
274 |
| - if len(entity_ids) == 0: |
275 |
| - return EntityAttr.objects.filter(is_active=True) |
276 |
| - |
277 |
| - else: |
| 274 | + entity_attrs = EntityAttr.objects.filter(is_active=True) |
| 275 | + if len(entity_ids) != 0: |
278 | 276 | entities = Entity.objects.filter(id__in=entity_ids, is_active=True)
|
279 | 277 | if len(entity_ids) != len(entities):
|
280 | 278 | # the case invalid entity-id was specified
|
281 | 279 | raise ValidationError("Target Entity doesn't exist")
|
282 |
| - else: |
283 |
| - # filter only names appear in all specified entities |
284 |
| - return EntityAttr.objects.filter(parent_entity__in=entities, is_active=True) |
| 280 | + |
| 281 | + # filter only names appear in all specified entities |
| 282 | + entity_attrs = entity_attrs.filter(parent_entity__in=entities) |
| 283 | + |
| 284 | + if referral_attr: |
| 285 | + referral_entity_ids = ( |
| 286 | + entity_attrs.filter(name=referral_attr) |
| 287 | + .exclude(referral__id__isnull=True) |
| 288 | + .values_list("referral", flat=True) |
| 289 | + .distinct() |
| 290 | + ) |
| 291 | + entity_attrs = EntityAttr.objects.filter( |
| 292 | + parent_entity__in=referral_entity_ids, is_active=True |
| 293 | + ) |
| 294 | + |
| 295 | + return entity_attrs.values_list("name", flat=True).order_by("name").distinct() |
285 | 296 |
|
286 | 297 | def get(self, request: Request) -> Response:
|
287 | 298 | queryset = self.get_queryset()
|
288 |
| - |
289 |
| - entity_ids: List[int] = list( |
290 |
| - filter(None, self.request.query_params.get("entity_ids", "").split(",")) |
291 |
| - ) |
292 |
| - names_query = queryset.values("name") |
293 |
| - if len(entity_ids) > 0: |
294 |
| - names_query = names_query.annotate(count=Count("name")).filter(count=len(entity_ids)) |
295 |
| - |
296 |
| - # Compile each attribute of referrals by attribute name |
297 |
| - serializer: Serializer = self.get_serializer(queryset) |
298 |
| - results: Dict[str, Dict] = {} |
299 |
| - for attrname in names_query.values_list("name", flat=True): |
300 |
| - for attrinfo in [x for x in serializer.data if x["name"] == attrname]: |
301 |
| - if attrname in results: |
302 |
| - results[attrname]["referral"] += attrinfo["referral"] |
303 |
| - else: |
304 |
| - results[attrname] = attrinfo |
305 |
| - |
306 |
| - return Response(results.values()) |
| 299 | + serializer: serializers.Serializer = self.get_serializer(queryset) |
| 300 | + return Response(serializer.data) |
0 commit comments