Skip to content

Commit 3849f57

Browse files
committed
Generate emergency title and add skip title generation flag
1 parent b0572d6 commit 3849f57

File tree

15 files changed

+287
-153
lines changed

15 files changed

+287
-153
lines changed

api/admin.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -248,12 +248,14 @@ def changeform_view(self, request, *args, **kwargs):
248248
"field_reports",
249249
"auto_generated_source",
250250
"parent_event",
251+
"name",
251252
)
252253
else:
253254
self.readonly_fields = (
254255
"appeals",
255256
"field_reports",
256257
"auto_generated_source",
258+
"name",
257259
)
258260

259261
return super(EventAdmin, self).changeform_view(request, *args, **kwargs)
@@ -337,7 +339,7 @@ class FieldReportAdmin(CompareVersionAdmin, RegionRestrictedAdmin, TranslationAd
337339
def create_events(self, request, queryset):
338340
for report in queryset:
339341
event = models.Event.objects.create(
340-
name=report.summary,
342+
title=report.title,
341343
dtype=getattr(report, "dtype"),
342344
disaster_start_date=getattr(report, "created_at"),
343345
auto_generated=True,

api/factories/event.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ class Meta:
2323
model = Event
2424

2525
name = fuzzy.FuzzyText(length=50)
26+
title = fuzzy.FuzzyText(length=10)
2627
slug = fuzzy.FuzzyText(length=50)
2728
dtype = factory.SubFactory(DisasterTypeFactory)
2829

api/management/commands/create_events.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,12 @@ def handle(self, *args, **options):
1414
print("Creating %s events" % len(appeals_without_events))
1515
for appeal in appeals_without_events:
1616
fields = {
17-
"name": appeal.name,
17+
"title": appeal.name,
1818
"dtype": appeal.dtype,
1919
"disaster_start_date": appeal.start_date,
2020
"auto_generated": True,
2121
"auto_generated_source": SOURCES["appeal_admin"],
22+
"skip_auto_generate_name": True,
2223
}
2324
event = Event.objects.create(**fields)
2425
if appeal.country is not None:

api/management/commands/ingest_gdacs.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,11 +100,12 @@ def handle(self, *args, **options):
100100
title = "%s..." % title[:97]
101101

102102
fields = {
103-
"name": title,
103+
"title": title,
104104
"summary": data["description"],
105105
"disaster_start_date": data["publication_date"],
106106
"auto_generated": True,
107107
"auto_generated_source": SOURCES["gdacs"],
108+
"skip_auto_generate_name": True,
108109
"ifrc_severity_level": data["alert_level"],
109110
}
110111
event = Event.objects.create(**fields)

api/management/commands/ingest_who.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,11 +127,12 @@ def handle(self, *args, **options):
127127
summary = data["description"] + " (" + data["category"] + ")"
128128

129129
fields = {
130-
"name": title,
130+
"title": title,
131131
"summary": summary,
132132
"disaster_start_date": date,
133133
"auto_generated": True,
134134
"auto_generated_source": data["guid"],
135+
"skip_auto_generate_name": True,
135136
"ifrc_severity_level": alert_level,
136137
}
137138
# TODO: fields['name'] sometimes exceeds 100 maxlength, so will need some altering if this will be used
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
# Generated by Django 4.2.17 on 2025-02-24 06:59
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
("api", "0218_remove_event_title_remove_event_title_ar_and_more"),
10+
]
11+
12+
operations = [
13+
migrations.AddField(
14+
model_name="event",
15+
name="skip_auto_generate_name",
16+
field=models.BooleanField(
17+
default=False, help_text="<b>If checked, the name of the Emergency will not be auto-generated. </b>"
18+
),
19+
),
20+
migrations.AddField(
21+
model_name="event",
22+
name="title",
23+
field=models.CharField(
24+
blank=True,
25+
help_text="Title is used to generate the name of the Emergency. </br>The name is constructed as: <b><i>Country IS03 or Name: Disaster Type - Start Date - Title</b><i>",
26+
max_length=256,
27+
),
28+
),
29+
migrations.AddField(
30+
model_name="event",
31+
name="title_ar",
32+
field=models.CharField(
33+
blank=True,
34+
help_text="Title is used to generate the name of the Emergency. </br>The name is constructed as: <b><i>Country IS03 or Name: Disaster Type - Start Date - Title</b><i>",
35+
max_length=256,
36+
null=True,
37+
),
38+
),
39+
migrations.AddField(
40+
model_name="event",
41+
name="title_en",
42+
field=models.CharField(
43+
blank=True,
44+
help_text="Title is used to generate the name of the Emergency. </br>The name is constructed as: <b><i>Country IS03 or Name: Disaster Type - Start Date - Title</b><i>",
45+
max_length=256,
46+
null=True,
47+
),
48+
),
49+
migrations.AddField(
50+
model_name="event",
51+
name="title_es",
52+
field=models.CharField(
53+
blank=True,
54+
help_text="Title is used to generate the name of the Emergency. </br>The name is constructed as: <b><i>Country IS03 or Name: Disaster Type - Start Date - Title</b><i>",
55+
max_length=256,
56+
null=True,
57+
),
58+
),
59+
migrations.AddField(
60+
model_name="event",
61+
name="title_fr",
62+
field=models.CharField(
63+
blank=True,
64+
help_text="Title is used to generate the name of the Emergency. </br>The name is constructed as: <b><i>Country IS03 or Name: Disaster Type - Start Date - Title</b><i>",
65+
max_length=256,
66+
null=True,
67+
),
68+
),
69+
]

api/models.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -741,6 +741,19 @@ def snippet_image_path(instance, filename):
741741
class Event(models.Model):
742742
"""A disaster, which could cover multiple countries"""
743743

744+
title = models.CharField(
745+
max_length=256,
746+
blank=True,
747+
help_text=_(
748+
"Title is used to generate the name of the Emergency. </br>"
749+
"The name is constructed as: "
750+
"<b><i>Country IS03 or Name: Disaster Type - Start Date - Title</b><i>"
751+
),
752+
)
753+
skip_auto_generate_name = models.BooleanField(
754+
default=False,
755+
help_text=_("<b>If checked, the name of the Emergency will not be auto-generated. </b>"),
756+
)
744757
name = models.CharField(verbose_name=_("name"), max_length=256)
745758
dtype = models.ForeignKey(DisasterType, verbose_name=_("disaster type"), null=True, on_delete=models.SET_NULL)
746759
disaster_start_date = models.DateTimeField(verbose_name=_("disaster start date"))
@@ -872,6 +885,22 @@ def record_type(self):
872885
def to_dict(self):
873886
return to_dict(self)
874887

888+
def generate_formatted_name(self):
889+
disaster_start_date = self.disaster_start_date.strftime("%m-%Y")
890+
# NOTE: using the country name if the iso3 is not available eg: Africa Region
891+
country_iso3_or_name = (
892+
self.countries.first().iso3 or self.countries.first().name if self.id and self.countries.first() else "N/A"
893+
)
894+
for lang in AVAILABLE_LANGUAGES:
895+
with translation_override(lang):
896+
dtype = self.dtype.name if self.dtype else "N/A"
897+
# NOTE: Skip Auto generating name if the skip_auto_generate_name is True
898+
if self.skip_auto_generate_name:
899+
self.name = self.title
900+
else:
901+
self.name = f"{country_iso3_or_name}: {dtype} - {disaster_start_date} - {self.title}"
902+
yield build_localized_fieldname("name", lang)
903+
875904
def save(self, *args, **kwargs):
876905

877906
# Make the slug lowercase
@@ -882,6 +911,15 @@ def save(self, *args, **kwargs):
882911
if not self.id and not self.disaster_start_date:
883912
self.disaster_start_date = timezone.now()
884913

914+
updated_name_fields = list(self.generate_formatted_name())
915+
916+
# Updating the updated_fields with the fields that are updated
917+
if kwargs.get("update_fields"):
918+
kwargs["update_fields"] = (
919+
*kwargs["update_fields"],
920+
*updated_name_fields,
921+
)
922+
885923
return super(Event, self).save(*args, **kwargs)
886924

887925
def __str__(self):

api/receivers.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -288,6 +288,15 @@ def remove_appeal_filter(sender, instance, using, **kwargs):
288288
appealFilter.save()
289289

290290

291+
@receiver(m2m_changed, sender=Event.countries.through)
292+
def update_event_name(sender, instance, action, **kwargs):
293+
"""
294+
Update the event name when the countries are changed.
295+
"""
296+
if action in ["post_add", "post_remove"]:
297+
instance.save()
298+
299+
291300
@receiver(m2m_changed, sender=FieldReport.countries.through)
292301
def update_fieldreport_summary(sender, instance, action, **kwargs):
293302
"""

api/serializers.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1164,6 +1164,7 @@ class Meta:
11641164
"dtype",
11651165
"countries",
11661166
"summary",
1167+
"title",
11671168
"num_affected",
11681169
"ifrc_severity_level",
11691170
"ifrc_severity_level_display",
@@ -1215,6 +1216,7 @@ class Meta:
12151216
"dtype_name",
12161217
"countries",
12171218
"summary",
1219+
"title",
12181220
"num_affected",
12191221
"ifrc_severity_level",
12201222
"glide",
@@ -1299,6 +1301,7 @@ class Meta:
12991301
"countries",
13001302
"districts",
13011303
"summary",
1304+
"title",
13021305
"num_affected",
13031306
"tab_two_title",
13041307
"tab_three_title",
@@ -2056,7 +2059,7 @@ class Meta:
20562059

20572060
def create_event(self, report):
20582061
event = Event.objects.create(
2059-
name=report.summary,
2062+
title=report.title,
20602063
dtype=report.dtype,
20612064
summary=report.description or "",
20622065
disaster_start_date=report.start_date,

api/test_models.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,14 @@ class EventTest(TestCase):
2626

2727
def setUp(self):
2828
dtype = models.DisasterType.objects.get(pk=1)
29-
models.Event.objects.create(name="disaster1", summary="test disaster", dtype=dtype)
30-
event = models.Event.objects.create(name="disaster2", summary="another test disaster", dtype=dtype)
29+
models.Event.objects.create(title="disaster1", summary="test disaster", dtype=dtype)
30+
event = models.Event.objects.create(title="disaster2", summary="another test disaster", dtype=dtype)
3131
models.KeyFigure.objects.create(event=event, number=7, deck="things", source="website")
3232
models.Snippet.objects.create(event=event, snippet="this is a snippet")
3333

3434
def test_disaster_create(self):
35-
obj1 = models.Event.objects.get(name="disaster1")
36-
obj2 = models.Event.objects.get(name="disaster2")
35+
obj1 = models.Event.objects.get(title="disaster1")
36+
obj2 = models.Event.objects.get(title="disaster2")
3737
self.assertEqual(obj1.summary, "test disaster")
3838
self.assertEqual(obj2.summary, "another test disaster")
3939
keyfig = obj2.key_figures.all()
@@ -68,7 +68,7 @@ def test_profile_create(self):
6868
class AppealTest(APITestCase):
6969
def setUp(self):
7070
# An appeal with needs_confirmation=True should not return the event in the API response.
71-
event = models.Event.objects.create(name="associated event", summary="foo")
71+
event = models.Event.objects.create(title="associated event", summary="foo")
7272
country = models.Country.objects.create(name="country")
7373
models.Appeal.objects.create(
7474
aid="test1", name="appeal", atype=1, code="abc", needs_confirmation=True, event=event, country=country
@@ -87,13 +87,13 @@ class FieldReportTest(TestCase):
8787

8888
def setUp(self):
8989
dtype = models.DisasterType.objects.get(pk=1)
90-
event = models.Event.objects.create(name="disaster1", summary="test disaster", dtype=dtype)
90+
event = models.Event.objects.create(title="disaster1", summary="test disaster", dtype=dtype)
9191
country = models.Country.objects.create(name="country")
9292
report = models.FieldReport.objects.create(rid="test1", event=event, dtype=dtype)
9393
report.countries.add(country)
9494

9595
def test_field_report_create(self):
96-
event = models.Event.objects.get(name="disaster1")
96+
event = models.Event.objects.get(title="disaster1")
9797
country = models.Country.objects.get(name="country")
9898
self.assertEqual(event.field_reports.all()[0].countries.all()[0], country)
9999
obj = models.FieldReport.objects.get(rid="test1")

0 commit comments

Comments
 (0)