125 lines
4.3 KiB
Python
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)
|