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
94 changes: 93 additions & 1 deletion eap/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,16 @@
TimeFrame,
YearsTimeFrameChoices,
)
from eap.tasks import send_new_eap_registration_email
from eap.tasks import (
send_approved_email,
send_eap_resubmission_email,
send_feedback_email,
send_feedback_email_for_resubmitted_eap,
send_new_eap_registration_email,
send_new_eap_submission_email,
send_pending_pfa_email,
send_technical_validation_email,
)
from eap.utils import (
has_country_permission,
is_user_ifrc_admin,
Expand Down Expand Up @@ -906,3 +915,86 @@ def validate_review_checklist_file(self, file):
validate_file_type(file)

return file

def update(self, instance: EAPRegistration, validated_data: dict[str, typing.Any]) -> EAPRegistration:
old_status = instance.get_status_enum
updated_instance = super().update(instance, validated_data)
new_status = updated_instance.get_status_enum

if old_status == new_status:
return updated_instance

eap_registration_id = updated_instance.id
assert updated_instance.get_eap_type_enum is not None, "EAP type must not be None"

if updated_instance.get_eap_type_enum == EAPType.SIMPLIFIED_EAP:
eap_count = SimplifiedEAP.objects.filter(eap_registration=updated_instance).count()
else:
eap_count = FullEAP.objects.filter(eap_registration=updated_instance).count()

if (old_status, new_status) == (
EAPRegistration.Status.UNDER_DEVELOPMENT,
EAPRegistration.Status.UNDER_REVIEW,
):
transaction.on_commit(lambda: send_new_eap_submission_email.delay(eap_registration_id))

elif (old_status, new_status) == (
EAPRegistration.Status.UNDER_REVIEW,
EAPRegistration.Status.NS_ADDRESSING_COMMENTS,
):
"""
NOTE:
At the transition (UNDER_REVIEW -> NS_ADDRESSING_COMMENTS), the EAP snapshot
is generated inside `_validate_status()` BEFORE we reach this `update()` method.

That snapshot operation:
- Locks the reviewed EAP (previous version)
- Creates a new snapshot (incremented version)
- Updates latest_simplified_eap or latest_full_eap to the new version

Email logic based on eap_count:
- If eap_count == 2 (i.e., first snapshot already exists and this is the first IFRC feedback cycle)
- Send the first feedback email
- Else (eap_count > 2), indicating subsequent feedback cycles:
- Send the resubmitted feedback email

Therefore:
- version == 2 always corresponds to the first IFRC feedback cycle
- Any later versions (>= 3) correspond to resubmitted cycles
"""

if eap_count == 2:
transaction.on_commit(lambda: send_feedback_email.delay(eap_registration_id))
elif eap_count > 2:
transaction.on_commit(lambda: send_feedback_email_for_resubmitted_eap.delay(eap_registration_id))

elif (old_status, new_status) == (
EAPRegistration.Status.NS_ADDRESSING_COMMENTS,
EAPRegistration.Status.UNDER_REVIEW,
):
transaction.on_commit(lambda: send_eap_resubmission_email.delay(eap_registration_id))
elif (old_status, new_status) == (
EAPRegistration.Status.TECHNICALLY_VALIDATED,
EAPRegistration.Status.NS_ADDRESSING_COMMENTS,
):
transaction.on_commit(lambda: send_feedback_email_for_resubmitted_eap.delay(eap_registration_id))

elif (old_status, new_status) == (
EAPRegistration.Status.UNDER_REVIEW,
EAPRegistration.Status.TECHNICALLY_VALIDATED,
):
transaction.on_commit(lambda: send_technical_validation_email.delay(eap_registration_id))

elif (old_status, new_status) == (
EAPRegistration.Status.TECHNICALLY_VALIDATED,
EAPRegistration.Status.PENDING_PFA,
):
transaction.on_commit(lambda: send_pending_pfa_email.delay(eap_registration_id))

elif (old_status, new_status) == (
EAPRegistration.Status.PENDING_PFA,
EAPRegistration.Status.APPROVED,
):
transaction.on_commit(lambda: send_approved_email.delay(eap_registration_id))

return updated_instance
Loading
Loading