Skip to content

Commit e156db6

Browse files
Fix issue for delay time for eap list
1 parent 135cfdd commit e156db6

File tree

7 files changed

+207
-13
lines changed

7 files changed

+207
-13
lines changed

api/drf_views.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -232,11 +232,12 @@ def get_databank(self, request, pk):
232232

233233
class CountryFilterRMD(filters.FilterSet):
234234
region = filters.NumberFilter(field_name='region', lookup_expr='exact')
235-
235+
236236
class Meta:
237237
model = Country
238238
fields = ('region', 'record_type',)
239239

240+
240241
class CountryRMDViewset(viewsets.ReadOnlyModelViewSet):
241242
queryset = Country.objects.filter(is_deprecated=False).filter(iso3__isnull=False).exclude(iso3="")
242243
filterset_class = CountryFilterRMD
@@ -247,7 +248,7 @@ class CountryRMDViewset(viewsets.ReadOnlyModelViewSet):
247248
class DistrictRMDFilter(filters.FilterSet):
248249
class Meta:
249250
model = District
250-
fields = ('country','country__name')
251+
fields = ('country', 'country__name')
251252

252253

253254
class DistrictRMDViewset(viewsets.ReadOnlyModelViewSet):

api/serializers.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1061,8 +1061,9 @@ class Meta:
10611061
fields = '__all__'
10621062

10631063

1064-
from eap.serializers import EAPActivationSerializer # It is imported here to avoid circular import issue
10651064
class DetailFieldReportSerializer(FieldReportEnumDisplayMixin, ModelSerializer):
1065+
from eap.serializers import EAPActivationSerializer
1066+
10661067
user = UserSerializer()
10671068
dtype = DisasterTypeSerializer()
10681069
contacts = FieldReportContactSerializer(many=True)
@@ -1117,6 +1118,7 @@ class Meta:
11171118
'disaster_start_date', 'created_at', 'appeals',
11181119
)
11191120

1121+
11201122
class CountryOfFieldReportToReviewSerializer(ModelSerializer):
11211123
class Meta:
11221124
model = CountryOfFieldReportToReview

eap/factories.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
EAP,
1616
EAPDocument,
1717
EAPActivation,
18+
EAPActivationReport,
1819
)
1920

2021

@@ -116,5 +117,35 @@ def documents(self, create, extracted, **kwargs):
116117
self.documents.add(document)
117118

118119

120+
class EAPActivationReportFactory(factory.django.DjangoModelFactory):
121+
class Meta:
122+
model = EAPActivationReport
123+
124+
eap_activation = factory.SubFactory(EAPActivationFactory)
125+
number_of_people_reached = fuzzy.FuzzyInteger(0, 9)
126+
description = fuzzy.FuzzyText(length=20)
127+
overall_objectives = fuzzy.FuzzyText(length=50)
128+
challenges_and_lesson = fuzzy.FuzzyText(length=50)
129+
general_lesson_and_recomendations = fuzzy.FuzzyText(length=50)
130+
131+
@factory.post_generation
132+
def documents(self, create, extracted, **kwargs):
133+
if not create:
134+
return
135+
136+
if extracted:
137+
for document in extracted:
138+
self.documents.add(document)
139+
140+
@factory.post_generation
141+
def operational_plans(self, create, extracted, **kwargs):
142+
if not create:
143+
return
144+
145+
if extracted:
146+
for plan in extracted:
147+
self.operational_plans.add(plan)
148+
149+
119150

120151

eap/serializers.py

