Skip to content

Commit 6cca70f

Browse files
Modified create, update, get of field report api to accept eap activation:
1 parent 7ce5a39 commit 6cca70f

File tree

9 files changed

+176
-7
lines changed

9 files changed

+176
-7
lines changed

api/drf_views.py

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
from deployments.models import Personnel
1919
from databank.serializers import CountryOverviewSerializer
2020

21+
from eap.models import EAPActivation, EAP, EAPDocument
22+
2123
from .event_sources import SOURCES
2224
from .exceptions import BadRequest
2325
from .view_filters import ListFilter
@@ -906,6 +908,14 @@ def create_event(self, report):
906908
report.save()
907909
return event
908910

911+
def create_eap_activation(self, eap_activation_data, fieldreport):
912+
eap_id = eap_activation_data.pop('eap')
913+
document_id = eap_activation_data.pop('document')
914+
eap = EAP.objects.get(id=eap_id)
915+
document = EAPDocument.objects.get(id=document_id)
916+
eap_activation = EAPActivation.objects.create(eap=eap, field_report=fieldreport, document=document, **eap_activation_data)
917+
return eap_activation
918+
909919
def create(self, request, *args, **kwargs):
910920
serializer = self.serialize(request.data)
911921
if not serializer.is_valid():
@@ -920,7 +930,9 @@ def create(self, request, *args, **kwargs):
920930

921931
try:
922932
# TODO: Use serializer to create fieldreport
933+
eap_activation_data = data.pop('eap_activation')
923934
fieldreport = FieldReport.objects.create(**data)
935+
self.create_eap_activation(eap_activation_data, fieldreport)
924936
CreateFieldReportSerializer.trigger_field_translation(fieldreport)
925937
except Exception as e:
926938
try:
@@ -962,12 +974,22 @@ def create(self, request, *args, **kwargs):
962974
return Response({'id': fieldreport.id}, status=HTTP_201_CREATED)
963975

964976

977+
from eap.serializers import EAPActivationSerializer
965978
class UpdateFieldReport(UpdateAPIView, GenericFieldReportView):
966979
authentication_classes = (TokenAuthentication,)
967980
permission_classes = (IsAuthenticated,)
968981
queryset = FieldReport.objects.all()
969982
serializer_class = CreateFieldReportSerializer
970983

984+
def update_eap_activation(self, eap_activation_data, fieldreport):
985+
eap_activation_data.pop('eap')
986+
document_id = eap_activation_data.pop('document')
987+
eap_activation_obj = EAPActivation.objects.get(field_report=fieldreport)
988+
eap_activation = EAPActivationSerializer().update(eap_activation_obj, eap_activation_data)
989+
eap_activation_obj.document = EAPDocument.objects.get(id=document_id)
990+
eap_activation_obj.save(update_fields=['document'])
991+
return eap_activation
992+
971993
def partial_update(self, request, *args, **kwargs):
972994
self.update(request, *args, **kwargs)
973995

@@ -981,7 +1003,8 @@ def update(self, request, *args, **kwargs):
9811003
data, locations, meta, partners = self.map_many_to_many_relations(data)
9821004

9831005
try:
984-
serializer.save()
1006+
field_report = serializer.save()
1007+
self.update_eap_activation(request.data['eap_activation'], field_report)
9851008
except Exception:
9861009
logger.error('Faild to update field report', exc_info=True)
9871010
raise BadRequest('Could not update field report')

api/models.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1924,8 +1924,8 @@ class EmergencyOperationsFR(EmergencyOperationsBase):
19241924
raw_shelter_people_targeted = None
19251925
raw_water_sanitation_and_hygiene_people_targeted = None
19261926

1927-
# Fields for the cleaned data
19281927
date_of_disaster = models.DateField(verbose_name=_('date of disaster'), null=True, blank=True)
1928+
# Fields for the cleaned data
19291929
num_of_other_partner_involved = models.TextField(verbose_name=_('number of other partner involved'), null=True, blank=True)
19301930
num_of_partner_ns_involved = models.TextField(verbose_name=_('number of NS partner involved'), null=True, blank=True)
19311931
operation_end_date = models.DateField(verbose_name=_('operation end date'), null=True, blank=True)

