estelam ticket, varizha , others
This commit is contained in:
1 parent
35a1ec1794
commit
6b546aad76
71 files changed
+2865
-191
No files matched your search
@@ -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)
|
||||
Reference in new issue
Block a user