Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion api/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -222,7 +222,11 @@ class EventAdmin(CompareVersionAdmin, RegionRestrictedAdmin, TranslationAdmin):

@admin.display(ordering="ifrc_severity_level_update_date")
def level_updated_at(self, obj):
return obj.ifrc_severity_level_update_date
if obj.ifrc_severity_level_update_date:
return obj.ifrc_severity_level_update_date
if obj.created_at and str(obj.created_at.year)[:3] not in obj.name:
return f"{obj.created_at.year}"
return None

country_in = "countries__pk__in"
region_in = "regions__pk__in"
Expand Down
12 changes: 9 additions & 3 deletions api/test_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
from deployments.factories.user import UserFactory
from dref.models import DrefFile
from main.test_case import APITestCase
from per.factories import OpsLearningFactory


class AuthPowerBITest(APITestCase):
Expand Down Expand Up @@ -144,14 +145,19 @@ def setUp(self):

# Create public field reports
event_pub = EventFactory.create(visibility=VisibilityChoices.PUBLIC, parent_event=None)
FieldReportFactory.create_batch(4, event=event_pub, visibility=VisibilityChoices.PUBLIC)
self.public_field_report = FieldReportFactory.create(event=event_pub, visibility=VisibilityChoices.PUBLIC)
FieldReportFactory.create_batch(3, event=event_pub, visibility=VisibilityChoices.PUBLIC)
# Create non-public field reports
event_non_pub = EventFactory.create(visibility=VisibilityChoices.IFRC, parent_event=None)
FieldReportFactory.create_batch(5, event=event_non_pub, visibility=VisibilityChoices.IFRC)

self.ops_learning = OpsLearningFactory.create(is_validated=True)

def test_guest_user_permission(self):
body = {}
id = 1 # NOTE: id is used just to test api that requires id, it doesnot indicate real id. It can be any number.
field_report_id = self.public_field_report.id
ops_learning_id = self.ops_learning.id

guest_apis = [
"/api/v2/add_subscription/",
Expand All @@ -161,12 +167,12 @@ def test_guest_user_permission(self):
guest_get_apis = [
"/api/v2/user/me/",
"/api/v2/field-report/",
f"/api/v2/field-report/{id}/",
f"/api/v2/field-report/{field_report_id}/",
"/api/v2/language/",
f"/api/v2/language/{id}/",
"/api/v2/event/",
"/api/v2/ops-learning/",
f"/api/v2/ops-learning/{id}/",
f"/api/v2/ops-learning/{ops_learning_id}/",
]

go_post_apis = [
Expand Down
2 changes: 1 addition & 1 deletion assets
Submodule assets updated 0 files
24 changes: 23 additions & 1 deletion per/drf_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
from rest_framework.response import Response
from rest_framework.settings import api_settings

from api.models import Country, Region
from api.models import AppealDocument, Country, Region
from deployments.models import SectorTag
from main.permissions import DenyGuestUserMutationPermission, DenyGuestUserPermission
from main.utils import SpreadSheetContentNegotiation
Expand Down Expand Up @@ -1202,6 +1202,7 @@ def get_queryset(self):
return qs.select_related(
"appeal_code",
).prefetch_related(
"appeal_code__event__appeals",
"sector",
"sector_validated",
"organization",
Expand All @@ -1216,6 +1217,7 @@ def get_queryset(self):
"appeal_code",
)
.prefetch_related(
"appeal_code__event__appeals",
"sector",
"sector_validated",
"organization",
Expand All @@ -1226,6 +1228,26 @@ def get_queryset(self):
)
)

def get_serializer_context(self):
context = super().get_serializer_context()
if getattr(self, "swagger_fake_view", False):
return context
view_action = getattr(self, "action", None)
if view_action == "list":
queryset = self.filter_queryset(self.get_queryset())
appeal_document_ids = list(
queryset.exclude(appeal_document_id__isnull=True).values_list("appeal_document_id", flat=True).distinct()
)
if appeal_document_ids:
context["appeal_documents_map"] = AppealDocument.objects.in_bulk(appeal_document_ids)
elif view_action == "retrieve":
lookup_kwarg = self.lookup_url_kwarg or self.lookup_field
if lookup_kwarg in self.kwargs:
obj = self.get_object()
if obj.appeal_document_id:
context["appeal_documents_map"] = AppealDocument.objects.in_bulk([obj.appeal_document_id])
return context

def get_serializer_class(self):
if self.request.method == "GET":
request_format = self.request.GET.get("format", "json")
Expand Down
36 changes: 24 additions & 12 deletions per/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -1054,14 +1054,20 @@ class Meta:
fields = "__all__"
read_only_fields = ("created_at", "modified_at")

@staticmethod
def get_document_url(obj):
if obj.appeal_document_id and (document := AppealDocument.objects.filter(id=obj.appeal_document_id).first()):
def _get_document(self, obj):
if not obj.appeal_document_id:
return None
document_map = self.context.get("appeal_documents_map")
if document_map is not None:
return document_map.get(obj.appeal_document_id)
return AppealDocument.objects.filter(id=obj.appeal_document_id).first()

def get_document_url(self, obj):
if document := self._get_document(obj):
return document.document_url

@staticmethod
def get_document_name(obj):
if obj.appeal_document_id and (document := AppealDocument.objects.filter(id=obj.appeal_document_id).first()):
def get_document_name(self, obj):
if document := self._get_document(obj):
return document.name


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

@staticmethod
def get_document_url(obj):
if obj.appeal_document_id and (document := AppealDocument.objects.filter(id=obj.appeal_document_id).first()):
def _get_document(self, obj):
if not obj.appeal_document_id:
return None
document_map = self.context.get("appeal_documents_map")
if document_map is not None:
return document_map.get(obj.appeal_document_id)
return AppealDocument.objects.filter(id=obj.appeal_document_id).first()

def get_document_url(self, obj):
if document := self._get_document(obj):
return document.document_url

@staticmethod
def get_document_name(obj):
if obj.appeal_document_id and (document := AppealDocument.objects.filter(id=obj.appeal_document_id).first()):
def get_document_name(self, obj):
if document := self._get_document(obj):
return document.name


Expand Down
13 changes: 7 additions & 6 deletions uv.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading