Skip to content

Commit dde8be0

Browse files
Merge pull request #2419 from IFRCGo/fix/skip-title-generation
Remove title generation for emergency
2 parents 4c072d3 + b2e757c commit dde8be0

File tree

13 files changed

+191
-132
lines changed

13 files changed

+191
-132
lines changed

api/admin.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,6 @@ class EventAdmin(CompareVersionAdmin, RegionRestrictedAdmin, TranslationAdmin):
225225
"districts",
226226
"parent_event",
227227
)
228-
readonly_fields = ("name",)
229228

230229
def appeals(self, instance):
231230
if getattr(instance, "appeals").exists():
@@ -249,14 +248,12 @@ def changeform_view(self, request, *args, **kwargs):
249248
"field_reports",
250249
"auto_generated_source",
251250
"parent_event",
252-
"name",
253251
)
254252
else:
255253
self.readonly_fields = (
256254
"appeals",
257255
"field_reports",
258256
"auto_generated_source",
259-
"name",
260257
)
261258

262259
return super(EventAdmin, self).changeform_view(request, *args, **kwargs)
@@ -340,7 +337,7 @@ class FieldReportAdmin(CompareVersionAdmin, RegionRestrictedAdmin, TranslationAd
340337
def create_events(self, request, queryset):
341338
for report in queryset:
342339
event = models.Event.objects.create(
343-
title=report.title,
340+
name=report.summary,
344341
dtype=getattr(report, "dtype"),
345342
disaster_start_date=getattr(report, "created_at"),
346343
auto_generated=True,

api/factories/event.py

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

2525
name = fuzzy.FuzzyText(length=50)
26-
title = fuzzy.FuzzyText(length=10)
2726
slug = fuzzy.FuzzyText(length=50)
2827
dtype = factory.SubFactory(DisasterTypeFactory)
2928

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
# Generated by Django 4.2.17 on 2025-02-20 09:14
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
("api", "0217_merge_20250107_1019"),
10+
]
11+
12+
operations = [
13+
migrations.RemoveField(
14+
model_name="event",
15+
name="title",
16+
),
17+
migrations.RemoveField(
18+
model_name="event",
19+
name="title_ar",
20+
),
21+
migrations.RemoveField(
22+
model_name="event",
23+
name="title_en",
24+
),
25+
migrations.RemoveField(
26+
model_name="event",
27+
name="title_es",
28+
),
29+
migrations.RemoveField(
30+
model_name="event",
31+
name="title_fr",
32+
),
33+
migrations.AlterField(
34+
model_name="fieldreport",
35+
name="title",
36+
field=models.CharField(
37+
blank=True,
38+
help_text="Title is used to generate the summary/name of the Field Report. </br>The summary is constructed as: <b><i>Country IS03: Disaster Type - Start Date - Title - Field Report Number - (date)</b><i>",
39+
max_length=256,
40+
),
41+
),
42+
migrations.AlterField(
43+
model_name="fieldreport",
44+
name="title_ar",
45+
field=models.CharField(
46+
blank=True,
47+
help_text="Title is used to generate the summary/name of the Field Report. </br>The summary is constructed as: <b><i>Country IS03: Disaster Type - Start Date - Title - Field Report Number - (date)</b><i>",
48+
max_length=256,
49+
null=True,
50+
),
51+
),
52+
migrations.AlterField(
53+
model_name="fieldreport",
54+
name="title_en",
55+
field=models.CharField(
56+
blank=True,
57+
help_text="Title is used to generate the summary/name of the Field Report. </br>The summary is constructed as: <b><i>Country IS03: Disaster Type - Start Date - Title - Field Report Number - (date)</b><i>",
58+
max_length=256,
59+
null=True,
60+
),
61+
),
62+
migrations.AlterField(
63+
model_name="fieldreport",
64+
name="title_es",
65+
field=models.CharField(
66+
blank=True,
67+
help_text="Title is used to generate the summary/name of the Field Report. </br>The summary is constructed as: <b><i>Country IS03: Disaster Type - Start Date - Title - Field Report Number - (date)</b><i>",
68+
max_length=256,
69+
null=True,
70+
),
71+
),
72+
migrations.AlterField(
73+
model_name="fieldreport",
74+
name="title_fr",
75+
field=models.CharField(
76+
blank=True,
77+
help_text="Title is used to generate the summary/name of the Field Report. </br>The summary is constructed as: <b><i>Country IS03: Disaster Type - Start Date - Title - Field Report Number - (date)</b><i>",
78+
max_length=256,
79+
null=True,
80+
),
81+
),
82+
]

api/models.py

Lines changed: 28 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -742,6 +742,16 @@ class Event(models.Model):
742742
"""A disaster, which could cover multiple countries"""
743743

744744
name = models.CharField(verbose_name=_("name"), max_length=256)
745+
dtype = models.ForeignKey(DisasterType, verbose_name=_("disaster type"), null=True, on_delete=models.SET_NULL)
746+
disaster_start_date = models.DateTimeField(verbose_name=_("disaster start date"))
747+
regions = models.ManyToManyField(Region, verbose_name=_("regions"))
748+
countries = models.ManyToManyField(Country, verbose_name=_("countries"))
749+
countries_for_preview = models.ManyToManyField(
750+
Country, verbose_name=_("countries for preview"), blank=True, related_name="countries_for_preview"
751+
)
752+
districts = models.ManyToManyField(District, verbose_name=_("districts"), blank=True)
753+
# visibility
754+
visibility = models.IntegerField(choices=VisibilityChoices.choices, verbose_name=_("visibility"), default=1)
745755
# Obsolete: slug is not editable until we resolve https://github.com/IFRCGo/go-frontend/issues/1013
746756
slug = models.CharField(
747757
verbose_name=_("slug"),
@@ -758,13 +768,6 @@ class Event(models.Model):
758768
" Recommend using hyphens over underscores. Special characters like # is not allowed."
759769
),
760770
)
761-
dtype = models.ForeignKey(DisasterType, verbose_name=_("disaster type"), null=True, on_delete=models.SET_NULL)
762-
districts = models.ManyToManyField(District, verbose_name=_("districts"), blank=True)
763-
countries = models.ManyToManyField(Country, verbose_name=_("countries"))
764-
countries_for_preview = models.ManyToManyField(
765-
Country, verbose_name=_("countries for preview"), blank=True, related_name="countries_for_preview"
766-
)
767-
regions = models.ManyToManyField(Region, verbose_name=_("regions"))
768771
parent_event = models.ForeignKey(
769772
"self",
770773
null=True,
@@ -778,7 +781,6 @@ class Event(models.Model):
778781
)
779782
image = models.ImageField(verbose_name=_("image"), null=True, blank=True, upload_to=snippet_image_path)
780783
summary = HTMLField(verbose_name=_("summary"), blank=True, default="")
781-
title = models.CharField(max_length=256, blank=True)
782784