api/serializers.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
)
5555
from notifications.models import Subscription
5656
from deployments.models import EmergencyProject
57+
from eap.models import EAPActivation
5758

5859

5960
class GeoSerializerMixin:
@@ -1059,7 +1060,7 @@ class Meta:
10591060
model = FieldReport
10601061
fields = '__all__'
10611062

1062-
1063+
from eap.serializers import EAPActivationSerializer
10631064
class DetailFieldReportSerializer(FieldReportEnumDisplayMixin, ModelSerializer):
10641065
user = UserSerializer()
10651066
dtype = DisasterTypeSerializer()
@@ -1071,13 +1072,21 @@ class DetailFieldReportSerializer(FieldReportEnumDisplayMixin, ModelSerializer):
10711072
districts = MiniDistrictSerializer(many=True)
10721073
external_partners = ExternalPartnerSerializer(many=True)
10731074
supported_activities = SupportedActivitySerializer(many=True)
1075+
eap_activation = serializers.SerializerMethodField('get_eap_activation')
1076+
1077+
@staticmethod
1078+
def get_eap_activation(obj):
1079+
eap_activation = EAPActivation.objects.get(field_report=obj)
1080+
eap_activation_data = EAPActivationSerializer(eap_activation).data
1081+
return eap_activation_data
10741082

10751083
class Meta:
10761084
model = FieldReport
10771085
fields = '__all__'
10781086

10791087

10801088
class CreateFieldReportSerializer(FieldReportEnumDisplayMixin, ModelSerializer):
1089+
10811090
class Meta:
10821091
model = FieldReport
10831092
fields = '__all__'

api/test_views.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
EventLinkFactory,
1313
AppealFactory
1414
)
15+
from eap.factories import EAPFactory, EAPDocumentFactory
1516

1617

1718
class AuthTokenTest(APITestCase):
@@ -82,6 +83,10 @@ class FieldReportTest(APITestCase):
8283
def test_create_and_update(self):
8384
user = User.objects.create(username='jo')
8485
region = models.Region.objects.create(name=1)
86+
eap1 = EAPFactory.create(created_by=user)
87+
eap2 = EAPFactory.create(created_by=user)
88+
document1 = EAPDocumentFactory.create(created_by=self.user)
89+
document2 = EAPDocumentFactory.create(created_by=self.user)
8590
country1 = models.Country.objects.create(name='abc', region=region)
8691
country2 = models.Country.objects.create(name='xyz')
8792
body = {
@@ -105,6 +110,13 @@ def test_create_and_update(self):
105110
{'ctype': 'Originator', 'name': 'jo', 'title': 'head', 'email': '123'}
106111
],
107112
'user': user.id,
113+
'eap_activation': {
114+
'title': 'eap activation title',
115+
'eap': eap1.id,
116+
'description': 'test eap description',
117+
'trigger_met_date': '2022-11-11 00:00',
118+
'document': document1.id,
119+
}
108120
}
109121
self.client.force_authenticate(user=user)
110122
with self.capture_on_commit_callbacks(execute=True):
@@ -149,6 +161,17 @@ def test_create_and_update(self):
149161
]
150162
body['actions_taken'] = []
151163
body['visibility'] = models.VisibilityChoices.PUBLIC
164+
body['eap_activation'] = {
165+
'title': 'eap activation title updated',
166+
'eap': eap2.id,
167+
'description': 'test eap description updated',
168+
'trigger_met_date': '2022-11-11 01:00',
169+
'document': document2.id,
170+
'originator_name': 'test name',
171+
'nsc_name_operational': 'test name operational',
172+
'ifrc_focal_email': '[email protected]'
173+
}
174+
152175
response = self.client.put(f'/api/v2/update_field_report/{created.id}/', body, format='json').json()
153176
updated = models.FieldReport.objects.get(pk=response['id'])
154177

