Skip to content

Commit 2c0a0fb

Browse files
committed
feat(dref): add event on dref
1 parent 2d148ef commit 2c0a0fb

7 files changed

Lines changed: 62 additions & 6 deletions

File tree

api/serializers.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1078,6 +1078,7 @@ class ListEventSerializer(ModelSerializer):
10781078
dtype = DisasterTypeSerializer(required=False)
10791079
ifrc_severity_level_display = serializers.CharField(source="get_ifrc_severity_level_display", read_only=True)
10801080
active_deployments = serializers.IntegerField(read_only=True)
1081+
visibility_display = serializers.CharField(source="get_visibility_display", read_only=True)
10811082

10821083
class Meta:
10831084
model = Event
@@ -1107,6 +1108,8 @@ class Meta:
11071108
"tab_three_title",
11081109
"emergency_response_contact_email",
11091110
"active_deployments",
1111+
"visibility",
1112+
"visibility_display",
11101113
)
11111114

11121115

assets

dref/filter_set.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import django_filters as filters
22
from django.db import models
33

4-
from api.models import Country, DisasterType
4+
from api.models import Country, DisasterType, Event
55
from dref.models import Dref, DrefFinalReport, DrefOperationalUpdate
66

77

@@ -39,6 +39,10 @@ class BaseDrefFilterSet(filters.FilterSet):
3939
field_name="disaster_type",
4040
queryset=DisasterType.objects.all(),
4141
)
42+
event = filters.ModelChoiceFilter(
43+
field_name="event",
44+
queryset=Event.objects.all(),
45+
)
4246
appeal_code = filters.CharFilter(field_name="appeal_code", lookup_expr="icontains")
4347

4448

dref/migrations/0089_dref_event.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
# Generated by Django 4.2.29 on 2026-04-06 08:02
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', '0230_alter_districtgeoms_district'),
11+
('dref', '0088_remove_identifiedneed_title_ar_and_more'),
12+
]
13+
14+
operations = [
15+
migrations.AddField(
16+
model_name='dref',
17+
name='event',
18+
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='dref_event', to='api.event', verbose_name='event'),
19+
),
20+
]

dref/models.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
from django.utils.translation import gettext_lazy as _
1212
from pdf2image import convert_from_bytes
1313

14-
from api.models import Country, DisasterType, District, FieldReport
14+
from api.models import Country, DisasterType, District, Event, FieldReport
1515
from deployments.models import Sector
1616
from main.fields import SecureFileField
1717

@@ -295,6 +295,15 @@ class Status(models.IntegerChoices):
295295
related_name="modified_by_dref",
296296
)
297297
users = models.ManyToManyField(settings.AUTH_USER_MODEL, verbose_name=_("users"), blank=True, related_name="user_dref")
298+
299+
event = models.ForeignKey[Event](
300+
Event,
301+
verbose_name=_("event"),
302+
on_delete=models.SET_NULL,
303+
null=True,
304+
blank=True,
305+
related_name="dref_event",
306+
)
298307
field_report = models.ForeignKey(
299308
FieldReport,
300309
verbose_name=_("field report"),

dref/serializers.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,10 @@
1111
from drf_spectacular.utils import extend_schema_field
1212
from rest_framework import serializers
1313

14-
from api.models import Appeal
14+
from api.models import Appeal, Event
1515
from api.serializers import (
1616
DisasterTypeSerializer,
17+
ListEventSerializer,
1718
MiniCountrySerializer,
1819
MiniDistrictSerializer,
1920
UserNameSerializer,
@@ -217,6 +218,7 @@ class MiniDrefSerializer(serializers.ModelSerializer):
217218
operational_update_details = serializers.SerializerMethodField()
218219
final_report_details = serializers.SerializerMethodField()
219220
starting_language = serializers.CharField(read_only=True)
221+
event_detail = ListEventSerializer(source="event", read_only=True)
220222

221223
class Meta:
222224
model = Dref
@@ -248,6 +250,7 @@ class Meta:
248250
"status_display",
249251
"date_of_approval",
250252
"starting_language",
253+
"event_detail",
251254
]
252255

253256
@extend_schema_field(MiniOperationalUpdateActiveSerializer(many=True))
@@ -431,6 +434,7 @@ class DrefSerializer(NestedUpdateMixin, NestedCreateMixin, ModelSerializer):
431434
source="contingency_plans_supporting_document", read_only=True, required=False, allow_null=True
432435
)
433436
proposed_action = ProposedActionSerializer(many=True, required=False)
437+
event = serializers.PrimaryKeyRelatedField(queryset=Event.objects.all(), required=False)
434438

