···1818 name = models.CharField(max_length=200)
1919 description = models.TextField(blank=True)
2020 members = models.ManyToManyField(PawUser)
2121+ access_non_category_tickets = models.BooleanField(default=False)
21222223 def __str__(self):
2324 return self.name
···6667 indexes = [
6768 models.Index(fields=["priority", "title"]),
6869 ]
7070+7171+ @classmethod
7272+ def _get_tickets(cls, user) -> models.QuerySet:
7373+ """
7474+ For regular users with no team: return all open tickets that are created by the user
7575+ """
7676+ user_teams = user.team_set.all()
7777+ if not user_teams:
7878+ return cls.objects.filter(user=user)
7979+8080+ q = cls.objects.filter(
8181+ models.Q(user=user) | # tickets created by user
8282+ (models.Q(assigned_team__in=user_teams) | models.Q(assigned_to=user)) | # tickets assigned to user or user's team
8383+ (models.Q(assigned_team=None) & models.Q(category=None)) # tickets that are not assigned and have no category (general), needs to be excluded with filter
8484+ )
8585+8686+ if not any([team.access_non_category_tickets for team in user_teams]):
8787+ return q.exclude(models.Q(assigned_team=None) & models.Q(category=None) & ~models.Q(user=user))
8888+ return q
8989+9090+ @classmethod
9191+ def get_open_tickets(cls, user) -> models.QuerySet:
9292+ """
9393+ For regular users with no team: return all open tickets that are created by the user
9494+ """
9595+ return cls._get_tickets(user).exclude(status=cls.Status.CLOSED)
9696+9797+ @classmethod
9898+ def get_closed_tickets(cls, user) -> models.QuerySet:
9999+ """
100100+ For regular users with no team: return all closed tickets that are created by the user
101101+ """
102102+ return cls._get_tickets(user).filter(status=cls.Status.CLOSED)
103103+104104+ def can_open(self, user):
105105+ return self in Ticket._get_tickets(user)
106106+6910770108 def close_ticket(self):
71109 self.status = self.Status.CLOSED
+2-10
ticketing/views.py
···8899@login_required
1010def show_tickets(request):
1111- if request.user.is_staff:
1212- # show only tickets that are not closed and are not assigned or assigned to the current user's team
1313- tickets = Ticket.objects.filter(
1414- ~Q(status=Ticket.Status.CLOSED) & (~Q(assigned_team=None)
1515- | ~Q(assigned_team__in=request.user.team_set.all()))
1616- ).order_by("priority", "-created_at")
1717- else:
1818- tickets = Ticket.objects.filter(
1919- user=request.user).order_by("-created_at")
1111+ tickets = Ticket.get_open_tickets(request.user).order_by("priority", "-updated_at")
2012 return render(request, "ticketing/tickets.html", {"tickets": tickets})
21132214···3729 ticket = get_object_or_404(Ticket, pk=ticket_id)
3830 # comment_templates = Template.objects.filter(category=ticket.category)
39314040- if request.user != ticket.user and not request.user.is_staff:
3232+ if not ticket.can_open(request.user):
4133 return redirect("all_tickets")
42344335 form, template_form, team_assignment_form, category_assignment_form = CommentForm(