agdar/mdt/signals.py
Marwan Alwali 2f1681b18c update
2025-11-11 13:44:48 +03:00

125 lines
4.3 KiB
Python

"""
Django signals for MDT app.
Handles automated workflows and notifications.
"""
from django.db.models.signals import post_save, pre_save
from django.dispatch import receiver
from django.utils import timezone
from .models import (
MDTNote,
MDTContribution,
MDTApproval,
MDTMention,
)
from .services import (
MDTNotificationService,
MDTWorkflowService,
)
from notifications.models import Notification
@receiver(post_save, sender=MDTNote)
def handle_mdt_note_created(sender, instance, created, **kwargs):
"""
Handle post-save signal for MDTNote.
Send notifications to relevant users.
"""
if created:
# Notify clinical coordinator about new MDT note
from core.models import User
coordinators = User.objects.filter(
tenant=instance.tenant,
role='CLINICAL_COORDINATOR',
is_active=True
)
for coordinator in coordinators:
Notification.objects.create(
user=coordinator,
notification_type='MDT_CREATED',
title=f"New MDT Note: {instance.title}",
message=f"MDT note initiated by {instance.initiated_by.get_full_name()} for {instance.patient.get_full_name()}",
)
@receiver(post_save, sender=MDTContribution)
def handle_contribution_added(sender, instance, created, **kwargs):
"""
Handle post-save signal for MDTContribution.
Notify other contributors and handle mentions.
"""
if created:
# Notify other contributors
other_contributors = instance.mdt_note.contributors.exclude(
id=instance.contributor.id
).distinct()
for contributor in other_contributors:
Notification.objects.create(
user=contributor,
notification_type='MDT_CONTRIBUTION',
title=f"New Contribution to MDT Note: {instance.mdt_note.title}",
message=f"{instance.contributor.get_full_name()} ({instance.clinic.name_en}) added a contribution",
)
# Notify initiator if different from contributor
if instance.mdt_note.initiated_by and instance.mdt_note.initiated_by != instance.contributor:
Notification.objects.create(
user=instance.mdt_note.initiated_by,
notification_type='MDT_CONTRIBUTION',
title=f"New Contribution to Your MDT Note: {instance.mdt_note.title}",
message=f"{instance.contributor.get_full_name()} ({instance.clinic.name_en}) added a contribution",
)
@receiver(post_save, sender=MDTApproval)
def handle_approval_given(sender, instance, created, **kwargs):
"""
Handle post-save signal for MDTApproval.
Check if note can be finalized and notify contributors.
"""
if not created and instance.approved:
# Notify initiator
if instance.mdt_note.initiated_by:
Notification.objects.create(
user=instance.mdt_note.initiated_by,
notification_type='MDT_APPROVAL',
title=f"MDT Note Approved: {instance.mdt_note.title}",
message=f"{instance.approver.get_full_name()} ({instance.clinic.name_en}) approved the MDT note",
)
# Check if note can be auto-finalized
MDTWorkflowService.check_and_auto_finalize(instance.mdt_note)
@receiver(pre_save, sender=MDTNote)
def handle_mdt_note_status_change(sender, instance, **kwargs):
"""
Handle pre-save signal for MDTNote.
Track status changes and set finalization timestamp.
"""
if instance.pk:
try:
old_instance = MDTNote.objects.get(pk=instance.pk)
# If status changed to FINALIZED
if (old_instance.status != MDTNote.Status.FINALIZED and
instance.status == MDTNote.Status.FINALIZED and
not instance.finalized_at):
instance.finalized_at = timezone.now()
except MDTNote.DoesNotExist:
pass
@receiver(post_save, sender=MDTMention)
def handle_mention_created(sender, instance, created, **kwargs):
"""
Handle post-save signal for MDTMention.
Send notification to mentioned user.
"""
if created:
MDTNotificationService.notify_mention(instance)