""" 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)