435439
class Meta:
436440
model = Dref
@@ -1598,6 +1602,7 @@ class CompletedDrefOperationsSerializer(serializers.ModelSerializer):
15981602
application_type = serializers.SerializerMethodField()
15991603
application_type_display = serializers.SerializerMethodField()
16001604
starting_language = serializers.CharField(read_only=True)
1605+
event_detail = ListEventSerializer(source="dref__event", read_only=True)
16011606

16021607
class Meta:
16031608
model = DrefFinalReport
@@ -1616,6 +1621,7 @@ class Meta:
16161621
"status",
16171622
"status_display",
16181623
"starting_language",
1624+
"event_detail",
16191625
)
16201626

16211627
def get_application_type(self, obj) -> str:

dref/test_views.py

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
from django.core import management
1111
from rest_framework import status
1212

13+
from api.factories.event import EventFactory
1314
from api.models import Country, DisasterType, District, Region, RegionName
1415
from api.utils import get_model_name
1516
from deployments.factories.project import SectorFactory
@@ -119,6 +120,7 @@ def test_post_dref_creation(self, send_notification):
119120
old_count = Dref.objects.count()
120121
national_society = Country.objects.create(name="xzz")
121122
disaster_type = DisasterType.objects.create(name="abc")
123+
event = EventFactory.create(name="Test event")
122124
data = {
123125
"title": "Dref test title",
124126
"type_of_onset": Dref.OnsetType.SLOW.value,
@@ -182,6 +184,7 @@ def test_post_dref_creation(self, send_notification):
182184
"originator_email": "test@gmail.com",
183185
"national_society": national_society.id,
184186
"disaster_type": disaster_type.id,
187+
"event": event.id,
185188
# NOTE: Test Many to Many fields
186189
"risk_security": [
187190
{"risk": "Test Risk 1", "mitigation_measure": "Test Mitigation Measure"},
@@ -246,6 +249,7 @@ def test_post_dref_creation(self, send_notification):
246249
response = self.client.post(url, data, format="json")
247250
self.assertEqual(response.status_code, 201)
248251
self.assertEqual(Dref.objects.count(), old_count + 1)
252+
self.assertEqual(response.data["event"], event.id)
249253
instance = Dref.objects.get(id=response.data["id"])
250254
instance.users.add(self.user.id)
251255
instance_user_email = [user.email for user in instance.users.all()]
@@ -1928,10 +1932,14 @@ def test_completed_dref_operations(self):
19281932
def test_filter_active_dref(self):
19291933
country_1 = Country.objects.create(name="country1")
19301934
country_2 = Country.objects.create(name="country2")
1931-
1935+
event = EventFactory.create(name="Test Event")
19321936
# create some dref
19331937
dref_1 = DrefFactory.create(
1934-
is_active=True, type_of_dref=Dref.DrefType.ASSESSMENT, country=country_1, created_by=self.root_user
1938+
is_active=True,
1939+
type_of_dref=Dref.DrefType.ASSESSMENT,
1940+
country=country_1,
1941+
created_by=self.root_user,
1942+
event=event,
19351943
)
19361944
dref_2 = DrefFactory.create(is_active=True, type_of_dref=Dref.DrefType.LOAN, country=country_2, created_by=self.root_user)
19371945
# some dref final report
@@ -1968,6 +1976,12 @@ def test_filter_active_dref(self):
19681976
self.assertEqual(len(response.data["results"]), 1)
19691977
self.assertEqual(response.data["results"][0]["final_report_details"]["id"], dref_final_report.id)
19701978

1979+
# filter by event
1980+
url = f"/api/v2/active-dref/?event={event.id}"
1981+
response = self.client.get(url)
1982+
self.assertEqual(response.status_code, 200)
1983+
self.assertEqual(len(response.data["results"]), 1)
1984+
19711985
def test_dref_share_users(self):
19721986
user1 = UserFactory.create(
19731987
username="user1@test.com",

0 commit comments

Comments
 (0)