783785
num_injured = models.IntegerField(verbose_name=_("number of injured"), null=True, blank=True)
784786
num_dead = models.IntegerField(verbose_name=_("number of dead"), null=True, blank=True)
@@ -789,7 +791,6 @@ class Event(models.Model):
789791
ifrc_severity_level = models.IntegerField(choices=AlertLevel.choices, default=0, verbose_name=_("IFRC Severity level"))
790792
glide = models.CharField(verbose_name=_("glide"), max_length=18, blank=True)
791793

792-
disaster_start_date = models.DateTimeField(verbose_name=_("disaster start date"))
793794
created_at = models.DateTimeField(verbose_name=_("created at"), auto_now_add=True)
794795
updated_at = models.DateTimeField(verbose_name=_("updated at"), auto_now=True)
795796
previous_update = models.DateTimeField(verbose_name=_("previous update"), null=True, blank=True)
@@ -816,8 +817,6 @@ class Event(models.Model):
816817
tab_two_title = models.CharField(verbose_name=_("tab two title"), max_length=50, null=True, blank=True)
817818
tab_three_title = models.CharField(verbose_name=_("tab three title"), max_length=50, null=True, blank=True)
818819

819-
# visibility
820-
visibility = models.IntegerField(choices=VisibilityChoices.choices, verbose_name=_("visibility"), default=1)
821820
emergency_response_contact_email = models.CharField(
822821
verbose_name=_("emergency response contact email"), null=True, blank=True, max_length=255
823822
)
@@ -873,15 +872,6 @@ def record_type(self):
873872
def to_dict(self):
874873
return to_dict(self)
875874

