Skip to content

Commit 7d4b299

Browse files
Merge pull request #1477 from IFRCGo/feature/early-action-protocol
Add models for EAP pre tigger
2 parents 73ecfcd + 2df7498 commit 7d4b299

File tree

11 files changed

+344
-1
lines changed

11 files changed

+344
-1
lines changed

eap/__init__.py

Whitespace-only changes.

eap/admin.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
from django.contrib import admin
2+
3+
# Register your models here.

eap/apps.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
from django.apps import AppConfig
2+
3+
4+
class EapConfig(AppConfig):
5+
name = 'eap'

eap/migrations/0001_initial.py

Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
1+
# Generated by Django 2.2.28 on 2022-07-08 05:56
2+
3+
import deployments.models
4+
from django.conf import settings
5+
from django.db import migrations, models
6+
import django.db.models.deletion
7+
import eap.models
8+
import enumfields.fields
9+
10+
11+
class Migration(migrations.Migration):
12+
13+
initial = True
14+
15+
dependencies = [
16+
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
17+
('api', '0156_appealfilter_comment'),
18+
]
19+
20+
operations = [
21+
migrations.CreateModel(
22+
name='EAP',
23+
fields=[
24+
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
25+
('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')),
26+
('modified_at', models.DateTimeField(auto_now=True, verbose_name='updated at')),
27+
('eap_number', models.CharField(max_length=50, verbose_name='EAP Number')),
28+
('approval_date', models.DateField(verbose_name='Date of EAP Approval')),
29+
('status', models.CharField(choices=[('approved', 'Approved'), ('in_process', 'In Process')], default=eap.models.EAP.Status('in_process'), max_length=255, verbose_name='EAP Status')),
30+
('operational_timeframe', models.IntegerField(verbose_name='Operational Timeframe (Months)')),
31+
('lead_time', models.IntegerField(verbose_name='Lead Time')),
32+
('eap_timeframe', models.IntegerField(verbose_name='EAP Timeframe (Years)')),
33+
('num_of_people', models.IntegerField(verbose_name='Number of People Targeted')),
34+
('total_budget', models.IntegerField(verbose_name='Total Budget (CHF)')),
35+
('readiness_budget', models.IntegerField(blank=True, null=True, verbose_name='Readiness Budget (CHF)')),
36+
('pre_positioning_budget', models.IntegerField(blank=True, null=True, verbose_name='Pre-positioning Budget (CHF)')),
37+
('early_action_budget', models.IntegerField(blank=True, null=True, verbose_name='Early Actions Budget (CHF)')),
38+
('trigger_statement', models.TextField(verbose_name='Trigger Statement (Threshold for Activation)')),
39+
('overview', models.TextField(verbose_name='EAP Overview')),
40+
('document', models.FileField(blank=True, null=True, upload_to='eap/documents/', verbose_name='EAP Documents')),
41+
('originator_name', models.CharField(blank=True, max_length=255, null=True, verbose_name='Originator Name')),
42+
('originator_title', models.CharField(blank=True, max_length=255, null=True, verbose_name='Originator Title')),
43+
('originator_email', models.CharField(blank=True, max_length=255, null=True, verbose_name='Originator Email')),
44+
('originator_phone', models.CharField(blank=True, max_length=255, null=True, verbose_name='Origingator Phone')),
45+
('nsc_name', models.CharField(blank=True, max_length=255, null=True, verbose_name='National Society Contact Name')),
46+
('nsc_title', models.CharField(blank=True, max_length=255, null=True, verbose_name='National Society Contact Title')),
47+
('nsc_email', models.CharField(blank=True, max_length=255, null=True, verbose_name='National Society Contact Email')),
48+
('nsc_phone', models.CharField(blank=True, max_length=255, null=True, verbose_name='National Society Contact Phone')),
49+
('ifrc_focal_name', models.CharField(blank=True, max_length=255, null=True, verbose_name='Ifrc Focal Point Name')),
50+
('ifrc_focal_title', models.CharField(blank=True, max_length=255, null=True, verbose_name='Ifrc Focal Point Title')),
51+
('ifrc_focal_email', models.CharField(blank=True, max_length=255, null=True, verbose_name='Ifrc Focal Point Email')),
52+
('ifrc_focal_phone', models.CharField(blank=True, max_length=255, null=True, verbose_name='Ifrc Focal Point Phone')),
53+
('country', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='eap_country', to='api.Country', verbose_name='Country')),
54+
('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='eap_created_by', to=settings.AUTH_USER_MODEL, verbose_name='Created by')),
55+
('disaster_type', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='eap_disaster_type', to='api.DisasterType', verbose_name='Disaster Type')),
56+
('district', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='eap_district', to='api.District', verbose_name='Provience/Region')),
57+
],
58+
options={
59+
'verbose_name': 'Early Action Protocol',
60+
'verbose_name_plural': 'Early Actions Protocols',
61+
},
62+
),
63+
migrations.CreateModel(
64+
name='EarlyActionIndicator',
65+
fields=[
66+
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
67+
('indicator', models.CharField(blank=True, default=eap.models.EarlyActionIndicator.IndicatorChoices('indicator_1'), max_length=255, null=True, verbose_name=[('indicator_1', 'Indicator 1'), ('indicator_2', 'Indicator 2')])),
68+
('indicator_value', models.IntegerField(blank=True, null=True)),
69+
],
70+
options={
71+
'verbose_name': 'Early Action Indicator',
72+
'verbose_name_plural': 'Early Actions Indicators',
73+
},
74+
),
75+
migrations.CreateModel(
76+
name='EarlyAction',
77+
fields=[
78+
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
79+
('sector', enumfields.fields.EnumIntegerField(enum=deployments.models.Sectors, verbose_name='sector')),
80+
('budget_per_sector', models.IntegerField(blank=True, null=True, verbose_name='Budget per sector (CHF)')),
81+
('prioritized_risk', models.TextField(blank=True, null=True, verbose_name='Prioritized risk')),
82+
('targeted_people', models.IntegerField(blank=True, null=True, verbose_name='Targeted people')),
83+
('readiness_activities', models.TextField(blank=True, null=True, verbose_name='Readiness Activities')),
84+
('prepositioning_activities', models.TextField(blank=True, null=True, verbose_name='Pre-positioning Activities')),
85+
('indicators', models.ManyToManyField(blank=True, to='eap.EarlyActionIndicator', verbose_name='Indicators')),
86+
],
87+
options={
88+
'verbose_name': 'Early Action',
89+
'verbose_name_plural': 'Early Actions',
90+
},
91+
),
92+
migrations.CreateModel(
93+
name='EAPRefrence',
94+
fields=[
95+
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
96+
('source', models.CharField(blank=True, max_length=255, null=True, verbose_name='Name')),
97+
('url', models.URLField(blank=True, null=True, verbose_name='URL')),
98+
('eap', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='eap_reference', to='eap.EAP', verbose_name='EAP')),
99+
],
100+
options={
101+
'verbose_name': 'EAP Refrence',
102+
'verbose_name_plural': 'EAP Refrences',
103+
},
104+
),
105+
migrations.CreateModel(
106+
name='EAPPartner',
107+
fields=[
108+
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
109+
('name', models.CharField(blank=True, max_length=255, null=True, verbose_name='Name')),
110+
('url', models.URLField(blank=True, null=True, verbose_name='URL')),
111+
('eap', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='eap_partner', to='eap.EAP', verbose_name='EAP')),
112+
],
113+
options={
114+
'verbose_name': 'EAP Partner',
115+
'verbose_name_plural': 'EAP Partners',
116+
},
117+
),
118+
migrations.AddField(
119+
model_name='eap',
120+
name='early_actions',
121+
field=models.ManyToManyField(blank=True, to='eap.EarlyAction', verbose_name='Early actions'),
122+
),
123+
migrations.AddField(
124+
model_name='eap',
125+
name='modified_by',
126+
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='eap_modified_by', to=settings.AUTH_USER_MODEL, verbose_name='Modified by'),
127+
),
128+
migrations.CreateModel(
129+
name='Action',
130+
fields=[
131+
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
132+
('early_act', models.TextField(blank=True, null=True, verbose_name='Early Actions')),
133+
('early_action', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='action', to='eap.EarlyAction', verbose_name='Early Actions')),
134+
],
135+
options={
136+
'verbose_name': 'Action',
137+
'verbose_name_plural': 'Actions',
138+
},
139+
),
140+
]
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# Generated by Django 2.2.27 on 2022-07-08 07:47
2+
3+
from django.db import migrations
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
('eap', '0001_initial'),
10+
]
11+
12+
operations = [
13+
migrations.RenameModel(
14+
old_name='EAPRefrence',
15+
new_name='EAPReference',
16+
),
17+
migrations.AlterModelOptions(
18+
name='eapreference',
19+
options={'verbose_name': 'EAP Reference', 'verbose_name_plural': 'EAP References'},
20+
),
21+
]

