Skip to content
Merged
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
2 changes: 1 addition & 1 deletion assets
Submodule assets updated 1 files
+0 −4 openapi-schema.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# Generated by Django 4.2.30 on 2026-05-22 03:24

from django.db import migrations, models


class Migration(migrations.Migration):
dependencies = [
("eap", "0004_emailrecipient_and_more"),
]

operations = [
migrations.RemoveConstraint(
model_name="fulleap",
name="unique_full_eap_version",
),
migrations.RemoveConstraint(
model_name="simplifiedeap",
name="unique_simplified_eap_version",
),
migrations.AddConstraint(
model_name="fulleap",
constraint=models.UniqueConstraint(
fields=("eap_registration", "version"),
name="unique_full_eap_version",
violation_error_message="A Full EAP for this EAP Registration with this version already exists.",
),
),
migrations.AddConstraint(
model_name="simplifiedeap",
constraint=models.UniqueConstraint(
fields=("eap_registration", "version"),
name="unique_simplified_eap_version",
violation_error_message="A Simplified EAP for this EAP Registration with this version already exists.",
),
),
]
6 changes: 6 additions & 0 deletions eap/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -1331,6 +1331,9 @@ class Meta:
models.UniqueConstraint(
fields=["eap_registration", "version"],
name="unique_simplified_eap_version",
violation_error_message=_(
"A Simplified EAP for this EAP Registration with this version already exists.",
),
)
]

Expand Down Expand Up @@ -1880,6 +1883,9 @@ class Meta:
models.UniqueConstraint(
fields=["eap_registration", "version"],
name="unique_full_eap_version",
violation_error_message=_(
"A Full EAP for this EAP Registration with this version already exists.",
),
)
]

Expand Down
33 changes: 23 additions & 10 deletions eap/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
from django.utils.translation import gettext
from rest_framework import serializers
from rest_framework.exceptions import PermissionDenied
from rest_framework.validators import UniqueTogetherValidator

from api.serializers import (
Admin2Serializer,
Expand Down Expand Up @@ -557,6 +558,7 @@ class SimplifiedEAPSerializer(
):

# FILES
version = serializers.IntegerField(default=1, read_only=True)
hazard_impact_images = EAPFileUpdateSerializer(required=False, many=True)
selected_early_actions_images = EAPFileUpdateSerializer(required=False, many=True, allow_null=True)
risk_selected_protocols_images = EAPFileUpdateSerializer(required=False, many=True, allow_null=True)
Expand Down Expand Up @@ -585,6 +587,13 @@ class Meta:
"created_by",
"modified_by",
]
validators = [
UniqueTogetherValidator(
queryset=SimplifiedEAP.objects.all(),
fields=["eap_registration", "version"],
message="EAP for this registration has already been created.",
)
]
exclude = ("cover_image",)

def _validate_timeframe(self, data: dict[str, typing.Any]) -> None:
Expand Down Expand Up @@ -636,11 +645,6 @@ def _validate_timeframe(self, data: dict[str, typing.Any]) -> None:
{"operational_timeframe": gettext("operational timeframe value is not valid for Months unit.")}
)

def validate_eap_registration(self, eap_registration: EAPRegistration) -> EAPRegistration:
if not self.instance and eap_registration.has_eap_application:
raise serializers.ValidationError("EAP for this registration has already been created.")
return eap_registration

def validate(self, data: dict[str, typing.Any]) -> dict[str, typing.Any]:
original_eap_registration = getattr(self.instance, "eap_registration", None) if self.instance else None
eap_registration: EAPRegistration | None = data.get("eap_registration", original_eap_registration)
Expand All @@ -649,6 +653,9 @@ def validate(self, data: dict[str, typing.Any]) -> dict[str, typing.Any]:
if self.instance and original_eap_registration != eap_registration:
raise serializers.ValidationError("EAP Registration cannot be changed for existing EAP.")

if not self.instance and eap_registration.has_eap_application:
raise serializers.ValidationError(gettext("EAP for this registration has already been created."))

if self.instance and eap_registration.get_status_enum not in [
EAPRegistration.Status.UNDER_DEVELOPMENT,
EAPRegistration.Status.NS_ADDRESSING_COMMENTS,
Expand Down Expand Up @@ -690,6 +697,7 @@ class FullEAPSerializer(
CommonEAPFieldsSerializer,
):

version = serializers.IntegerField(default=1, read_only=True)
# admins
key_actors = KeyActorSerializer(many=True, required=True)

Expand Down Expand Up @@ -795,6 +803,13 @@ class Meta:
"created_by",
"modified_by",
]
validators = [
UniqueTogetherValidator(
queryset=FullEAP.objects.all(),
fields=["eap_registration", "version"],
message="EAP for this registration has already been created.",
)
]
exclude = ("cover_image",)

def _validate_timeframe(self, data: dict[str, typing.Any]) -> None:
Expand All @@ -811,11 +826,6 @@ def _validate_timeframe(self, data: dict[str, typing.Any]) -> None:
if lead_unit is not None and lead_time_value is not None and lead_unit != TimeFrame.DAYS:
raise serializers.ValidationError({"lead_timeframe_unit": gettext("lead timeframe unit must be Days for Full EAP.")})

def validate_eap_registration(self, eap_registration: EAPRegistration) -> EAPRegistration:
if not self.instance and eap_registration.has_eap_application:
raise serializers.ValidationError("EAP for this registration has already been created.")
return eap_registration

def validate(self, data: dict[str, typing.Any]) -> dict[str, typing.Any]:
original_eap_registration = getattr(self.instance, "eap_registration", None) if self.instance else None
eap_registration: EAPRegistration | None = data.get("eap_registration", original_eap_registration)
Expand All @@ -824,6 +834,9 @@ def validate(self, data: dict[str, typing.Any]) -> dict[str, typing.Any]:
if self.instance and original_eap_registration != eap_registration:
raise serializers.ValidationError("EAP Registration cannot be changed for existing EAP.")

if not self.instance and eap_registration.has_eap_application:
raise serializers.ValidationError(gettext("EAP for this registration has already been created."))

if self.instance and eap_registration.get_status_enum not in [
EAPRegistration.Status.UNDER_DEVELOPMENT,
EAPRegistration.Status.NS_ADDRESSING_COMMENTS,
Expand Down
3 changes: 3 additions & 0 deletions notifications/notification.py
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,9 @@ def send_notification(subject, recipients, html, mailtype="", cc_recipients=None
print("-" * 22, "EMAIL END -", "-" * 22)
return

recipients = recipients if isinstance(recipients, list) else [recipients]
cc_recipients = cc_recipients if isinstance(cc_recipients, list) else [cc_recipients]

to_addresses = clean_emails(recipients)
cc_addresses = clean_emails(cc_recipients)
addresses = to_addresses + cc_addresses
Expand Down
Loading