Coverage for apps/report/serializers.py : 100%
Hot-keys on this page
r m x p toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
1from django.db import models
2from django.db.models import Sum
3from django.db.models.functions import Cast
4from django.contrib.postgres.fields.jsonb import KeyTextTransform
5from rest_framework import serializers
7from project.models import Project
8from report.models import (
9 Report,
10 ProjectSOI,
11 RegisterChildByAgeAndGender,
12 PresenceAndParticipation,
13 ChildFamilyParticipation,
14 LanguagePeopleGroupDisability,
15 SupportPariticipationDetail,
16 MostVulnerableChildrenIndicator,
17 MostVulnerableChildrenVulnerabilityMarker,
18)
20from project.serializers import MiniProjectSerializer
23class BaseSerializer(serializers.ModelSerializer):
24 project_detail = MiniProjectSerializer(source='project', read_only=True)
27class ReportSerializer(BaseSerializer):
28 support_pariticipation_detail = serializers.SerializerMethodField()
29 most_vulnerable_children_indicator = serializers.SerializerMethodField()
30 most_vulnerable_children_vulnerability_marker = serializers.SerializerMethodField()
32 def get_support_pariticipation_detail(self, obj):
33 return SupportPariticipationDetail.objects.filter(project=obj.project).values('type', 'comment').annotate(
34 count_sum=Sum('count')
35 ).values('type', 'comment', 'count_sum')
37 def get_most_vulnerable_children_indicator(self, obj):
38 return MostVulnerableChildrenIndicator.objects.filter(project=obj.project).aggregate(
39 total_mvc_count=Sum('mvc_count'),
40 total_rc_not_vc_count=Sum('rc_not_vc_count'),
41 total_rc_count=Sum('rc_count'),
42 )
44 def get_most_vulnerable_children_vulnerability_marker(self, obj):
45 return MostVulnerableChildrenVulnerabilityMarker.objects.filter(project=obj.project).aggregate(
46 **{
47 field_label: Sum(Cast(KeyTextTransform(field, 'data'), models.IntegerField()))
48 for field, field_label in MostVulnerableChildrenVulnerabilityMarker.get_data_fields()
49 },
50 )
52 class Meta:
53 model = Report
54 fields = '__all__'
57class ProjectSOISerializer(BaseSerializer):
58 class Meta:
59 model = ProjectSOI
60 fields = '__all__'
63class RegisterChildByAgeAndGenderSerializer(BaseSerializer):
64 class Meta:
65 model = RegisterChildByAgeAndGender
66 fields = '__all__'
69class PresenceAndParticipationSerializer(BaseSerializer):
70 class Meta:
71 model = PresenceAndParticipation
72 fields = '__all__'
75class ChildFamilyParticipationSerializer(BaseSerializer):
76 class Meta:
77 model = ChildFamilyParticipation
78 fields = '__all__'
81class SupportPariticipationDetailSerializer(BaseSerializer):
82 class Meta:
83 model = SupportPariticipationDetail
84 fields = '__all__'
87class ProjectLanguagePeopleGroupDisabilitySerializer(serializers.ModelSerializer):
88 project_id = serializers.IntegerField(source='id')
89 language = serializers.SerializerMethodField()
90 people_group = serializers.SerializerMethodField()
91 disability = serializers.SerializerMethodField()
93 def _get_field_value(self, instance, field):
94 qs = LanguagePeopleGroupDisability.objects.filter(project=instance)
95 return list(
96 qs.values('date', field).annotate(
97 count=Sum('count', distinct=True),
98 ).values('date', f'{field}', 'count')
99 )
101 def get_language(self, instance):
102 return self._get_field_value(instance, 'language')
104 def get_people_group(self, instance):
105 return self._get_field_value(instance, 'people_group')
107 def get_disability(self, instance):
108 return self._get_field_value(instance, 'disability')
110 class Meta:
111 model = Project
112 fields = ('project_id', 'language', 'people_group', 'disability')