Skip to content

Commit

Permalink
Merge pull request #2419 from IFRCGo/fix/skip-title-generation
Browse files Browse the repository at this point in the history
Remove title generation for emergency
  • Loading branch information
szabozoltan69 authored Feb 20, 2025
2 parents 4c072d3 + b2e757c commit dde8be0
Show file tree
Hide file tree
Showing 13 changed files with 191 additions and 132 deletions.
5 changes: 1 addition & 4 deletions api/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -225,7 +225,6 @@ class EventAdmin(CompareVersionAdmin, RegionRestrictedAdmin, TranslationAdmin):
"districts",
"parent_event",
)
readonly_fields = ("name",)

def appeals(self, instance):
if getattr(instance, "appeals").exists():
Expand All @@ -249,14 +248,12 @@ def changeform_view(self, request, *args, **kwargs):
"field_reports",
"auto_generated_source",
"parent_event",
"name",
)
else:
self.readonly_fields = (
"appeals",
"field_reports",
"auto_generated_source",
"name",
)

return super(EventAdmin, self).changeform_view(request, *args, **kwargs)
Expand Down Expand Up @@ -340,7 +337,7 @@ class FieldReportAdmin(CompareVersionAdmin, RegionRestrictedAdmin, TranslationAd
def create_events(self, request, queryset):
for report in queryset:
event = models.Event.objects.create(
title=report.title,
name=report.summary,
dtype=getattr(report, "dtype"),
disaster_start_date=getattr(report, "created_at"),
auto_generated=True,
Expand Down
1 change: 0 additions & 1 deletion api/factories/event.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@ class Meta:
model = Event

name = fuzzy.FuzzyText(length=50)
title = fuzzy.FuzzyText(length=10)
slug = fuzzy.FuzzyText(length=50)
dtype = factory.SubFactory(DisasterTypeFactory)

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
# Generated by Django 4.2.17 on 2025-02-20 09:14

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
("api", "0217_merge_20250107_1019"),
]

operations = [
migrations.RemoveField(
model_name="event",
name="title",
),
migrations.RemoveField(
model_name="event",
name="title_ar",
),
migrations.RemoveField(
model_name="event",
name="title_en",
),
migrations.RemoveField(
model_name="event",
name="title_es",
),
migrations.RemoveField(
model_name="event",
name="title_fr",
),
migrations.AlterField(
model_name="fieldreport",
name="title",
field=models.CharField(
blank=True,
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>",
max_length=256,
),
),
migrations.AlterField(
model_name="fieldreport",
name="title_ar",
field=models.CharField(
blank=True,
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>",
max_length=256,
null=True,
),
),
migrations.AlterField(
model_name="fieldreport",
name="title_en",
field=models.CharField(
blank=True,
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>",
max_length=256,
null=True,
),
),
migrations.AlterField(
model_name="fieldreport",
name="title_es",
field=models.CharField(
blank=True,
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>",
max_length=256,
null=True,
),
),
migrations.AlterField(
model_name="fieldreport",
name="title_fr",
field=models.CharField(
blank=True,
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>",
max_length=256,
null=True,
),
),
]
68 changes: 28 additions & 40 deletions api/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -742,6 +742,16 @@ class Event(models.Model):
"""A disaster, which could cover multiple countries"""

name = models.CharField(verbose_name=_("name"), max_length=256)
dtype = models.ForeignKey(DisasterType, verbose_name=_("disaster type"), null=True, on_delete=models.SET_NULL)
disaster_start_date = models.DateTimeField(verbose_name=_("disaster start date"))
regions = models.ManyToManyField(Region, verbose_name=_("regions"))
countries = models.ManyToManyField(Country, verbose_name=_("countries"))
countries_for_preview = models.ManyToManyField(
Country, verbose_name=_("countries for preview"), blank=True, related_name="countries_for_preview"
)
districts = models.ManyToManyField(District, verbose_name=_("districts"), blank=True)
# visibility
visibility = models.IntegerField(choices=VisibilityChoices.choices, verbose_name=_("visibility"), default=1)
# Obsolete: slug is not editable until we resolve https://github.com/IFRCGo/go-frontend/issues/1013
slug = models.CharField(
verbose_name=_("slug"),
Expand All @@ -758,13 +768,6 @@ class Event(models.Model):
" Recommend using hyphens over underscores. Special characters like # is not allowed."
),
)
dtype = models.ForeignKey(DisasterType, verbose_name=_("disaster type"), null=True, on_delete=models.SET_NULL)
districts = models.ManyToManyField(District, verbose_name=_("districts"), blank=True)
countries = models.ManyToManyField(Country, verbose_name=_("countries"))
countries_for_preview = models.ManyToManyField(
Country, verbose_name=_("countries for preview"), blank=True, related_name="countries_for_preview"
)
regions = models.ManyToManyField(Region, verbose_name=_("regions"))
parent_event = models.ForeignKey(
"self",
null=True,
Expand All @@ -778,7 +781,6 @@ class Event(models.Model):
)
image = models.ImageField(verbose_name=_("image"), null=True, blank=True, upload_to=snippet_image_path)
summary = HTMLField(verbose_name=_("summary"), blank=True, default="")
title = models.CharField(max_length=256, blank=True)

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

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

