Skip to content

Commit b40c591

Browse files
committed
refactor(dref): refactor dref finalize logic
1 parent 3cc549c commit b40c591

12 files changed

+398
-245
lines changed

dref/migrations/0084_dref_original_language_and_more.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,18 @@ def update_status(apps, schema_editor):
2020
Model.objects.filter(is_published=True).update(status=4) # Published → APPROVED
2121
Model.objects.filter(is_published=False).update(status=1) # Not published → DRAFT
2222

23+
def update_original_language(apps, schema_editor):
24+
"""
25+
Populate the original_language field with 'en' for all existing records.
26+
"""
27+
models = [
28+
"Dref",
29+
"DrefOperationalUpdate",
30+
"DrefFinalReport",
31+
]
32+
for model_name in models:
33+
Model = apps.get_model("dref", model_name)
34+
Model.objects.update(original_language="en")
2335

2436
class Migration(migrations.Migration):
2537

@@ -80,4 +92,5 @@ class Migration(migrations.Migration):
8092
),
8193
),
8294
migrations.RunPython(update_status, reverse_code=migrations.RunPython.noop),
95+
migrations.RunPython(update_original_language,reverse_code=migrations.RunPython.noop),
8396
]
Lines changed: 40 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,55 @@
1-
# Generated by Django 4.2.19 on 2025-09-16 09:13
1+
# Generated by Django 4.2.19 on 2025-11-05 04:07
2+
3+
from django.db import migrations, models
24

3-
from django.db import migrations
45

5-
def migrate_approved_status_to_new_value(apps, schema_editor):
6-
"""
7-
Migrates the 'APPROVED' status from old value (4) to new value (3)
8-
"""
9-
models = [
10-
"Dref",
11-
"DrefOperationalUpdate",
12-
"DrefFinalReport",
13-
]
14-
for model_name in models:
15-
Model = apps.get_model("dref", model_name)
16-
Model.objects.filter(status=4).update(status=3)
176
class Migration(migrations.Migration):
187

198
dependencies = [
20-
("dref", "0084_dref_original_language_and_more"),
9+
('dref', '0084_dref_original_language_and_more'),
2110
]
2211

2312
operations = [
2413
migrations.RemoveField(
25-
model_name="dref",
26-
name="is_published",
14+
model_name='dref',
15+
name='is_published',
16+
),
17+
migrations.RenameField(
18+
model_name='dref',
19+
old_name='original_language',
20+
new_name='starting_language',
2721
),
2822
migrations.RemoveField(
29-
model_name="dreffinalreport",
30-
name="is_published",
23+
model_name='dreffinalreport',
24+
name='is_published',
25+
),
26+
migrations.RenameField(
27+
model_name='dreffinalreport',
28+
old_name='original_language',
29+
new_name='starting_language',
3130
),
3231
migrations.RemoveField(
33-
model_name="drefoperationalupdate",
34-
name="is_published",
32+
model_name='drefoperationalupdate',
33+
name='is_published',
34+
),
35+
migrations.RenameField(
36+
model_name='drefoperationalupdate',
37+
old_name='original_language',
38+
new_name='starting_language',
39+
),
40+
migrations.AlterField(
41+
model_name='dref',
42+
name='starting_language',
43+
field=models.CharField(blank=True, help_text='The language in which this record was first created.', null=True, verbose_name='Starting language'),
44+
),
45+
migrations.AlterField(
46+
model_name='dreffinalreport',
47+
name='starting_language',
48+
field=models.CharField(blank=True, help_text='The language in which this record was first created.', null=True, verbose_name='Starting language'),
49+
),
50+
migrations.AlterField(
51+
model_name='drefoperationalupdate',
52+
name='starting_language',
53+
field=models.CharField(blank=True, help_text='The language in which this record was first created.', null=True, verbose_name='Starting language'),
3554
),
36-
migrations.RunPython(migrate_approved_status_to_new_value, reverse_code=migrations.RunPython.noop),
3755
]

dref/migrations/0086_alter_dref_status_alter_dreffinalreport_status_and_more.py

