Skip to content

Commit 88e21cb

Browse files
Merge pull request #2716 from IFRCGo/develop
Small performance fixes and upgrades
2 parents 2a908c9 + 900f8a1 commit 88e21cb

6 files changed

Lines changed: 69 additions & 24 deletions

File tree

api/admin.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,11 @@ class EventAdmin(CompareVersionAdmin, RegionRestrictedAdmin, TranslationAdmin):
222222

223223
@admin.display(ordering="ifrc_severity_level_update_date")
224224
def level_updated_at(self, obj):
225-
return obj.ifrc_severity_level_update_date
225+
if obj.ifrc_severity_level_update_date:
226+
return obj.ifrc_severity_level_update_date
227+
if obj.created_at and str(obj.created_at.year)[:3] not in obj.name:
228+
return f"{obj.created_at.year}"
229+
return None
226230

227231
country_in = "countries__pk__in"
228232
region_in = "regions__pk__in"

api/test_views.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
from deployments.factories.user import UserFactory
2323
from dref.models import DrefFile
2424
from main.test_case import APITestCase
25+
from per.factories import OpsLearningFactory
2526

2627

2728
class AuthPowerBITest(APITestCase):
@@ -144,14 +145,19 @@ def setUp(self):
144145

145146
# Create public field reports
146147
event_pub = EventFactory.create(visibility=VisibilityChoices.PUBLIC, parent_event=None)
147-
FieldReportFactory.create_batch(4, event=event_pub, visibility=VisibilityChoices.PUBLIC)
148+
self.public_field_report = FieldReportFactory.create(event=event_pub, visibility=VisibilityChoices.PUBLIC)
149+
FieldReportFactory.create_batch(3, event=event_pub, visibility=VisibilityChoices.PUBLIC)
148150
# Create non-public field reports
149151
event_non_pub = EventFactory.create(visibility=VisibilityChoices.IFRC, parent_event=None)
150152
FieldReportFactory.create_batch(5, event=event_non_pub, visibility=VisibilityChoices.IFRC)
151153

154+
self.ops_learning = OpsLearningFactory.create(is_validated=True)
155+
152156
def test_guest_user_permission(self):
153157
body = {}
154158
id = 1 # NOTE: id is used just to test api that requires id, it doesnot indicate real id. It can be any number.
159+
field_report_id = self.public_field_report.id
160+
ops_learning_id = self.ops_learning.id
155161

156162
guest_apis = [
157163
"/api/v2/add_subscription/",
@@ -161,12 +167,12 @@ def test_guest_user_permission(self):
161167
guest_get_apis = [
162168
"/api/v2/user/me/",
163169
"/api/v2/field-report/",
164-
f"/api/v2/field-report/{id}/",
170+
f"/api/v2/field-report/{field_report_id}/",
165171
"/api/v2/language/",
166172
f"/api/v2/language/{id}/",
167173
"/api/v2/event/",
168174
"/api/v2/ops-learning/",
169-
f"/api/v2/ops-learning/{id}/",
175+
f"/api/v2/ops-learning/{ops_learning_id}/",
170176
]
171177

172178
go_post_apis = [

assets

per/drf_views.py

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
from rest_framework.response import Response
2121
from rest_framework.settings import api_settings
2222

23-
from api.models import Country, Region
23+
from api.models import AppealDocument, Country, Region
2424
from deployments.models import SectorTag
2525
from main.permissions import DenyGuestUserMutationPermission, DenyGuestUserPermission
2626
from main.utils import SpreadSheetContentNegotiation
@@ -1202,6 +1202,7 @@ def get_queryset(self):
12021202
return qs.select_related(
12031203
"appeal_code",
12041204
).prefetch_related(
1205+
"appeal_code__event__appeals",
12051206
"sector",
12061207
"sector_validated",
12071208
"organization",
@@ -1216,6 +1217,7 @@ def get_queryset(self):
12161217
"appeal_code",
12171218
)
12181219
.prefetch_related(
1220+
"appeal_code__event__appeals",
12191221
"sector",
12201222
"sector_validated",
12211223
"organization",
@@ -1226,6 +1228,26 @@ def get_queryset(self):
12261228
)
12271229
)
12281230

1231+
def get_serializer_context(self):
1232+
context = super().get_serializer_context()
1233+
if getattr(self, "swagger_fake_view", False):
1234+
return context
1235+
view_action = getattr(self, "action", None)
1236+
if view_action == "list":
1237+
queryset = self.filter_queryset(self.get_queryset())
1238+
appeal_document_ids = list(
1239+
queryset.exclude(appeal_document_id__isnull=True).values_list("appeal_document_id", flat=True).distinct()
1240+
)
1241+
if appeal_document_ids:
1242+
context["appeal_documents_map"] = AppealDocument.objects.in_bulk(appeal_document_ids)
1243+
elif view_action == "retrieve":
1244+
lookup_kwarg = self.lookup_url_kwarg or self.lookup_field
1245+
if lookup_kwarg in self.kwargs:
1246+
obj = self.get_object()
1247+
if obj.appeal_document_id:
1248+
context["appeal_documents_map"] = AppealDocument.objects.in_bulk([obj.appeal_document_id])
1249+
return context
1250+
12291251
def get_serializer_class(self):
12301252
if self.request.method == "GET":
12311253
request_format = self.request.GET.get("format", "json")

per/serializers.py

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1054,14 +1054,20 @@ class Meta:
10541054
fields = "__all__"
10551055
read_only_fields = ("created_at", "modified_at")
10561056

1057-
@staticmethod
1058-
def get_document_url(obj):
1059-
if obj.appeal_document_id and (document := AppealDocument.objects.filter(id=obj.appeal_document_id).first()):
1057+
def _get_document(self, obj):
1058+
if not obj.appeal_document_id:
1059+
return None
1060+
document_map = self.context.get("appeal_documents_map")
1061+
if document_map is not None:
1062+
return document_map.get(obj.appeal_document_id)
1063+
return AppealDocument.objects.filter(id=obj.appeal_document_id).first()
1064+
1065+
def get_document_url(self, obj):
1066+
if document := self._get_document(obj):
10601067
return document.document_url
10611068

1062-
@staticmethod
1063-
def get_document_name(obj):
1064-
if obj.appeal_document_id and (document := AppealDocument.objects.filter(id=obj.appeal_document_id).first()):
1069+
def get_document_name(self, obj):
1070+
if document := self._get_document(obj):
10651071
return document.name
10661072

10671073

@@ -1088,14 +1094,20 @@ class Meta:
10881094
)
10891095
exclude = ("learning", "type", "organization", "sector", "per_component")
10901096

1091-
@staticmethod
1092-
def get_document_url(obj):
1093-
if obj.appeal_document_id and (document := AppealDocument.objects.filter(id=obj.appeal_document_id).first()):
1097+
def _get_document(self, obj):
1098+
if not obj.appeal_document_id:
1099+
return None
1100+
document_map = self.context.get("appeal_documents_map")
1101+
if document_map is not None:
1102+
return document_map.get(obj.appeal_document_id)
1103+
return AppealDocument.objects.filter(id=obj.appeal_document_id).first()
1104+
1105+
def get_document_url(self, obj):
1106+
if document := self._get_document(obj):
10941107
return document.document_url
10951108

1096-
@staticmethod
1097-
def get_document_name(obj):
1098-
if obj.appeal_document_id and (document := AppealDocument.objects.filter(id=obj.appeal_document_id).first()):
1109+
def get_document_name(self, obj):
1110+
if document := self._get_document(obj):
10991111
return document.name
11001112

11011113

uv.lock

Lines changed: 7 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)