36 lines
1.2 KiB
Python
36 lines
1.2 KiB
Python
"""Read-only option metadata for the staff dispatch composer."""
|
|
|
|
from django.db.models import Count, Q
|
|
|
|
from .models import GroupDispatch, TicketCategory
|
|
from .policies import DispatchPolicy
|
|
|
|
|
|
def dispatch_form_options(user, units, groups):
|
|
"""Expose only permitted units; recipient counts follow the sending service."""
|
|
units = list(units)
|
|
eligible = (
|
|
Q(contacts__user__is_active=True, contacts__user__mobile__isnull=False)
|
|
& ~Q(contacts__user__mobile="")
|
|
)
|
|
return {
|
|
"units": [
|
|
{
|
|
"id": unit.pk,
|
|
"name": unit.name,
|
|
"operations": [
|
|
kind for kind in GroupDispatch.OperationType.values
|
|
if DispatchPolicy.can_create(user, unit, kind)
|
|
],
|
|
}
|
|
for unit in units
|
|
],
|
|
"groups": list(groups.annotate(recipient_count=Count("contacts", filter=eligible)).values(
|
|
"id", "name", "unit_id", "recipient_count",
|
|
)),
|
|
"categories": list(TicketCategory.objects.filter(
|
|
Q(unit_id__in=[unit.pk for unit in units]) | Q(unit__isnull=True),
|
|
is_active=True,
|
|
).order_by("title").values("id", "title", "unit_id")),
|
|
}
|