Skip to content
Draft
Show file tree
Hide file tree
Changes from all 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
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