Lines changed: 0 additions & 43 deletions
This file was deleted.
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
# Generated by Django 4.2.19 on 2025-11-05 08:22
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
('dref', '0085_remove_dref_is_published_and_more'),
10+
]
11+
12+
operations = [
13+
migrations.AddField(
14+
model_name='dref',
15+
name='addressed_humanitarian_impacts_ar',
16+
field=models.TextField(blank=True, help_text=' Which of the expected severe humanitarian impacts of the hazard are your actions addressing?', null=True, verbose_name='Addressed Humanitarian Impacts'),
17+
),
18+
migrations.AddField(
19+
model_name='dref',
20+
name='addressed_humanitarian_impacts_en',
21+
field=models.TextField(blank=True, help_text=' Which of the expected severe humanitarian impacts of the hazard are your actions addressing?', null=True, verbose_name='Addressed Humanitarian Impacts'),
22+
),
23+
migrations.AddField(
24+
model_name='dref',
25+
name='addressed_humanitarian_impacts_es',
26+
field=models.TextField(blank=True, help_text=' Which of the expected severe humanitarian impacts of the hazard are your actions addressing?', null=True, verbose_name='Addressed Humanitarian Impacts'),
27+
),
28+
migrations.AddField(
29+
model_name='dref',
30+
name='addressed_humanitarian_impacts_fr',
31+
field=models.TextField(blank=True, help_text=' Which of the expected severe humanitarian impacts of the hazard are your actions addressing?', null=True, verbose_name='Addressed Humanitarian Impacts'),
32+
),
33+
migrations.AddField(
34+
model_name='dref',
35+
name='hazard_date_and_location_ar',
36+
field=models.TextField(blank=True, help_text='When and where is the hazard expected to happen?', null=True, verbose_name='Hazard Date and Location'),
37+
),
38+
migrations.AddField(
39+
model_name='dref',
40+
name='hazard_date_and_location_en',
41+
field=models.TextField(blank=True, help_text='When and where is the hazard expected to happen?', null=True, verbose_name='Hazard Date and Location'),
42+
),
43+
migrations.AddField(
44+
model_name='dref',
45+
name='hazard_date_and_location_es',
46+
field=models.TextField(blank=True, help_text='When and where is the hazard expected to happen?', null=True, verbose_name='Hazard Date and Location'),
47+
),
48+
migrations.AddField(
49+
model_name='dref',
50+
name='hazard_date_and_location_fr',
51+
field=models.TextField(blank=True, help_text='When and where is the hazard expected to happen?', null=True, verbose_name='Hazard Date and Location'),
52+
),
53+
migrations.AddField(
54+
model_name='dref',
55+
name='hazard_vulnerabilities_and_risks_ar',
56+
field=models.TextField(blank=True, help_text='Explain the underlying vulnerabilities and risks the hazard poses for at-risk communities?', null=True, verbose_name='Hazard Vulnerabilities and Risks'),
57+
),
58+
migrations.AddField(
59+
model_name='dref',
60+
name='hazard_vulnerabilities_and_risks_en',
61+
field=models.TextField(blank=True, help_text='Explain the underlying vulnerabilities and risks the hazard poses for at-risk communities?', null=True, verbose_name='Hazard Vulnerabilities and Risks'),
62+
),
63+
migrations.AddField(
64+
model_name='dref',
65+
name='hazard_vulnerabilities_and_risks_es',
66+
field=models.TextField(blank=True, help_text='Explain the underlying vulnerabilities and risks the hazard poses for at-risk communities?', null=True, verbose_name='Hazard Vulnerabilities and Risks'),
67+
),
68+
migrations.AddField(
69+
model_name='dref',
70+
name='hazard_vulnerabilities_and_risks_fr',
71+
field=models.TextField(blank=True, help_text='Explain the underlying vulnerabilities and risks the hazard poses for at-risk communities?', null=True, verbose_name='Hazard Vulnerabilities and Risks'),
72+
),
73+
]

dref/migrations/0087_remove_dref_original_language_and_more.py

Lines changed: 0 additions & 43 deletions
This file was deleted.

dref/models.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -266,9 +266,11 @@ class DisasterCategory(models.IntegerChoices):
266266
class Status(models.IntegerChoices):
267267
DRAFT = 1, _("Draft")
268268
"""Draft: Initial stage content is being created and is not ready for review."""
269-
FINALIZED = 2, _("Finalized")
269+
FINALIZING = 2, _("Finalizing")
270+
"""Finalizing: Content is in the translation process from the original language into English."""
271+
FINALIZED = 3, _("Finalized")
270272
"""Finalized: Translation is completed, content is ready for review, and updates to the original language are locked."""
271-
APPROVED = 3, _("Approved")
273+
APPROVED = 4, _("Approved")
272274
"""Approved: The content has been reviewed, accepted, and is ready for use."""
273275