876-
def generate_formatted_name(self):
877-
country_iso3 = self.countries.first().iso3 if self.id and self.countries.first() else "N/A"
878-
disaster_start_date = self.disaster_start_date.strftime("%m-%Y")
879-
for lang in AVAILABLE_LANGUAGES:
880-
with translation_override(lang):
881-
dtype = self.dtype.name if self.dtype else "N/A"
882-
self.name = f"{country_iso3}: {dtype} - {disaster_start_date} - {self.title}"
883-
yield build_localized_fieldname("name", lang)
884-
885875
def save(self, *args, **kwargs):
886876

887877
# Make the slug lowercase
@@ -892,15 +882,6 @@ def save(self, *args, **kwargs):
892882
if not self.id and not self.disaster_start_date:
893883
self.disaster_start_date = timezone.now()
894884

895-
updated_name_fields = list(self.generate_formatted_name())
896-
897-
# Updating the updated_fields with the fields that are updated
898-
if kwargs.get("update_fields"):
899-
kwargs["update_fields"] = (
900-
*kwargs["update_fields"],
901-
*updated_name_fields,
902-
)
903-
904885
return super(Event, self).save(*args, **kwargs)
905886

906887
def __str__(self):
@@ -1479,21 +1460,31 @@ class RecentAffected(models.IntegerChoices):
14791460
default=False,
14801461
help_text=_("Is this a Field Report specific to the COVID-19 emergency?"),
14811462
)
1482-
1483-
# Used to differentiate reports that have and have not been synced from DMIS
1484-
rid = models.CharField(verbose_name=_("r id"), max_length=100, null=True, blank=True, editable=False)
1485-
summary = models.TextField(verbose_name=_("summary"), blank=True)
14861463
# Title field is used for the translation and later adding formated into the summary
1487-
title = models.CharField(max_length=256, blank=True)
1488-
fr_num = models.IntegerField(verbose_name=_("field report number"), null=True, blank=True)
1464+
title = models.CharField(
1465+
max_length=256,
1466+
blank=True,
1467+
help_text=_(
1468+
"Title is used to generate the summary/name of the Field Report. </br>"
1469+
"The summary is constructed as: "
1470+
"<b><i>Country IS03: Disaster Type - Start Date - Title - Field Report Number - (date)</b><i>"
1471+
),
1472+
)
14891473
description = HTMLField(verbose_name=_("description"), blank=True, default="")
14901474
dtype = models.ForeignKey(DisasterType, verbose_name=_("disaster type"), on_delete=models.PROTECT)
14911475
event = models.ForeignKey(
14921476
Event, verbose_name=_("event"), related_name="field_reports", null=True, blank=True, on_delete=models.SET_NULL
14931477
)
1494-
districts = models.ManyToManyField(District, verbose_name=_("districts"), blank=True)
1495-
countries = models.ManyToManyField(Country, verbose_name=_("countries"))
14961478
regions = models.ManyToManyField(Region, verbose_name=_("regions"), blank=True)
1479+
countries = models.ManyToManyField(Country, verbose_name=_("countries"))
1480+
districts = models.ManyToManyField(District, verbose_name=_("districts"), blank=True)
1481+
# visibility
1482+
visibility = models.IntegerField(choices=VisibilityChoices.choices, verbose_name=_("visibility"), default=1)
1483+
# Used to differentiate reports that have and have not been synced from DMIS
1484+
rid = models.CharField(verbose_name=_("r id"), max_length=100, null=True, blank=True, editable=False)
1485+
summary = models.TextField(verbose_name=_("summary"), blank=True)
1486+
1487+
fr_num = models.IntegerField(verbose_name=_("field report number"), null=True, blank=True)
14971488
# This entity is more a type than a status, so let's label it this way on admin page:
14981489
status = models.IntegerField(
14991490
choices=Status.choices,
@@ -1582,9 +1573,6 @@ class RecentAffected(models.IntegerChoices):
15821573
# actions taken
15831574
actions_others = models.TextField(verbose_name=_("actions taken (others)"), null=True, blank=True)
15841575

1585-
# visibility
1586-
visibility = models.IntegerField(choices=VisibilityChoices.choices, verbose_name=_("visibility"), default=1)
1587-
15881576
# information
15891577
bulletin = models.IntegerField(choices=RequestChoices.choices, verbose_name=_("bulletin"), default=0, null=True)
15901578
dref = models.IntegerField(choices=RequestChoices.choices, verbose_name=_("DREF"), default=0, null=True)

api/receivers.py

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -288,15 +288,6 @@ 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-
300291
@receiver(m2m_changed, sender=FieldReport.countries.through)
301292
def update_fieldreport_summary(sender, instance, action, **kwargs):
302293
"""

api/serializers.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1164,7 +1164,6 @@ class Meta:
11641164
"dtype",
11651165
"countries",
11661166
"summary",
1167-
"title",
11681167
"num_affected",
11691168
"ifrc_severity_level",
11701169
"ifrc_severity_level_display",
@@ -1300,7 +1299,6 @@ class Meta:
13001299
"countries",
13011300
"districts",
13021301
"summary",
1303-
"title",
13041302
"num_affected",
13051303
"tab_two_title",
13061304
"tab_three_title",
@@ -2058,7 +2056,7 @@ class Meta:
20582056

20592057
def create_event(self, report):
20602058
event = Event.objects.create(
2061-
title=report.title,
2059+
name=report.summary,
20622060
dtype=report.dtype,
20632061
summary=report.description or "",
20642062
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(title="disaster1", summary="test disaster", dtype=dtype)
30-
event = models.Event.objects.create(title="disaster2", summary="another test disaster", dtype=dtype)
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)
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(title="disaster1")
36-
obj2 = models.Event.objects.get(title="disaster2")
35+
obj1 = models.Event.objects.get(name="disaster1")
36+
obj2 = models.Event.objects.get(name="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(title="associated event", summary="foo")
71+
event = models.Event.objects.create(name="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(title="disaster1", summary="test disaster", dtype=dtype)
90+
event = models.Event.objects.create(name="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(title="disaster1")
96+
event = models.Event.objects.get(name="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")

api/test_views.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -308,7 +308,7 @@ def test_sit_rep_types(self):
308308
type1 = models.SituationReportType.objects.create(type="Lyric")
309309
type2 = models.SituationReportType.objects.create(type="Epic")
310310
dtype1 = models.DisasterType.objects.get(pk=1)
311-
event1 = models.Event.objects.create(title="disaster1", summary="test disaster1", dtype=dtype1)
311+
event1 = models.Event.objects.create(name="disaster1", summary="test disaster1", dtype=dtype1)
312312

313313
models.SituationReport.objects.create(name="test1", event=event1, type=type1, visibility=3)
314314
models.SituationReport.objects.create(name="test2", event=event1, type=type2, visibility=3)
@@ -386,7 +386,7 @@ def test_create_and_update(self):
386386
self.assertEqual(created.title_en, "test")
387387

388388
# created an emergency automatically
389-
self.assertEqual(created.event.title, "test")
389+
self.assertEqual(created.event.name, response["summary"])
390390
# event_pk = created.event.id
391391

392392
# body['countries'] = [country2.id]

api/translation.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,8 +78,7 @@ class DisasterTypeTO(TranslationOptions):
7878

7979
@register(Event)
8080
class EventTO(TranslationOptions):
81-
fields = ("name", "summary", "title")
82-
skip_fields = ("name",) # XXX: CUSTOM field Not used by TranslationOptions, but used in lang/tasks.py
81+
fields = ("name", "summary")
8382

8483

8584
@register(ExternalPartner)

api/views.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ def get(self, request):
165165
emergency_response = (
166166
SearchQuerySet()
167167
.models(Event)
168-
.filter(SQ(name__content=phrase) | SQ(iso3__content=phrase))
168+
.filter(SQ(name__content=phrase) | SQ(iso3__content=phrase) | SQ(countries__content=phrase))
169169
.order_by("-_score")
170170
)
171171
fieldreport_response = (
@@ -215,7 +215,10 @@ def get(self, request):
215215
emergency_response = (
216216
SearchQuerySet()
217217
.models(Event)
218-
.filter((SQ(name__content=phrase) | SQ(iso3__content=phrase)) & ~SQ(visibility="IFRC Only"))
218+
.filter(
219+
(SQ(name__content=phrase) | SQ(country__iso3__content=phrase) | SQ(countries__content=phrase))
220+
& ~SQ(visibility="IFRC Only")
221+
)
219222
.order_by("-_score")
220223
)
221224
fieldreport_response = (

0 commit comments

Comments
 (0)