diff --git a/api/models.py b/api/models.py index d8facc360..b58bab95b 100644 --- a/api/models.py +++ b/api/models.py @@ -886,6 +886,11 @@ class EventSource(models.IntegerChoices): verbose_name=_("emergency response contact email"), null=True, blank=True, max_length=255 ) + # TYPING + + id: int + pk: int + class Meta: ordering = ( "-disaster_start_date", diff --git a/dref/test_views.py b/dref/test_views.py index 3c4a221d0..a0071523d 100644 --- a/dref/test_views.py +++ b/dref/test_views.py @@ -10,7 +10,7 @@ from django.core import management from rest_framework import status -from api.models import Country, DisasterType, District, Region, RegionName +from api.models import Country, DisasterType, District, Event, Region, RegionName from api.utils import get_model_name from deployments.factories.project import SectorFactory from deployments.factories.user import UserFactory @@ -30,6 +30,7 @@ ProposedAction, ) from dref.tasks import send_dref_email +from lang.serializers import TranslatedModelSerializerMixin from main.test_case import APITestCase @@ -2664,6 +2665,79 @@ def test_dref_final_report_finalize(self, mock_translation): self.assert_200(response) self.assertEqual(response.data["status"], Dref.Status.FINALIZED) + @patch.object( + TranslatedModelSerializerMixin, + "trigger_field_translation", + ) + def test_create_event_from_dref(self, mock_trigger_translation): + region = Region.objects.create(name=RegionName.ASIA_PACIFIC) + country = Country.objects.create(name="Test countrynpl", region=region) + district = District.objects.create(name="test district", country=country) + disaster_type = DisasterType.objects.create(name="test disaster") + dref = DrefFactory.create( + title="Test Title", + disaster_type=disaster_type, + event_description="Test event description", + event_date="2021-10-10", + glide_code="GLIDE123", + created_by=self.user, + country=country, + status=Dref.Status.FINALIZED, + type_of_dref=Dref.DrefType.ASSESSMENT, + ) + dref.district.set([district]) + url = f"/api/v2/dref/{dref.id}/approve/" + self.authenticate(self.root_user) + response = self.client.post(url) + self.assert_200(response) + + dref.refresh_from_db() + + dref_event_id = response.data["event"] + event_instance = Event.objects.get(id=dref_event_id) + + # Translation triggered + mock_trigger_translation.assert_called_once() + + translated_event = mock_trigger_translation.call_args.args[0] + + self.assertEqual( + translated_event.pk, + event_instance.pk, + ) + + self.assertEqual( + { + event_instance.name, + event_instance.dtype.id, + event_instance.summary, + event_instance.disaster_start_date.date(), + event_instance.glide, + event_instance.source, + }, + { + dref.title, + dref.disaster_type.id, + dref.event_description, + dref.event_date, + dref.glide_code, + Event.EventSource.DREF, + }, + ) + self.assertEqual( + list(event_instance.regions.values_list("id", flat=True)), + [dref.country.region.id], + ) + self.assertEqual( + list(event_instance.countries.values_list("id", flat=True)), + [dref.country.id], + ) + self.assertEqual( + list(event_instance.districts.values_list("id", flat=True)), + [district.id], + ) + self.assertTrue(event_instance.auto_generated) + User = get_user_model() diff --git a/dref/utils.py b/dref/utils.py index 15fd74efe..d7e04ccbb 100644 --- a/dref/utils.py +++ b/dref/utils.py @@ -67,6 +67,12 @@ def create_event_from_dref(dref: Dref) -> Event: source=Event.EventSource.DREF, ) - event.countries.add(dref.country) + country = getattr(dref, "country", None) + if country: + event.countries.add(dref.country) + event.districts.add(*dref.district.all()) + region = getattr(country, "region", None) + if region: + event.regions.add(region) return event diff --git a/dref/views.py b/dref/views.py index 507f8508a..425bf7d10 100644 --- a/dref/views.py +++ b/dref/views.py @@ -50,6 +50,7 @@ ) from dref.tasks import process_dref_translation from dref.utils import create_event_from_dref +from lang.serializers import TranslatedModelSerializerMixin from main.permissions import DenyGuestUserPermission logger = logging.getLogger(__name__) @@ -127,7 +128,11 @@ def get_approved(self, request, pk=None, version=None): if event: dref.event = event else: - dref.event = create_event_from_dref(dref) + event = create_event_from_dref(dref) + dref.event = event + # Translate the emergency instance + TranslatedModelSerializerMixin.trigger_field_translation(event) + dref.status = Dref.Status.APPROVED dref.save(update_fields=["event", "status"])