eap/admin.py

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,33 @@
11
from django.contrib import admin
22

33
# Register your models here.
4-
from .models import EAP
4+
5+
from .models import (
6+
EAP,
7+
EAPPartner,
8+
EAPReference,
9+
EAPDocument,
10+
)
11+
12+
13+
class ReferenceAdminInline(admin.TabularInline):
14+
model = EAPReference
15+
extra = 0
16+
17+
18+
class PartnerAdminInline(admin.TabularInline):
19+
model = EAPPartner
20+
extra = 0
21+
22+
23+
@admin.register(EAPDocument)
24+
class EAPDocumentAdmin(admin.ModelAdmin):
25+
model = EAPDocument
26+
extra = 0
527

628

729
@admin.register(EAP)
830
class EAPAdmin(admin.ModelAdmin):
9-
list_display = ('eap_number', 'country', 'status', 'operational_timeframe', 'total_budget')
10-
31+
list_display = ('eap_number', 'country', 'status', 'operational_timeframe',)
32+
inlines = [ReferenceAdminInline, PartnerAdminInline]
33+
autocomplete_fields = ('country', 'district', 'disaster_type', 'created_by', 'modified_by')

eap/migrations/0004_auto_20220715_0628.py renamed to eap/migrations/0004_auto_20220715_1301.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Generated by Django 2.2.28 on 2022-07-15 06:28
1+
# Generated by Django 2.2.28 on 2022-07-15 13:01
22

33
from django.db import migrations, models
44
import django.db.models.deletion
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
# Generated by Django 2.2.28 on 2022-07-19 11:06
2+
3+
from django.db import migrations, models
4+
import django.db.models.deletion
5+
6+
7+
class Migration(migrations.Migration):
8+
9+
dependencies = [
10+
('api', '0156_appealfilter_comment'),
11+
('eap', '0004_auto_20220715_1301'),
12+
]
13+
14+
operations = [
15+
migrations.CreateModel(
16+
name='EAPActivation',
17+
fields=[
18+
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
19+
('title', models.CharField(blank=True, max_length=250, null=True)),
20+
('trigger_met_date', models.DateTimeField(verbose_name='Date the trigger was met')),
21+
('description', models.TextField(verbose_name='Description of EAP Activation')),
22+
('originator_name', models.CharField(blank=True, max_length=250, null=True, verbose_name='Originator name')),
23+
('originator_title', models.CharField(blank=True, max_length=250, null=True, verbose_name='Originator title')),
24+
('originator_email', models.CharField(blank=True, max_length=250, null=True, verbose_name='Originator email')),
25+
('nsc_name_operational', models.CharField(blank=True, max_length=250, null=True, verbose_name='National Society Contact (Operational)')),
26+
('nsc_title_operational', models.CharField(blank=True, max_length=250, null=True, verbose_name='National Society Contact (Operational)')),
27+
('nsc_email_operational', models.CharField(blank=True, max_length=250, null=True, verbose_name='National Society Contact (Operational)')),
28+
('nsc_name_secretary', models.CharField(blank=True, max_length=250, null=True, verbose_name='National Society Contact (Secretary)')),
29+
('nsc_title_secretary', models.CharField(blank=True, max_length=250, null=True, verbose_name='National Society Contact (Secretary)')),
30+
('nsc_email_secretary', models.CharField(blank=True, max_length=250, null=True, verbose_name='National Society Contact (Secretary)')),
31+
('ifrc_focal_name', models.CharField(blank=True, max_length=250, null=True, verbose_name='IFRC Focal Point Name')),
32+
('ifrc_focal_title', models.CharField(blank=True, max_length=250, null=True, verbose_name='IFRC Focal Point Title')),
33+
('ifrc_focal_email', models.CharField(blank=True, max_length=250, null=True, verbose_name='IFRC Focal Point Email')),
34+
('document', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='eap_activation_document', to='eap.EAPDocument', verbose_name='EAP Activation Documents')),
35+
('eap', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='eap_activation', to='eap.EAP', verbose_name='eap')),
36+
('field_report', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='field_report_eap_activation', to='api.FieldReport', verbose_name='field report')),
37+
],
38+
),
39+
]

