diff --git a/app/views/conference_view.py b/app/views/conference_view.py index 14d6c1f..9d35088 100644 --- a/app/views/conference_view.py +++ b/app/views/conference_view.py @@ -1,11 +1,14 @@ import datetime from django.core.exceptions import ValidationError +from django.db.models import Count, Exists, IntegerField, OuterRef, Subquery from ..errors import (INVALID_PARAMETERS, CONFERENCE_NOT_FOUND, MISSING_PARAMETERS, PMError) from ..utils import JSONHttpResponse, serialize, paginate_and_serialize from ..models.conference import Conference +from ..models.issue import Issue +from ..models.participant import Participant from .generic_view import GenericView class ConferencesView(GenericView): @@ -40,12 +43,31 @@ def filter(cls, request): filters['created_at__gt'] = datetime.datetime.fromisoformat(filters.get('created_at__gt')) try: - objs = Conference.filter(**filters) + objs = Conference.filter(**filters).annotate( + has_errors=Exists( + Issue.objects.filter(conference=OuterRef('pk'), type='e', is_active=True) + ), + has_warnings=Exists( + Issue.objects.filter(conference=OuterRef('pk'), type='w', is_active=True) + ), + participants_count=Subquery( + Participant.objects.filter( + conferences=OuterRef('pk'), + is_active=True, + ).order_by().values('conferences').annotate( + cnt=Count('id', distinct=True) + ).values('cnt')[:1], + output_field=IntegerField(), + ), + ) except ValidationError: raise PMError(status=400, app_error=INVALID_PARAMETERS) return JSONHttpResponse( - content=paginate_and_serialize(request, objs), + content=paginate_and_serialize( + request, objs, + properties=['has_errors', 'has_warnings', 'participants_count'], + ), ) @classmethod