# visibility
visibility = models.IntegerField(choices=VisibilityChoices.choices, verbose_name=_("visibility"), default=1)
emergency_response_contact_email = models.CharField(
verbose_name=_("emergency response contact email"), null=True, blank=True, max_length=255
)
Expand Down Expand Up @@ -873,15 +872,6 @@ def record_type(self):
def to_dict(self):
return to_dict(self)

def generate_formatted_name(self):
country_iso3 = self.countries.first().iso3 if self.id and self.countries.first() else "N/A"
disaster_start_date = self.disaster_start_date.strftime("%m-%Y")
for lang in AVAILABLE_LANGUAGES:
with translation_override(lang):
dtype = self.dtype.name if self.dtype else "N/A"
self.name = f"{country_iso3}: {dtype} - {disaster_start_date} - {self.title}"
yield build_localized_fieldname("name", lang)

def save(self, *args, **kwargs):

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

updated_name_fields = list(self.generate_formatted_name())

# Updating the updated_fields with the fields that are updated
if kwargs.get("update_fields"):
kwargs["update_fields"] = (
*kwargs["update_fields"],
*updated_name_fields,
)

return super(Event, self).save(*args, **kwargs)

def __str__(self):
Expand Down Expand Up @@ -1479,21 +1460,31 @@ class RecentAffected(models.IntegerChoices):
default=False,
help_text=_("Is this a Field Report specific to the COVID-19 emergency?"),
)

# Used to differentiate reports that have and have not been synced from DMIS
rid = models.CharField(verbose_name=_("r id"), max_length=100, null=True, blank=True, editable=False)
summary = models.TextField(verbose_name=_("summary"), blank=True)
# Title field is used for the translation and later adding formated into the summary
title = models.CharField(max_length=256, blank=True)
fr_num = models.IntegerField(verbose_name=_("field report number"), null=True, blank=True)
title = models.CharField(
max_length=256,
blank=True,
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>"
),
)
description = HTMLField(verbose_name=_("description"), blank=True, default="")
dtype = models.ForeignKey(DisasterType, verbose_name=_("disaster type"), on_delete=models.PROTECT)
event = models.ForeignKey(
Event, verbose_name=_("event"), related_name="field_reports", null=True, blank=True, on_delete=models.SET_NULL
)
districts = models.ManyToManyField(District, verbose_name=_("districts"), blank=True)
countries = models.ManyToManyField(Country, verbose_name=_("countries"))
regions = models.ManyToManyField(Region, verbose_name=_("regions"), blank=True)
countries = models.ManyToManyField(Country, verbose_name=_("countries"))
districts = models.ManyToManyField(District, verbose_name=_("districts"), blank=True)
# visibility
visibility = models.IntegerField(choices=VisibilityChoices.choices, verbose_name=_("visibility"), default=1)
# Used to differentiate reports that have and have not been synced from DMIS
rid = models.CharField(verbose_name=_("r id"), max_length=100, null=True, blank=True, editable=False)
summary = models.TextField(verbose_name=_("summary"), blank=True)