Lines changed: 48 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -112,19 +112,60 @@ class EAPSerializer(
112112
districts_details = MiniDistrictSerializer(source='districts', many=True, read_only=True)
113113
references = EAPReferenceSerializer(source='eap_reference', many=True, required=False)
114114
partners = EAPPartnerSerializer(source='eap_partner', many=True, required=False)
115-
early_actions = EarlyActionSerializer(many=True)
116-
created_by_details = UserNameSerializer(source='created_by', read_only=True)
117-
modified_by_details = UserNameSerializer(source='modified_by', read_only=True)
118-
hazard_type_details = DisasterTypeSerializer(source='disaster_type', read_only=True)
119-
documents_details = EAPDocumentSerializer(source='documents', many=True, read_only=True, required=False)
115+
# early_actions = EarlyActionSerializer(many=True)
116+
# created_by_details = UserNameSerializer(source='created_by', read_only=True)
117+
# modified_by_details = UserNameSerializer(source='modified_by', read_only=True)
118+
# hazard_type_details = DisasterTypeSerializer(source='disaster_type', read_only=True)
119+
# documents_details = EAPDocumentSerializer(source='documents', many=True, read_only=True, required=False)
120120
status_display = serializers.CharField(source='get_status_display', read_only=True)
121121

122122
class Meta:
123123
model = EAP
124-
fields = '__all__'
124+
fields = [
125+
"id",
126+
"created_at",
127+
"modified_at",
128+
"eap_number",
129+
"approval_date",
130+
"status",
131+
"operational_timeframe",
132+
"lead_time",
133+
"eap_timeframe",
134+
"num_of_people",
135+
"total_budget",
136+
"readiness_budget",
137+
"pre_positioning_budget",
138+
"early_action_budget",
139+
"trigger_statement",
140+
"overview",
141+
"originator_name",
142+
"originator_title",
143+
"originator_email",
144+
"originator_phone",
145+
"nsc_name",
146+
"nsc_title",
147+
"nsc_email",
148+
"nsc_phone",
149+
"ifrc_focal_name",
150+
"ifrc_focal_title",
151+
"ifrc_focal_email",
152+
"ifrc_focal_phone",
153+
"created_by",
154+
"modified_by",
155+
"country",
156+
"disaster_type",
157+
"status_display",
158+
"country_details",
159+
"districts_details",
160+
"references",
161+
"partners",
162+
163+
]
125164

126165
def validate(self, validated_data):
127-
districts = validated_data['districts']
166+
if self.partial:
167+
return validated_data
168+
districts = validated_data.get('districts', None)
128169
if districts:
129170
for district in districts:
130171
if district.country != validated_data['country']:

eap/test_views.py

Lines changed: 62 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,10 @@
66
from main.test_case import APITestCase
77
from eap.models import (
88
EAP,
9+
Action,
910
EarlyAction,
11+
EAPDocument,
1012
EAPActivationReport,
11-
Action,
12-
EarlyActionIndicator,
1313
)
1414

1515
from api.factories.country import CountryFactory
@@ -21,6 +21,7 @@
2121
EAPDocumentFactory,
2222
EAPFactory,
2323
EAPActivationFactory,
24+
EAPActivationReportFactory,
2425
)
2526

2627

@@ -245,6 +246,12 @@ def test_create_and_update_eap(self):
245246
self.assertEqual(len(response['references']), 1)
246247
self.assertEqual(len(response['partners']), 1)
247248

249+
# test patch
250+
data = {'status': EAP.Status.APPROVED}
251+
response = self.client.patch(f'/api/v2/eap/{created.id}/', data=data, format='json').json()
252+
pached = EAP.objects.get(id=response['id'])
253+
self.assertEqual(pached.status, EAP.Status.APPROVED)
254+
248255
def test_get_eap(self):
249256
user1 = UserFactory.create(username='abc')
250257
eap1, eap2, eap3 = EAPFactory.create_batch(3, created_by=user1)
@@ -353,3 +360,56 @@ def test_create_and_update_eap_activation_report(self):
353360
self.assertEqual(len(final_report_updated_resp['operational_plans']), 1)
354361
self.assertEqual(len(final_report_updated_resp['operational_plans'][0]['early_actions_achievements']), 2)
355362
self.assertEqual(len(final_report_updated_resp['operational_plans'][0]['indicators']), 2)
363+
364+
# test patch
365+
data = {'ifrc_financial_report': self.document1.id}
366+
with self.capture_on_commit_callbacks(execute=True):
367+
final_report_patched_resp = self.client.patch(
368+
f'/api/v2/eap-activation-report/{created.id}/',
369+
data,
370+
format='json'
371+
).json()
372+
updated = EAPActivationReport.objects.get(id=final_report_patched_resp['id'])
373+
self.assertEqual(final_report_patched_resp['ifrc_financial_report'], self.document1.id)
374+
375+
def test_get_eap_activation_report(self):
376+
user1 = UserFactory.create(username='abc')
377+
report1, report2, report3 = EAPActivationReportFactory.create_batch(3, created_by=user1)
378+
self.client.force_authenticate(user=user1)
379+
response1 = self.client.get('/api/v2/eap-activation-report/').json()
380+
self.assertEqual(response1['results'][0]['created_by'], user1.id)
381+
self.assertEqual(len(response1['results']), 3)
382+
assert all(item in [data['id'] for data in response1['results']] for item in [report1.id, report2.id, report3.id])
383+
384+
# query single eap
385+
response = self.client.get(f'/api/v2/eap-activation-report/{report1.id}/').json()
386+
self.assertEqual(response['created_by'], user1.id)
387+
self.assertEqual(response['id'], report1.id)
388+
389+
# try with another user
390+
user2 = User.objects.create(username='xyz')
391+
self.client.force_authenticate(user=user2)
392+
report4, report5 = EAPActivationReportFactory.create_batch(2, created_by=user2)
393+
response2 = self.client.get('/api/v2/eap-activation-report/').json()
394+
self.assertEqual(response2['results'][0]['created_by'], user2.id)
395+
self.assertIn(report4.id, [data['id'] for data in response2['results']])
396+
self.assertNotIn([data['id'] for data in response2['results']], [data['id'] for data in response1['results']])
397+
398+
# try with users who has no any eap created
399+
user3 = User.objects.create(username='ram')
400+
self.client.force_authenticate(user=user3)
401+
response3 = self.client.get('/api/v2/eap-activation-report/').json()
402+
self.assertEqual(response3['count'], 5)
403+
404+
def test_eap_upload_multiple_file(self):
405+
file_count = EAPDocument.objects.count()
406+
url = '/api/v2/eap-file/multiple/'
407+
data = {
408+
'file': [open(self.file, 'rb'), open(self.file, 'rb'), open(self.file, 'rb')]
409+
}
410+
411+
self.authenticate()
412+
response = self.client.post(url, data, format='multipart')
413+
self.assert_201(response)
414+
self.assertEqual(EAPDocument.objects.count(), file_count + 3)
415+