274276
created_at = models.DateTimeField(verbose_name=_("created at"), auto_now_add=True)

dref/serializers.py

Lines changed: 16 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -471,6 +471,8 @@ def get_dref_access_user_list(self, obj) -> List[int] | None:
471471
def validate(self, data):
472472
event_date = data.get("event_date")
473473
operation_timeframe = data.get("operation_timeframe")
474+
if self.instance and self.instance.status == Dref.Status.FINALIZING:
475+
raise serializers.ValidationError(gettext("Cannot be updated while the translation is in progress"))
474476
is_assessment_report = data.get("is_assessment_report")
475477
if event_date and data["type_of_onset"] not in [Dref.OnsetType.SLOW, Dref.OnsetType.SUDDEN]:
476478
raise serializers.ValidationError(
@@ -745,6 +747,8 @@ class Meta:
745747

746748
def validate(self, data):
747749
dref = data.get("dref")
750+
if self.instance and self.instance.status == Dref.Status.FINALIZING:
751+
raise serializers.ValidationError(gettext("Cannot be updated while the translation is in progress"))
748752
if not self.instance and dref:
749753
if dref.status != Dref.Status.APPROVED:
750754
raise serializers.ValidationError(gettext("Can't create Operational Update for not approved %s dref." % dref.id))
@@ -788,17 +792,13 @@ def validate_images_file(self, images):
788792
def create(self, validated_data):
789793
dref = validated_data["dref"]
790794
current_language = get_language()
795+
stating_langauge = validated_data.get("starting_language")
791796
valid_languages = [dref.starting_language, dref.translation_module_original_language]
792-
# Check request language
793-
if current_language not in valid_languages:
797+
if current_language != stating_langauge:
798+
raise serializers.ValidationError(gettext("Starting language does not match the expected language."))
799+
if stating_langauge not in valid_languages:
794800
raise serializers.ValidationError(
795-
gettext(f"Language must be either '{valid_languages[0]}' or '{valid_languages[1]}'.")
796-
)
797-
# Check payload language
798-
language = validated_data.get("starting_language")
799-
if language not in valid_languages:
800-
raise serializers.ValidationError(
801-
gettext(f"Language must be either '{valid_languages[0]}' or '{valid_languages[1]}'.")
801+
gettext(f"Invalid starting language. Supported options are '{valid_languages[0]}' and '{valid_languages[1]}'.")
802802
)
803803
dref_operational_update = DrefOperationalUpdate.objects.filter(dref=dref).order_by("-operational_update_number").first()
804804
validated_data["created_by"] = self.context["request"].user
@@ -1146,6 +1146,8 @@ class Meta:
11461146

11471147
def validate(self, data):
11481148
dref = data.get("dref")
1149+
if self.instance and self.instance.status == Dref.Status.FINALIZING:
1150+
raise serializers.ValidationError(gettext("Cannot be updated while the translation is in progress"))
11491151
# Check if dref is published and operational_update associated with it is also published
11501152
if not self.instance and dref:
11511153
if dref.status != Dref.Status.APPROVED:
@@ -1247,18 +1249,13 @@ def create(self, validated_data):
12471249
# else copy from dref
12481250
dref = validated_data["dref"]
12491251
current_language = get_language()
1252+
stating_langauge = validated_data.get("starting_language")
12501253
valid_languages = [dref.starting_language, dref.translation_module_original_language]
1251-
# Check request language
1252-
if current_language not in valid_languages:
1253-
raise serializers.ValidationError(
1254-
gettext(f"Language must be either '{valid_languages[0]}' or '{valid_languages[1]}'.")
1255-
)
1256-
1257-
# Check payload language
1258-
language = validated_data.get("starting_language")
1259-
if language not in valid_languages:
1254+
if current_language != stating_langauge:
1255+
raise serializers.ValidationError(gettext("Starting language does not match the expected language."))
1256+
if stating_langauge not in valid_languages:
12601257
raise serializers.ValidationError(
1261-
gettext(f"Language must be either '{valid_languages[0]}' or '{valid_languages[1]}'.")
1258+
gettext(f"Invalid starting language. Supported options are '{valid_languages[0]}' and '{valid_languages[1]}'.")
12621259
)
12631260
dref_operational_update = (
12641261
DrefOperationalUpdate.objects.filter(dref=dref, status=Dref.Status.APPROVED)

0 commit comments

Comments
 (0)