fr_num = models.IntegerField(verbose_name=_("field report number"), null=True, blank=True)
# This entity is more a type than a status, so let's label it this way on admin page:
status = models.IntegerField(
choices=Status.choices,
Expand Down Expand Up @@ -1582,9 +1573,6 @@ class RecentAffected(models.IntegerChoices):
# actions taken
actions_others = models.TextField(verbose_name=_("actions taken (others)"), null=True, blank=True)

# visibility
visibility = models.IntegerField(choices=VisibilityChoices.choices, verbose_name=_("visibility"), default=1)

# information
bulletin = models.IntegerField(choices=RequestChoices.choices, verbose_name=_("bulletin"), default=0, null=True)
dref = models.IntegerField(choices=RequestChoices.choices, verbose_name=_("DREF"), default=0, null=True)
Expand Down
9 changes: 0 additions & 9 deletions api/receivers.py
Original file line number Diff line number Diff line change
Expand Up @@ -288,15 +288,6 @@ def remove_appeal_filter(sender, instance, using, **kwargs):
appealFilter.save()


@receiver(m2m_changed, sender=Event.countries.through)
def update_event_name(sender, instance, action, **kwargs):
"""
Update the event name when the countries are changed.
"""
if action in ["post_add", "post_remove"]:
instance.save()


@receiver(m2m_changed, sender=FieldReport.countries.through)
def update_fieldreport_summary(sender, instance, action, **kwargs):
"""
Expand Down
4 changes: 1 addition & 3 deletions api/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -1164,7 +1164,6 @@ class Meta:
"dtype",
"countries",
"summary",
"title",
"num_affected",
"ifrc_severity_level",
"ifrc_severity_level_display",
Expand Down Expand Up @@ -1300,7 +1299,6 @@ class Meta:
"countries",
"districts",
"summary",
"title",
"num_affected",
"tab_two_title",
"tab_three_title",
Expand Down Expand Up @@ -2058,7 +2056,7 @@ class Meta:

def create_event(self, report):
event = Event.objects.create(
title=report.title,
name=report.summary,
dtype=report.dtype,
summary=report.description or "",
disaster_start_date=report.start_date,
Expand Down
14 changes: 7 additions & 7 deletions api/test_models.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,14 +26,14 @@ class EventTest(TestCase):

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

def test_disaster_create(self):
obj1 = models.Event.objects.get(title="disaster1")
obj2 = models.Event.objects.get(title="disaster2")
obj1 = models.Event.objects.get(name="disaster1")
obj2 = models.Event.objects.get(name="disaster2")
self.assertEqual(obj1.summary, "test disaster")
self.assertEqual(obj2.summary, "another test disaster")
keyfig = obj2.key_figures.all()
Expand Down Expand Up @@ -68,7 +68,7 @@ def test_profile_create(self):
class AppealTest(APITestCase):
def setUp(self):
# An appeal with needs_confirmation=True should not return the event in the API response.
event = models.Event.objects.create(title="associated event", summary="foo")
event = models.Event.objects.create(name="associated event", summary="foo")
country = models.Country.objects.create(name="country")
models.Appeal.objects.create(
aid="test1", name="appeal", atype=1, code="abc", needs_confirmation=True, event=event, country=country
Expand All @@ -87,13 +87,13 @@ class FieldReportTest(TestCase):

def setUp(self):
dtype = models.DisasterType.objects.get(pk=1)
event = models.Event.objects.create(title="disaster1", summary="test disaster", dtype=dtype)
event = models.Event.objects.create(name="disaster1", summary="test disaster", dtype=dtype)
country = models.Country.objects.create(name="country")
report = models.FieldReport.objects.create(rid="test1", event=event, dtype=dtype)
report.countries.add(country)

def test_field_report_create(self):
event = models.Event.objects.get(title="disaster1")
event = models.Event.objects.get(name="disaster1")
country = models.Country.objects.get(name="country")
self.assertEqual(event.field_reports.all()[0].countries.all()[0], country)
obj = models.FieldReport.objects.get(rid="test1")
Expand Down
4 changes: 2 additions & 2 deletions api/test_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -308,7 +308,7 @@ def test_sit_rep_types(self):
type1 = models.SituationReportType.objects.create(type="Lyric")
type2 = models.SituationReportType.objects.create(type="Epic")
dtype1 = models.DisasterType.objects.get(pk=1)
event1 = models.Event.objects.create(title="disaster1", summary="test disaster1", dtype=dtype1)
event1 = models.Event.objects.create(name="disaster1", summary="test disaster1", dtype=dtype1)

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

# created an emergency automatically
self.assertEqual(created.event.title, "test")
self.assertEqual(created.event.name, response["summary"])
# event_pk = created.event.id

# body['countries'] = [country2.id]
Expand Down
3 changes: 1 addition & 2 deletions api/translation.py
Original file line number Diff line number Diff line change
Expand Up @@ -78,8 +78,7 @@ class DisasterTypeTO(TranslationOptions):

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


@register(ExternalPartner)
Expand Down
7 changes: 5 additions & 2 deletions api/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -165,7 +165,7 @@ def get(self, request):
emergency_response = (
SearchQuerySet()
.models(Event)
.filter(SQ(name__content=phrase) | SQ(iso3__content=phrase))
.filter(SQ(name__content=phrase) | SQ(iso3__content=phrase) | SQ(countries__content=phrase))
.order_by("-_score")
)
fieldreport_response = (
Expand Down Expand Up @@ -215,7 +215,10 @@ def get(self, request):
emergency_response = (
SearchQuerySet()
.models(Event)
.filter((SQ(name__content=phrase) | SQ(iso3__content=phrase)) & ~SQ(visibility="IFRC Only"))
.filter(
(SQ(name__content=phrase) | SQ(country__iso3__content=phrase) | SQ(countries__content=phrase))
& ~SQ(visibility="IFRC Only")
)
.order_by("-_score")
)
fieldreport_response = (
Expand Down
Loading

0 comments on commit dde8be0

Please sign in to comment.