Skip to content
Draft
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions dref/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@ class DrefAdmin(CompareVersionAdmin, TranslationAdmin, admin.ModelAdmin):
"risk_security",
"proposed_action",
)
readonly_fields = ("original_language",)

def get_queryset(self, request):
return (
Expand Down Expand Up @@ -143,6 +144,7 @@ class DrefOperationalUpdateAdmin(CompareVersionAdmin, TranslationAdmin, admin.Mo
"district",
"risk_security",
)
readonly_fields = ("original_language",)
list_filter = ["dref"]

def get_queryset(self, request):
Expand Down Expand Up @@ -199,6 +201,7 @@ class DrefFinalReportAdmin(CompareVersionAdmin, TranslationAdmin, admin.ModelAdm
"national_society_actions",
"source_information",
)
readonly_fields = ("original_language",)
list_filter = ["dref"]
search_fields = ["title", "national_society__name", "appeal_code"]

Expand Down
62 changes: 56 additions & 6 deletions dref/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
from django.contrib.auth.models import User
from django.db import models, transaction
from django.utils import timezone
from django.utils.translation import gettext
from django.utils.translation import get_language, gettext
from django.utils.translation import gettext_lazy as _
from drf_spectacular.utils import extend_schema_field
from rest_framework import serializers
Expand Down Expand Up @@ -35,6 +35,7 @@
)
from dref.utils import get_dref_users
from lang.serializers import ModelSerializer
from main.translation import TRANSLATOR_ORIGINAL_LANGUAGE_FIELD_NAME
from main.writable_nested_serializers import NestedCreateMixin, NestedUpdateMixin
from utils.file_check import validate_file_type

Expand Down Expand Up @@ -348,26 +349,33 @@ def get_image_url(self, identifiedneed) -> str:


class MiniOperationalUpdateSerializer(ModelSerializer):
status_display = serializers.CharField(source="get_status_display", read_only=True)

class Meta:
model = DrefOperationalUpdate
fields = [
"id",
"title",
"operational_update_number",
"status",
"status_display",
]


class MiniDrefFinalReportSerializer(ModelSerializer):
status_display = serializers.CharField(source="get_status_display", read_only=True)

class Meta:
model = DrefFinalReport
fields = [
"id",
"title",
"status",
"status_display",
]


