estelam ticket, varizha , others

This commit is contained in:
javad committed 2026-10-13 15:48:24 +03:30
1 parent 35a1ec1794
commit 6b546aad76
71 files changed
+2865 -191

No files matched your search

+46
View File
@@ -70,6 +70,20 @@ class TicketPolicy:
}
@classmethod
def can_view(cls,user,ticket):
from .models import DispatchResponseControl
if ticket.group_dispatch_id and DispatchResponseControl.objects.filter(dispatch_id=ticket.group_dispatch_id).exists():
if not user.is_authenticated:
return False
if cls.is_customer(user):
return ticket.customer_id == user.pk
if DispatchPolicy.can_view(user, ticket.group_dispatch):
return True
return bool(ticket.created_by_id == user.pk or ticket.owner_id == user.pk or ticket.selected_expert_id == user.pk
or ticket.access_grants.filter(user=user, revoked_at__isnull=True).exists())
return cls._legacy_can_view(user, ticket)
@classmethod
def _legacy_can_view(cls,user,ticket):
if not user.is_authenticated: return False
if cls.is_customer(user): return ticket.customer_id==user.id
if user.is_superuser or user.has_perm("tickets.view_all_tickets"): return True
@@ -83,6 +97,11 @@ class TicketPolicy:
return False
@classmethod
def viewable_q(cls, user):
from .dispatch_responses import managed_ticket_q
return (cls._legacy_viewable_q(user) | Q(group_dispatch__in=DispatchPolicy.visible_dispatches(user))) & managed_ticket_q(user)
@classmethod
def _legacy_viewable_q(cls, user):
"""Database equivalent of can_view; use it for every staff ticket collection."""
if user.is_superuser or user.has_perm("tickets.view_all_tickets"):
return Q()
@@ -169,5 +188,32 @@ class DispatchPolicy:
@classmethod
def can_view(cls, user, dispatch):
if dispatch.created_by_id == user.id:
from .models import DispatchResponseControl
if DispatchResponseControl.objects.filter(dispatch_id=dispatch.pk).exists():
return bool(user.is_authenticated and user.is_active and getattr(user, "account_type", None) == "STAFF")
return cls.can_create(user, dispatch.unit, dispatch.operation_type)
return cls.can_view_all(user, dispatch.operation_type, dispatch.unit)
@classmethod
def visible_dispatches(cls, user):
from .models import GroupDispatch
if user.is_superuser:
return GroupDispatch.objects.all()
visibility = Q(created_by=user, response_control__isnull=False)
memberships = list(user.unit_memberships.filter(is_active=True, unit__is_active=True).select_related("unit"))
for operation_type in GroupDispatch.OperationType.values:
if cls.can_view_all(user, operation_type):
visibility |= Q(operation_type=operation_type)
continue
view_units = [item.unit_id for item in memberships if cls.can_view_all(user, operation_type, item.unit)]
create_units = [item.unit_id for item in memberships if cls.can_create(user, item.unit, operation_type)]
visibility |= Q(operation_type=operation_type, unit_id__in=view_units)
visibility |= Q(operation_type=operation_type, unit_id__in=create_units, created_by=user)
return GroupDispatch.objects.filter(visibility)
@classmethod
def can_list(cls, user):
if any(cls.can_view_all(user, kind) for kind in cls.VIEW_ALL_PERMISSIONS):
return True
units = user.unit_memberships.filter(is_active=True, unit__is_active=True).select_related("unit")
return any(cls.can_view_all(user, kind, item.unit) for item in units for kind in cls.VIEW_ALL_PERMISSIONS)