eap/migrations/__init__.py

Whitespace-only changes.

eap/models.py

Lines changed: 167 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,167 @@
1+
from django.db import models
2+
from django.conf import settings
3+
from django.utils.translation import ugettext_lazy as _
4+
5+
from main.enums import TextChoices
6+
from deployments.models import Sectors
7+
from enumfields import EnumIntegerField
8+
from api.models import (
9+
Country,
10+
District,
11+
DisasterType,
12+
)
13+
14+
15+
class EarlyActionIndicator(models.Model):
16+
class IndicatorChoices(TextChoices): # TODO these indicator are yet to be provided by client.
17+
INDICATOR_1 = 'indicator_1', _('Indicator 1')
18+
INDICATOR_2 = 'indicator_2', _('Indicator 2')
19+
20+
indicator = models.CharField(
21+
IndicatorChoices.choices, max_length=255,
22+
default=IndicatorChoices.INDICATOR_1, null=True, blank=True
23+
)
24+
indicator_value = models.IntegerField(null=True, blank=True)
25+
26+
class Meta:
27+
verbose_name = _('Early Action Indicator')
28+
verbose_name_plural = _('Early Actions Indicators')
29+
30+
def __str__(self):
31+
return f'{self.indicator}'
32+
33+
34+
class EarlyAction(models.Model):
35+
sector = EnumIntegerField(Sectors, verbose_name=_('sector'))
36+
budget_per_sector = models.IntegerField(verbose_name=_('Budget per sector (CHF)'), null=True, blank=True)
37+
indicators = models.ManyToManyField(EarlyActionIndicator, verbose_name=_('Indicators'), blank=True)
38+
39+
prioritized_risk = models.TextField(verbose_name=_('Prioritized risk'), null=True, blank=True)
40+
targeted_people = models.IntegerField(verbose_name=_('Targeted people'), null=True, blank=True,)
41+
42+
readiness_activities = models.TextField(verbose_name=_('Readiness Activities'), null=True, blank=True)
43+
prepositioning_activities = models.TextField(verbose_name=_('Pre-positioning Activities'), null=True, blank=True)
44+
45+
class Meta:
46+
verbose_name = _('Early Action')
47+
verbose_name_plural = _('Early Actions')
48+
49+
def __str__(self):
50+
return f'{self.sector}'
51+
52+
53+
class EAP(models.Model):
54+
class Status(TextChoices): # TODO some more status choices are to be expected by client.
55+
APPROVED = 'approved', _('Approved')
56+
IN_PROCESS = 'in_process', _('In Process')
57+
58+
created_by = models.ForeignKey(
59+
settings.AUTH_USER_MODEL, verbose_name=_('Created by'), related_name='eap_created_by',
60+
null=True, blank=True, on_delete=models.SET_NULL,
61+
)
62+
modified_by = models.ForeignKey(
63+
settings.AUTH_USER_MODEL, verbose_name=_('Modified by'), related_name='eap_modified_by',
64+
null=True, blank=True, on_delete=models.SET_NULL,
65+
)
66+
created_at = models.DateTimeField(verbose_name=_('created at'), auto_now_add=True)
67+
modified_at = models.DateTimeField(verbose_name=_('updated at'), auto_now=True)
68+
69+
country = models.ForeignKey(
70+
Country, on_delete=models.SET_NULL, verbose_name=_('Country'),
71+
related_name='eap_country', null=True
72+
)
73+
district = models.ForeignKey(
74+
District, on_delete=models.SET_NULL, verbose_name=_('Provience/Region'),
75+
related_name='eap_district', null=True, blank=True
76+
)
77+
disaster_type = models.ForeignKey(
78+
DisasterType, on_delete=models.SET_NULL, verbose_name=_('Disaster Type'),
79+
related_name='eap_disaster_type', null=True
80+
)
81+
eap_number = models.CharField(max_length=50, verbose_name=_('EAP Number'))
82+
approval_date = models.DateField(verbose_name=_('Date of EAP Approval'))
83+
status = models.CharField(
84+
max_length=255, choices=Status.choices, default=Status.IN_PROCESS,
85+
verbose_name=_('EAP Status')
86+
)
87+
operational_timeframe = models.IntegerField(verbose_name=_('Operational Timeframe (Months)'))
88+
lead_time = models.IntegerField(verbose_name=_('Lead Time'))
89+
eap_timeframe = models.IntegerField(verbose_name=_('EAP Timeframe (Years)'))
90+
num_of_people = models.IntegerField(verbose_name=_('Number of People Targeted'))
91+
total_budget = models.IntegerField(verbose_name=_('Total Budget (CHF)'))
92+
readiness_budget = models.IntegerField(verbose_name=_('Readiness Budget (CHF)'), null=True, blank=True)
93+
pre_positioning_budget = models.IntegerField(verbose_name=_('Pre-positioning Budget (CHF)'), null=True, blank=True)
94+
early_action_budget = models.IntegerField(verbose_name=_('Early Actions Budget (CHF)'), null=True, blank=True)
95+
trigger_statement = models.TextField(verbose_name=_('Trigger Statement (Threshold for Activation)'))
96+
overview = models.TextField(verbose_name=_('EAP Overview'))
97+
document = models.FileField(
98+
verbose_name=_('EAP Documents'), upload_to='eap/documents/',
99+
null=True, blank=True
100+
)
101+
early_actions = models.ManyToManyField(
102+
EarlyAction,
103+
verbose_name=_('Early actions'),
104+
blank=True
105+
)
106+
originator_name = models.CharField(verbose_name=_('Originator Name'), max_length=255, null=True, blank=True)
107+
originator_title = models.CharField(verbose_name=_('Originator Title'), max_length=255, null=True, blank=True)
108+
originator_email = models.CharField(verbose_name=_('Originator Email'), max_length=255, null=True, blank=True)
109+
originator_phone = models.CharField(verbose_name=_('Origingator Phone'), max_length=255, null=True, blank=True)
110+
111+
nsc_name = models.CharField(verbose_name=_('National Society Contact Name'), max_length=255, null=True, blank=True)
112+
nsc_title = models.CharField(verbose_name=_('National Society Contact Title'), max_length=255, null=True, blank=True)
113+
nsc_email = models.CharField(verbose_name=_('National Society Contact Email'), max_length=255, null=True, blank=True)
114+
nsc_phone = models.CharField(verbose_name=_('National Society Contact Phone'), max_length=255, null=True, blank=True)
115+
116+
ifrc_focal_name = models.CharField(verbose_name=_('Ifrc Focal Point Name'), max_length=255, null=True, blank=True)
117+
ifrc_focal_title = models.CharField(verbose_name=_('Ifrc Focal Point Title'), max_length=255, null=True, blank=True)
118+
ifrc_focal_email = models.CharField(verbose_name=_('Ifrc Focal Point Email'), max_length=255, null=True, blank=True)
119+
ifrc_focal_phone = models.CharField(verbose_name=_('Ifrc Focal Point Phone'), max_length=255, null=True, blank=True)
120+
121+
class Meta:
122+
verbose_name = _('Early Action Protocol')
123+
verbose_name_plural = _('Early Actions Protocols')
124+
125+
def __str__(self):
126+
return f'{self.eap_number}'
127+
128+
129+
class EAPPartner(models.Model):
130+
eap = models.ForeignKey(EAP, on_delete=models.CASCADE, related_name='eap_partner', verbose_name=_('EAP'))
131+
name = models.CharField(max_length=255, verbose_name=_('Name'), null=True, blank=True)
132+
url = models.URLField(verbose_name=_('URL'), null=True, blank=True)
133+
134+
class Meta:
135+
verbose_name = _('EAP Partner')
136+
verbose_name_plural = _('EAP Partners')
137+
138+
def __str__(self):
139+
return f'{self.name}'
140+
141+
142+
class EAPReference(models.Model):
143+
eap = models.ForeignKey(EAP, on_delete=models.CASCADE, related_name='eap_reference', verbose_name=_('EAP'))
144+
source = models.CharField(max_length=255, verbose_name=_('Name'), null=True, blank=True)
145+
url = models.URLField(verbose_name=_('URL'), null=True, blank=True)
146+
147+
class Meta:
148+
verbose_name = _('EAP Reference')
149+
verbose_name_plural = _('EAP References')
150+
151+
def __str__(self):
152+
return f'{self.source}'
153+
154+
155+
class Action(models.Model):
156+
early_action = models.ForeignKey(
157+
EarlyAction, on_delete=models.CASCADE,
158+
related_name="action", verbose_name=_('Early Actions')
159+
)
160+
early_act = models.TextField(verbose_name=_('Early Actions'), null=True, blank=True)
161+
162+
class Meta:
163+
verbose_name = _('Action')
164+
verbose_name_plural = _('Actions')
165+
166+
def __str__(self):
167+
return f'{self.id}'

eap/tests.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
from django.test import TestCase
2+
3+
# Create your tests here.

eap/views.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
from django.shortcuts import render
2+
3+
# Create your views here.

flash_update/utils.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ def get_email_context(instance):
4747
map_list = generate_file_data(map_data)
4848
graphics_list = generate_file_data(graphics_data)
4949
actions_taken = [dict(action_taken) for action_taken in flash_update_data['actions_taken']]
50-
resources = [dict(refrence) for refrence in flash_update_data['references']]
50+
resources = [dict(reference) for reference in flash_update_data['references']]
5151
documents_map = {
5252
document.id: document.file.url
5353
for document in FlashGraphicMap.objects.filter(

0 commit comments

Comments
 (0)