class DrefSerializer(NestedUpdateMixin, NestedCreateMixin, ModelSerializer):
class DrefSerializer(NestedUpdateMixin, NestedCreateMixin, serializers.ModelSerializer):
SUB_TOTAL_COST = 75000
SURGE_DEPLOYMENT_COST = 10000
SURGE_INDIRECT_COST = 5800
Expand Down Expand Up @@ -426,6 +434,7 @@ class Meta:
"created_by",
"budget_file_preview",
"is_dref_imminent_v2",
"original_language",
)
exclude = (
"cover_image",
Expand Down Expand Up @@ -602,6 +611,12 @@ def validate_budget_file_preview(self, budget_file_preview):
validate_file_type(budget_file_preview)
return budget_file_preview

def _set_original_language(self, validated_data):
current_lang = get_language()
validated_data["original_language"] = current_lang
validated_data[TRANSLATOR_ORIGINAL_LANGUAGE_FIELD_NAME] = current_lang
return validated_data

def create(self, validated_data):
validated_data["created_by"] = self.context["request"].user
validated_data["is_active"] = True
Expand All @@ -619,7 +634,7 @@ def create(self, validated_data):
# Event Description
validated_data["event_scope"] = None
validated_data["identified_gaps"] = None
# Targeted Population
# Targeted Populationtranslate_model_fields_to_english
validated_data["women"] = None
validated_data["men"] = None
validated_data["girls"] = None
Expand All @@ -630,6 +645,8 @@ def create(self, validated_data):
validated_data["communication"] = None
dref_assessment_report = super().create(validated_data)
dref_assessment_report.needs_identified.clear()
# set original language
validated_data = self._set_original_language(validated_data)
return dref_assessment_report
# NOTE: Setting flag for only newly created DREF of type IMMINENT
if type_of_dref == Dref.DrefType.IMMINENT:
Expand All @@ -639,6 +656,8 @@ def create(self, validated_data):
to = {u.email for u in validated_data["users"]}
else:
to = None
# set original language
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this a TODO?

validated_data = self._set_original_language(validated_data)
dref = super().create(validated_data)
if to:
transaction.on_commit(lambda: send_dref_email.delay(dref.id, list(to), "New"))
Expand All @@ -648,6 +667,14 @@ def update(self, instance, validated_data):
validated_data["modified_by"] = self.context["request"].user
modified_at = validated_data.pop("modified_at", None)
type_of_dref = validated_data.get("type_of_dref")
current_lang = get_language()
original_lang = instance.translation_module_original_language
if instance.status == Dref.Status.FINALIZED:
if current_lang != "en":
raise serializers.ValidationError(gettext("Finalized records can only be updated in English."))
elif current_lang != original_lang:
raise serializers.ValidationError(gettext("Only original language is supported: %s" % original_lang))

if modified_at is None:
raise serializers.ValidationError({"modified_at": "Modified At is required!"})
if type_of_dref and type_of_dref == Dref.DrefType.ASSESSMENT:
Expand Down Expand Up @@ -692,7 +719,7 @@ def update(self, instance, validated_data):
return dref


class DrefOperationalUpdateSerializer(NestedUpdateMixin, NestedCreateMixin, ModelSerializer):
class DrefOperationalUpdateSerializer(NestedUpdateMixin, NestedCreateMixin, serializers.ModelSerializer):
MAX_NUMBER_OF_IMAGES = 4
national_society_actions = NationalSocietyActionSerializer(many=True, required=False)
needs_identified = IdentifiedNeedSerializer(many=True, required=False)
Expand Down Expand Up @@ -723,6 +750,7 @@ class Meta:
"operational_update_number",
"modified_by",
"created_by",
"original_language",
)
exclude = (
"images",
Expand Down Expand Up @@ -776,6 +804,7 @@ def validate_images_file(self, images):

def create(self, validated_data):
dref = validated_data["dref"]
current_language = get_language()
dref_operational_update = DrefOperationalUpdate.objects.filter(dref=dref).order_by("-operational_update_number").first()
validated_data["created_by"] = self.context["request"].user
if not dref_operational_update:
Expand Down Expand Up @@ -899,7 +928,8 @@ def create(self, validated_data):
validated_data["is_man_made_event"] = dref.is_man_made_event
validated_data["event_text"] = dref.event_text
validated_data["did_national_society"] = dref.did_national_society

validated_data["original_language"] = current_language
validated_data[TRANSLATOR_ORIGINAL_LANGUAGE_FIELD_NAME] = current_language
operational_update = super().create(validated_data)
# XXX: Copy files from DREF (Only nested serialized fields)
nested_serialized_file_fields = [
Expand Down Expand Up @@ -1069,6 +1099,15 @@ def create(self, validated_data):
def update(self, instance, validated_data):
validated_data["modified_by"] = self.context["request"].user
modified_at = validated_data.pop("modified_at", None)

current_lang = get_language()
original_lang = instance.translation_module_original_language
if instance.status == Dref.Status.FINALIZED:
if current_lang != "en":
raise serializers.ValidationError(gettext("Finalized records can only be updated in English."))
elif current_lang != original_lang:
raise serializers.ValidationError(gettext("Only original language is supported: %s" % original_lang))

if modified_at is None:
raise serializers.ValidationError({"modified_at": "Modified At is required!"})

Expand All @@ -1078,7 +1117,7 @@ def update(self, instance, validated_data):
return super().update(instance, validated_data)


class DrefFinalReportSerializer(NestedUpdateMixin, NestedCreateMixin, ModelSerializer):
class DrefFinalReportSerializer(NestedUpdateMixin, NestedCreateMixin, serializers.ModelSerializer):
MAX_NUMBER_OF_PHOTOS = 4
SUB_TOTAL_COST = 75000
national_society_actions = NationalSocietyActionSerializer(many=True, required=False)
Expand Down Expand Up @@ -1112,6 +1151,7 @@ class Meta:
"created_by",
"financial_report_preview",
"is_dref_imminent_v2",
"original_language",
)
exclude = (
"images",
Expand Down Expand Up @@ -1222,13 +1262,16 @@ def create(self, validated_data):
# here check if there is operational update for corresponding dref
# if yes copy from the latest operational update
# else copy from dref
current_language = get_language()
dref = validated_data["dref"]
dref_operational_update = (
DrefOperationalUpdate.objects.filter(dref=dref, status=Dref.Status.APPROVED)
.order_by("-operational_update_number")
.first()
)
validated_data["created_by"] = self.context["request"].user
validated_data["original_language"] = current_language
validated_data[TRANSLATOR_ORIGINAL_LANGUAGE_FIELD_NAME] = current_language
# NOTE: Checks and common fields for the new dref final reports of new dref imminents
if dref.type_of_dref == Dref.DrefType.IMMINENT and dref.is_dref_imminent_v2:
validated_data["is_dref_imminent_v2"] = True
Expand Down Expand Up @@ -1511,6 +1554,13 @@ def create(self, validated_data):

def update(self, instance, validated_data):
modified_at = validated_data.pop("modified_at", None)
current_lang = get_language()
original_lang = instance.translation_module_original_language
if instance.status == Dref.Status.FINALIZED:
if current_lang != "en":
raise serializers.ValidationError(gettext("Finalized records can only be updated in English."))
elif current_lang != original_lang:
raise serializers.ValidationError(gettext("Only original language is supported: %s" % original_lang))
if modified_at is None:
raise serializers.ValidationError({"modified_at": "Modified At is required!"})
if modified_at and instance.modified_at and modified_at < instance.modified_at:
Expand Down
22 changes: 22 additions & 0 deletions dref/tasks.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,17 @@
import logging

from celery import shared_task
from django.apps import apps as django_apps
from django.template.loader import render_to_string

from lang.tasks import ModelTranslator
from notifications.notification import send_notification

from .models import Dref
from .utils import get_email_context

logger = logging.getLogger(__name__)


@shared_task
def send_dref_email(dref_id, users_emails, new_or_updated=""):
Expand All @@ -20,3 +26,19 @@ def send_dref_email(dref_id, users_emails, new_or_updated=""):

send_notification(email_subject, users_emails, email_body, email_type)
return email_context


@shared_task()
def translate_fields_to_english(model_name: str, pk: int) -> None:
model = django_apps.get_model(model_name)
obj = model.objects.get(pk=pk)
try:
ModelTranslator().translate_model_fields_to_english(obj)
obj.status = Dref.Status.FINALIZED
obj.translation_module_original_language = "en"
obj.save(update_fields=["status", "translation_module_original_language"])
except Exception as exc:
obj.status = Dref.Status.DRAFT
obj.save(update_fields=["status"])
logger.warning(f"Translation failed for '{model_name} {pk}': {exc}", exc_info=True)
raise exc
Loading
Loading