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
2 changes: 1 addition & 1 deletion assets
Submodule assets updated 0 files
57 changes: 21 additions & 36 deletions dref/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -208,15 +208,25 @@ class MiniDrefSerializer(serializers.ModelSerializer):
type_of_dref_display = serializers.CharField(source="get_type_of_dref_display", read_only=True)
status_display = serializers.CharField(source="get_status_display", read_only=True)
country_details = MiniCountrySerializer(source="country", read_only=True)
has_ops_update = serializers.SerializerMethodField()
has_final_report = serializers.SerializerMethodField()
starting_language = serializers.CharField(read_only=True)
# Manually added fields
application_type = serializers.SerializerMethodField()
application_type_display = serializers.SerializerMethodField()
unpublished_op_update_count = serializers.SerializerMethodField()
unpublished_final_report_count = serializers.SerializerMethodField()
operational_update_details = serializers.SerializerMethodField()
final_report_details = serializers.SerializerMethodField()
starting_language = serializers.CharField(read_only=True)
# Annotate values from queryset
has_ops_update = serializers.BooleanField(read_only=True)
has_final_report = serializers.BooleanField(read_only=True)
unpublished_op_update_count = serializers.IntegerField(read_only=True)
unpublished_final_report_count = serializers.IntegerField(read_only=True)
# Prefetched data
operational_update_details = MiniOperationalUpdateActiveSerializer(
source="prefetched_operational_updates",
many=True,
read_only=True,
)
final_report_details = MiniDrefFinalReportActiveSerializer(
source="dreffinalreport",
read_only=True,
)

class Meta:
model = Dref
Expand Down Expand Up @@ -250,39 +260,14 @@ class Meta:
"starting_language",
]

@extend_schema_field(MiniOperationalUpdateActiveSerializer(many=True))
def get_operational_update_details(self, obj):
queryset = DrefOperationalUpdate.objects.filter(dref_id=obj.id).order_by("-created_at")
return MiniOperationalUpdateActiveSerializer(queryset, many=True).data

@extend_schema_field(MiniDrefFinalReportActiveSerializer)
def get_final_report_details(self, obj):
queryset = DrefFinalReport.objects.filter(dref_id=obj.id).first()
return MiniDrefFinalReportActiveSerializer(queryset).data

def get_has_ops_update(self, obj) -> bool:
op_count_count = obj.drefoperationalupdate_set.count()
if op_count_count > 0:
return True
return False

def get_has_final_report(self, obj) -> bool:
if hasattr(obj, "dreffinalreport"):
return True
return False

def get_application_type(self, obj) -> str:
@extend_schema_field(serializers.CharField())
def get_application_type(self, _) -> str:
return "DREF"

def get_application_type_display(self, obj) -> str:
@extend_schema_field(serializers.CharField())
def get_application_type_display(self, _) -> str:
return gettext("DREF application")

def get_unpublished_op_update_count(self, obj) -> int:
return DrefOperationalUpdate.objects.filter(dref_id=obj.id).exclude(status=Dref.Status.APPROVED).count()

def get_unpublished_final_report_count(self, obj) -> int:
return DrefFinalReport.objects.filter(dref_id=obj.id).exclude(status=Dref.Status.APPROVED).count()


class PlannedInterventionSerializer(
NestedCreateMixin,
Expand Down
39 changes: 34 additions & 5 deletions dref/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@

import django.utils.timezone as timezone
from django.contrib.auth.models import Permission
from django.contrib.gis.db.models import Count, Exists, OuterRef, Q
from django.db import models, transaction
from django.db.models.query import Prefetch
from django.http import HttpResponse
from django.templatetags.static import static
from django.utils.translation import gettext
Expand Down Expand Up @@ -53,7 +55,7 @@
logger = logging.getLogger(__name__)


def filter_dref_queryset_by_user_access(user, queryset):
def filter_dref_queryset_by_user_access(user, queryset: models.QuerySet) -> models.QuerySet[Dref]:
if user.is_superuser:
return queryset
# Check if regional admin
Expand Down Expand Up @@ -344,16 +346,43 @@ class ActiveDrefOperationsViewSet(viewsets.ReadOnlyModelViewSet):
serializer_class = MiniDrefSerializer
permission_classes = [permissions.IsAuthenticated, DenyGuestUserPermission]
filterset_class = ActiveDrefFilterSet

queryset = (
Dref.objects.prefetch_related("planned_interventions", "needs_identified", "national_society_actions", "users")
Dref.objects.select_related(
"country",
)
.prefetch_related(
Prefetch(
"drefoperationalupdate_set",
queryset=DrefOperationalUpdate.objects.select_related("country").order_by("-created_at"),
to_attr="prefetched_operational_updates",
),
"dreffinalreport__country",
)
.order_by("-created_at")
.filter(is_active=True)
.distinct()
)

def get_queryset(self):
# user = self.request.user
return filter_dref_queryset_by_user_access(self.request.user, super().get_queryset()).order_by("-created_at")
return filter_dref_queryset_by_user_access(
self.request.user,
super().get_queryset(),
).annotate(
has_ops_update=Exists(
DrefOperationalUpdate.objects.filter(dref=OuterRef("pk")),
),
unpublished_op_update_count=Count(
"drefoperationalupdate",
filter=~Q(drefoperationalupdate__status=Dref.Status.APPROVED),
),
has_final_report=Exists(
DrefFinalReport.objects.filter(dref=OuterRef("pk")),
),
unpublished_final_report_count=Count(
"dreffinalreport",
filter=~Q(dreffinalreport__status=Dref.Status.APPROVED),
),
)


class DrefShareView(views.APIView):
Expand Down
Loading