Skip to content

Commit

Permalink
Merge pull request #2388 from IFRCGo/project/field-report-translations
Browse files Browse the repository at this point in the history
Feat: FieldReport and Emergencies Translation
  • Loading branch information
szabozoltan69 authored Jan 29, 2025
2 parents 5386515 + 9d2e9e0 commit 2d668d2
Show file tree
Hide file tree
Showing 17 changed files with 522 additions and 407 deletions.
7 changes: 4 additions & 3 deletions api/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -225,6 +225,7 @@ class EventAdmin(CompareVersionAdmin, RegionRestrictedAdmin, TranslationAdmin):
"districts",
"parent_event",
)
readonly_fields = ("name",)

def appeals(self, instance):
if getattr(instance, "appeals").exists():
Expand Down Expand Up @@ -324,7 +325,7 @@ class FieldReportAdmin(CompareVersionAdmin, RegionRestrictedAdmin, TranslationAd
"districts",
)

readonly_fields = ("report_date", "created_at", "updated_at")
readonly_fields = ("report_date", "created_at", "updated_at", "summary", "fr_num")
list_filter = [MembershipFilter]
actions = [
"create_events",
Expand All @@ -337,7 +338,7 @@ class FieldReportAdmin(CompareVersionAdmin, RegionRestrictedAdmin, TranslationAd
def create_events(self, request, queryset):
for report in queryset:
event = models.Event.objects.create(
name=report.summary,
title=report.title,
dtype=getattr(report, "dtype"),
disaster_start_date=getattr(report, "created_at"),
auto_generated=True,
Expand Down Expand Up @@ -437,7 +438,7 @@ class AppealAdmin(CompareVersionAdmin, RegionRestrictedAdmin, TranslationAdmin):
def create_events(self, request, queryset):
for appeal in queryset:
event = models.Event.objects.create(
name=appeal.name,
title=appeal.name,
dtype=getattr(appeal, "dtype"),
disaster_start_date=getattr(appeal, "start_date"),
auto_generated=True,
Expand Down
39 changes: 38 additions & 1 deletion api/drf_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,8 @@
DistrictSerializerRMD,
ExportSerializer,
ExternalPartnerSerializer,
FieldReportGeneratedTitleSerializer,
FieldReportGenerateTitleSerializer,
FieldReportSerializer,
GoHistoricalSerializer,
HistoricalDisasterSerializer,
Expand Down Expand Up @@ -151,7 +153,7 @@
UserMeSerializer,
UserSerializer,
)
from .utils import is_user_ifrc
from .utils import generate_field_report_title, is_user_ifrc


class DeploymentsByEventViewset(viewsets.ReadOnlyModelViewSet):
Expand Down Expand Up @@ -943,6 +945,41 @@ def get_serializer_class(self):
return FieldReportSerializer
return FieldReportSerializer

@extend_schema(
request=FieldReportGenerateTitleSerializer,
responses=FieldReportGeneratedTitleSerializer,
)
@action(
detail=False,
methods=["post"],
url_path="generate-title",
permission_classes=[DenyGuestUserMutationPermission],
)
def generate_title(self, request):
"""
Generate a title for a Field Report.
"""
serializer = FieldReportGenerateTitleSerializer(data=request.data)
serializer.is_valid(raise_exception=True)

countries = serializer.validated_data.get("countries")
dtype = serializer.validated_data.get("dtype")
event = serializer.validated_data.get("event")
start_date = serializer.validated_data.get("start_date")
title = serializer.validated_data.get("title")
is_covid_report = serializer.validated_data.get("is_covid_report")

summary = generate_field_report_title(
country=countries[0], dtype=dtype, event=event, start_date=start_date, title=title, is_covid_report=is_covid_report
)
return Response(
FieldReportGeneratedTitleSerializer(
{
"title": summary,
}
).data
)


class ActionViewset(viewsets.ReadOnlyModelViewSet):
queryset = Action.objects.exclude(is_disabled=True)
Expand Down
3 changes: 2 additions & 1 deletion api/factories/event.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,8 @@ class EventFactory(factory.django.DjangoModelFactory):
class Meta:
model = Event

name = fuzzy.FuzzyText(length=50, prefix="event-")
name = fuzzy.FuzzyText(length=50)
title = fuzzy.FuzzyText(length=10)
slug = fuzzy.FuzzyText(length=50)
dtype = factory.SubFactory(DisasterTypeFactory)

Expand Down
1 change: 1 addition & 0 deletions api/factories/field_report.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ class Meta:
dtype = factory.SubFactory(disaster_type.DisasterTypeFactory)
event = factory.SubFactory(event.EventFactory)
summary = fuzzy.FuzzyText(length=500)
title = fuzzy.FuzzyText(length=10, prefix="title-")
description = fuzzy.FuzzyText(length=200)
report_date = fuzzy.FuzzyDateTime(datetime.datetime(2008, 1, 1, tzinfo=pytz.utc))
# start_date is now what the user explicitly sets while filling the Field Report form.
Expand Down
79 changes: 79 additions & 0 deletions api/management/commands/migrate_field_report_number.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
import re

from django.core.management.base import BaseCommand
from django.db.models.expressions import Exists, OuterRef

from api.models import FieldReport
from main.managers import BulkUpdateManager


class Command(BaseCommand):
help = "Migrate legacy FieldReport data to populate fr_num"

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

suffix_pattern = re.compile(r"#\s*(\d+)")

reports = (
FieldReport.objects.filter(event__isnull=False, countries__isnull=False, summary__icontains="#")
.annotate(
has_fr_num=Exists(
FieldReport.objects.filter(event=OuterRef("event"), countries=OuterRef("countries"), fr_num__isnull=False)
)
)
.exclude(has_fr_num=True)
)

report_count = reports.count()
self.stdout.write(self.style.NOTICE(f"Found {report_count} FieldReports to process"))

if report_count == 0:
self.stdout.write(self.style.WARNING("No FieldReports found to process"))
return

event_country_data = {}

for report in reports.iterator():
country = report.countries.first()

if country is None:
self.stdout.write(self.style.ERROR(f"FieldReport ID: ({report.id}) has no associated country."))
continue

summary_match = suffix_pattern.search(report.summary)
derived_fr_num = int(summary_match.group(1)) if summary_match else 0

max_fr_num = max(derived_fr_num, report.fr_num or 0)
key = (report.event.id, country.id)

group_data = event_country_data.get(
key,
{
"highest_fr_num": 0,
"report_highest_fr": None,
},
)

if max_fr_num > group_data["highest_fr_num"]:
group_data["highest_fr_num"] = max_fr_num
group_data["report_highest_fr"] = report

event_country_data[key] = group_data

bulk_mgr = BulkUpdateManager(update_fields=["fr_num"])

for data in event_country_data.values():
highest_report = data["report_highest_fr"]
highest_fr_num = data["highest_fr_num"]
if highest_report:
self.stdout.write(
self.style.NOTICE(f"Preparing to update FieldReport ID:({highest_report.id}) with fr_num:({highest_fr_num}).")
)
bulk_mgr.add(
FieldReport(
id=highest_report.id,
fr_num=highest_fr_num,
)
)
bulk_mgr.done()
self.stdout.write(self.style.SUCCESS("FieldReport migration completed successfully."))
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
# Generated by Django 4.2.16 on 2024-11-20 09:20

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
("api", "0214_alter_profile_limit_access_to_guest"),
]

operations = [
migrations.AddField(
model_name="event",
name="title",
field=models.CharField(blank=True, max_length=256),
),
migrations.AddField(
model_name="event",
name="title_ar",
field=models.CharField(blank=True, max_length=256, null=True),
),
migrations.AddField(
model_name="event",
name="title_en",
field=models.CharField(blank=True, max_length=256, null=True),
),
migrations.AddField(
model_name="event",
name="title_es",
field=models.CharField(blank=True, max_length=256, null=True),
),
migrations.AddField(
model_name="event",
name="title_fr",
field=models.CharField(blank=True, max_length=256, null=True),
),
migrations.AddField(
model_name="fieldreport",
name="fr_num",
field=models.IntegerField(blank=True, null=True, verbose_name="field report number"),
),
migrations.AddField(
model_name="fieldreport",
name="title",
field=models.CharField(blank=True, max_length=256),
),
migrations.AddField(
model_name="fieldreport",
name="title_ar",
field=models.CharField(blank=True, max_length=256, null=True),
),
migrations.AddField(
model_name="fieldreport",
name="title_en",
field=models.CharField(blank=True, max_length=256, null=True),
),
migrations.AddField(
model_name="fieldreport",
name="title_es",
field=models.CharField(blank=True, max_length=256, null=True),
),
migrations.AddField(
model_name="fieldreport",
name="title_fr",
field=models.CharField(blank=True, max_length=256, null=True),
),
]
13 changes: 13 additions & 0 deletions api/migrations/0217_merge_20250107_1019.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# Generated by Django 4.2.16 on 2025-01-07 10:19

from django.db import migrations


class Migration(migrations.Migration):

dependencies = [
("api", "0215_event_title_event_title_ar_event_title_en_and_more"),
("api", "0216_district_emma_id_district_fips_code_district_nuts1_and_more"),
]

operations = []
Loading

0 comments on commit 2d668d2

Please sign in to comment.