eap/views.py

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@
66
response,
77
permissions,
88
mixins,
9+
status,
910
)
11+
from rest_framework.decorators import action
1012
from .models import (
1113
EarlyActionIndicator,
1214
EAP,
@@ -32,13 +34,38 @@ class EAPDocumentViewSet(
3234
def get_queryset(self):
3335
return EAPDocument.objects.all()
3436

37+
@action(
38+
detail=False,
39+
url_path='multiple',
40+
methods=['POST'],
41+
permission_classes=[permissions.IsAuthenticated],
42+
)
43+
def multiple_file(self, request, pk=None, version=None):
44+
# converts querydict to original dict
45+
files = dict((request.data).lists())['file']
46+
data = [{'file': file} for file in files]
47+
file_serializer = EAPDocumentSerializer(data=data, context={'request': request}, many=True)
48+
if file_serializer.is_valid():
49+
file_serializer.save()
50+
return response.Response(file_serializer.data, status=status.HTTP_201_CREATED)
51+
else:
52+
return response.Response(file_serializer.errors, status=status.HTTP_400_BAD_REQUEST)
53+
3554

3655
class EAPViewSet(viewsets.ModelViewSet):
3756
serializer_class = EAPSerializer
3857
permission_classes = [permissions.IsAuthenticated]
3958

4059
def get_queryset(self):
41-
return EAP.objects.all().order_by('-created_at')
60+
return EAP.objects.all().order_by(
61+
'-created_at'
62+
).select_related(
63+
'country',
64+
).prefetch_related(
65+
'districts',
66+
'eap_reference__eap',
67+
'eap_partner__eap'
68+
)
4269

4370

4471
class EAPActivationReportViewSet(viewsets.ModelViewSet):

test

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
"id",
2+
"created_at",
3+
"modified_at",
4+
"eap_number",
5+
"approval_date",
6+
"status",
7+
"operational_timeframe",
8+
"lead_time",
9+
"eap_timeframe",
10+
"num_of_people",
11+
"total_budget",
12+
"readiness_budget",
13+
"pre_positioning_budget",
14+
"early_action_budget",
15+
"trigger_statement",
16+
"overview",
17+
"originator_name",
18+
"originator_title",
19+
"originator_email",
20+
"originator_phone",
21+
"nsc_name",
22+
"nsc_title",
23+
"nsc_email",
24+
"nsc_phone",
25+
"ifrc_focal_name",
26+
"ifrc_focal_title",
27+
"ifrc_focal_email",
28+
"ifrc_focal_phone",
29+
"created_by",
30+
"modified_by",
31+
"country",
32+
"disaster_type",

0 commit comments

Comments
 (0)