SciPost Code Repository

Skip to content
Snippets Groups Projects
managers.py 2.39 KiB
Newer Older
__copyright__ = "Copyright © Stichting SciPost (SciPost Foundation)"
__license__ = "AGPL v3"


from django.db import models

from .constants import (
    TICKET_STATUS_UNASSIGNED,
    TICKET_STATUS_ASSIGNED,
    TICKET_STATUS_PICKEDUP,
    TICKET_STATUS_PASSED_ON,
    TICKET_STATUS_AWAITING_RESPONSE_ASSIGNEE,
    TICKET_STATUS_AWAITING_RESPONSE_USER,
    TICKET_STATUS_RESOLVED,
    TICKET_STATUS_CLOSED,
)
from guardian.shortcuts import get_objects_for_user

class QueueQuerySet(models.QuerySet):
    def anchors(self):
        """Return only Queues which have no parent Queue."""
        return self.filter(parent_queue__isnull=True)


class TicketQuerySet(models.QuerySet):
    def unassigned(self):
        return self.filter(status=TICKET_STATUS_UNASSIGNED)

    def assigned(self):
        return self.filter(status=TICKET_STATUS_ASSIGNED)

    def resolved(self):
        return self.filter(status=TICKET_STATUS_RESOLVED)

    def closed(self):
        return self.filter(status=TICKET_STATUS_CLOSED)

    def awaiting_handling(self):
        return self.filter(status__in=[TICKET_STATUS_ASSIGNED, TICKET_STATUS_PASSED_ON])

    def in_handling(self):
        return self.filter(
            status__in=[
                TICKET_STATUS_PICKEDUP,
                TICKET_STATUS_AWAITING_RESPONSE_ASSIGNEE,
                TICKET_STATUS_AWAITING_RESPONSE_USER,
            ]
        )
Jean-Sébastien Caux's avatar
Jean-Sébastien Caux committed
    def assigned_to_others(self, user):
        return self.exclude(assigned_to=user)

    def handled(self):
        return self.filter(status__in=[TICKET_STATUS_RESOLVED, TICKET_STATUS_CLOSED])

    def visible_by(self, user):
        from helpdesk.models import Queue

        # If user has permission to view all tickets in the queue, return all tickets
        # in the queue. Otherwise, return only tickets assigned to the user.
        if user.has_perm("helpdesk.can_view_all_tickets"):
            return self

        user_viewable_queues = get_objects_for_user(
            user, "helpdesk.can_view_queue", klass=Queue
        )
        tickets_viewable_because_of_queue = self.filter(queue__in=user_viewable_queues)

        user_viewable_tickets = get_objects_for_user(
            user, "helpdesk.can_view_ticket", klass=self
        )

        user_handled_tickets = self.filter(assigned_to=user)

        return (
            tickets_viewable_because_of_queue
            | user_viewable_tickets
            | user_handled_tickets
        )