HH/apps/projects/signals.py
ismail badb6a9ebf
All checks were successful
Build and Push Docker Image / build (push) Successful in 2m41s
feat: QI Projects — team-member task management + My Tasks + notifications
Fixed 3 gaps in the QI Projects module:

Gap 1 (critical): team members couldn't manage their own tasks — the toggle
checkbox/edit/delete were gated behind admin-only can_edit. Now:
- _can_manage_task() helper: admins OR the task assignee OR project team members
- task_toggle_status + htmx_task_toggle_status use the new helper
- task_row.html shows the toggle for assignees (task.assigned_to.user_id check)

Gap 2: no "My QI Tasks" view — added /projects/my-tasks/ showing tasks assigned
to the current user across all projects, with toggle links + stats. Sidebar link.

Gap 3: no notification on task assignment — added apps/projects/signals.py
(post_save on QIProjectTask → create_in_app_notification). apps.py ready() wired.

Tested (headed, 11 PASS / 1 FAIL):
- Cross-department team members (Contact Center + different dept) can VIEW the
  project AND toggle their assigned tasks (both PASS)
- My Tasks view loads for team members
- Excel export returns 500 (real bug, reported)
- Project close via edit form needs correct hospital UUID (test harness issue)

Also bundles accumulated in-progress work across complaints, observations,
organizations, templates, and other modules.

Harness: seed_e2e_project + get_e2e_project_state CLI + qi-projects-workflow.spec.ts
2026-06-16 23:55:58 +03:00

39 lines
1.1 KiB
Python

"""
Signals for QI Projects — sends a notification when a task is assigned.
"""
import logging
from django.db.models.signals import post_save
from django.dispatch import receiver
logger = logging.getLogger(__name__)
@receiver(post_save, sender="projects.QIProjectTask")
def notify_task_assignment(sender, instance, created, **kwargs):
"""Send an in-app notification when a QI task is assigned to a staff member."""
if not instance.assigned_to:
return
# Only notify on new assignments (creation with an assignee)
if not created:
return
user = getattr(instance.assigned_to, "user", None)
if not user:
return
try:
from apps.notifications.services import create_in_app_notification
create_in_app_notification(
user=user,
title=f"New QI Task: {instance.title}",
message=f"You have been assigned a task in project '{instance.project.name}'.",
notification_type="qi_task_assigned",
action_url=f"/projects/{instance.project.id}/",
)
except Exception as e:
logger.warning(f"Failed to send QI task notification: {e}")