eap/models.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
Country,
88
District,
99
DisasterType,
10+
FieldReport,
1011
)
1112

1213

@@ -209,3 +210,42 @@ class Meta:
209210

210211
def __str__(self):
211212
return f'{self.id}'
213+
214+
215+
class EAPActivation(models.Model):
216+
title = models.CharField(max_length=250, null=True, blank=True)
217+
field_report = models.ForeignKey(
218+
FieldReport,
219+
on_delete=models.SET_NULL,
220+
related_name='field_report_eap_activation',
221+
verbose_name=_('field report'),
222+
null=True, blank=True
223+
)
224+
eap = models.ForeignKey(
225+
EAP,
226+
on_delete=models.SET_NULL,
227+
related_name='eap_activation',
228+
verbose_name=_('eap'),
229+
null=True, blank=True
230+
)
231+
trigger_met_date = models.DateTimeField(verbose_name=_('Date the trigger was met'))
232+
description = models.TextField(verbose_name=_('Description of EAP Activation'))
233+
document = models.ForeignKey(
234+
EAPDocument,
235+
on_delete=models.SET_NULL,
236+
verbose_name=_('EAP Activation Documents'),
237+
related_name='eap_activation_document',
238+
null=True, blank=True
239+
)
240+
originator_name = models.CharField(max_length=250, verbose_name=_('Originator name'), null=True, blank=True)
241+
originator_title = models.CharField(max_length=250, verbose_name=_('Originator title'), null=True, blank=True)
242+
originator_email = models.CharField(max_length=250, verbose_name=_('Originator email'), null=True, blank=True)
243+
nsc_name_operational = models.CharField(max_length=250, verbose_name=_('National Society Contact (Operational)'), null=True, blank=True)
244+
nsc_title_operational = models.CharField(max_length=250, verbose_name=_('National Society Contact (Operational)'), null=True, blank=True)
245+
nsc_email_operational = models.CharField(max_length=250, verbose_name=_('National Society Contact (Operational)'), null=True, blank=True)
246+
nsc_name_secretary = models.CharField(max_length=250, verbose_name=_('National Society Contact (Secretary)'), null=True, blank=True)
247+
nsc_title_secretary = models.CharField(max_length=250, verbose_name=_('National Society Contact (Secretary)'), null=True, blank=True)
248+
nsc_email_secretary = models.CharField(max_length=250, verbose_name=_('National Society Contact (Secretary)'), null=True, blank=True)
249+
ifrc_focal_name = models.CharField(max_length=250, verbose_name=_('IFRC Focal Point Name'), null=True, blank=True)
250+
ifrc_focal_title = models.CharField(max_length=250, verbose_name=_('IFRC Focal Point Title'), null=True, blank=True)
251+
ifrc_focal_email = models.CharField(max_length=250, verbose_name=_('IFRC Focal Point Email'), null=True, blank=True)

eap/serializers.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
EarlyActionIndicator,
2121
EAPDocument,
2222
PrioritizedRisk,
23+
EAPActivation,
2324
)
2425

2526
from main.writable_nested_serializers import (
@@ -136,3 +137,14 @@ def update(self, instance, validated_data):
136137
eap = super().update(instance, validated_data)
137138
return eap
138139

140+
141+
class EAPActivationSerializer(serializers.ModelSerializer):
142+
document_detail = EAPDocumentSerializer(source='document', read_only=True)
143+
144+
class Meta:
145+
model = EAPActivation
146+
exclude = ('eap', 'field_report')
147+
148+
def update(self, instance, validated_data):
149+
eap_activation = super().update(instance, validated_data)
150+
return eap_activation

0 commit comments

Comments
 (0)