Skip to content

Commit 6b4b771

Browse files
committed
Merge branch 'develop' – Fix eventlist personnel count query n+1 issue
2 parents 79cd34c + bbb563c commit 6b4b771

File tree

7 files changed

+214
-169
lines changed

7 files changed

+214
-169
lines changed

api/drf_views.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -622,6 +622,7 @@ class EventViewset(ReadOnlyVisibilityViewset):
622622

623623
def get_queryset(self, *args, **kwargs):
624624
# import pdb; pdb.set_trace();
625+
today = timezone.now().date().strftime("%Y-%m-%d")
625626
qset = super().get_queryset()
626627
if self.action == "mini_events":
627628
# return Event.objects.filter(parent_event__isnull=True).select_related('dtype')
@@ -648,6 +649,17 @@ def get_queryset(self, *args, **kwargs):
648649
),
649650
),
650651
)
652+
.annotate(
653+
active_deployments=Count(
654+
"personneldeployment__personnel",
655+
filter=Q(
656+
personneldeployment__personnel__type=Personnel.TypeChoices.RR,
657+
personneldeployment__personnel__start_date__date__lte=today,
658+
personneldeployment__personnel__end_date__date__gte=today,
659+
personneldeployment__personnel__is_active=True,
660+
),
661+
)
662+
)
651663
)
652664

653665
def get_serializer_class(self):

api/schema.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
import graphene
2+
3+
# Will be needed later, do not remove:
4+
# import graphql_geojson
25
from graphene_django.types import DjangoObjectType
36

47
from .models import ActionsTaken, Appeal, Country, DisasterType, Event, FieldReport
@@ -39,7 +42,6 @@ class Query(graphene.ObjectType):
3942
all_countries = graphene.List(CountryObjectType)
4043
all_disasters_types = graphene.List(DisasterObjectType)
4144
all_events = graphene.List(EventType)
42-
all_events = graphene.List(EventType)
4345
all_appeals = graphene.List(AppealType)
4446
all_fieldreports = graphene.List(FieldReportType)
4547

api/serializers.py

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -988,7 +988,7 @@ class ListEventSerializer(ModelSerializer):
988988
field_reports = MiniFieldReportSerializer(many=True, read_only=True)
989989
dtype = DisasterTypeSerializer(required=False)
990990
ifrc_severity_level_display = serializers.CharField(source="get_ifrc_severity_level_display", read_only=True)
991-
active_deployments = serializers.SerializerMethodField()
991+
active_deployments = serializers.IntegerField(read_only=True)
992992

993993
class Meta:
994994
model = Event
@@ -1019,15 +1019,17 @@ class Meta:
10191019
"active_deployments",
10201020
)
10211021

1022-
def get_active_deployments(self, event) -> int:
1023-
now = timezone.now()
1024-
return Personnel.objects.filter(
1025-
type=Personnel.TypeChoices.RR,
1026-
start_date__lt=now,
1027-
end_date__gt=now,
1028-
deployment__event_deployed_to=event,
1029-
is_active=True,
1030-
).count()
1022+
1023+
# Instead of the below method we use the queryset's annotate tag:
1024+
# def get_active_deployments(self, event) -> int:
1025+
# now = timezone.now()
1026+
# return Personnel.objects.filter(
1027+
# type=Personnel.TypeChoices.RR,
1028+
# start_date__lt=now,
1029+
# end_date__gt=now,
1030+
# deployment__event_deployed_to=event,
1031+
# is_active=True,
1032+
# ).count()
10311033

10321034

10331035
class SurgeEventSerializer(ModelSerializer):
@@ -1655,7 +1657,7 @@ def update(self, instance, validated_data):
16551657
return instance
16561658

16571659

1658-
# Instead of the below method we use the serializer's annotate tag:
1660+
# Instead of the below method we use the queryset's annotate tag:
16591661
# @staticmethod
16601662
# def get_is_ifrc_admin(obj) -> bool:
16611663
# return obj.groups.filter(name__iexact="IFRC Admins").exists()

main/settings.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -231,7 +231,8 @@
231231
"DEFAULT_SCHEMA_CLASS": "drf_spectacular.openapi.AutoSchema",
232232
}
233233

234-
GRAPHENE = {"SCHEMA": "api.schema.schema"}
234+
# Not ready yet to use
235+
# GRAPHENE = {"SCHEMA": "api.schema.schema"}
235236

236237
MIDDLEWARE = [
237238
"debug_toolbar.middleware.DebugToolbarMiddleware",

main/urls.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
SpectacularRedocView,
1717
SpectacularSwaggerView,
1818
)
19-
from graphene_django.views import GraphQLView
2019

2120
# DRF routes
2221
from rest_framework import routers
@@ -63,6 +62,8 @@
6362
from registrations.drf_views import RegistrationView
6463
from registrations.views import UserExternalTokenViewset, ValidateUser, VerifyEmail
6564

65+
# from graphene_django.views import GraphQLView # will be needed later
66+
6667
router = routers.DefaultRouter()
6768

6869
router.register(r"action", api_views.ActionViewset, basename="action")
@@ -172,9 +173,8 @@
172173
# url(r"^api/v1/es_search/", EsPageSearch.as_view()),
173174
url(r"^api/v1/search/", HayStackSearch.as_view()),
174175
url(r"^api/v1/es_health/", EsPageHealth.as_view()),
175-
# If we want to use the next one, some fixes needed, e.g.
176-
# stackoverflow.com/questions/47166385/dont-know-how-to-convert-the-django-field-skills-class-taggit-managers-tagga
177-
url(r"^api/v1/graphql/", GraphQLView.as_view(graphiql=True)),
176+
# If we want to use the next one, some permission overthink is needed:
177+
# url(r"^api/v1/graphql/", GraphQLView.as_view(graphiql=True)),
178178
url(r"^api/v1/aggregate/", AggregateByTime.as_view()),
179179
url(r"^api/v1/aggregate_dtype/", AggregateByDtype.as_view()),
180180
url(r"^api/v1/aggregate_area/", AreaAggregate.as_view()),

0 commit comments

Comments
 (0)