from django.contrib.auth.mixins import LoginRequiredMixin from django.shortcuts import get_object_or_404, render from django.urls import reverse_lazy from django.views.generic import CreateView, DeleteView, DetailView, ListView, UpdateView, View from apps.core.permissions import AdminRequiredMixin from apps.tickets.models import Ticket, TicketComment class TicketListView(LoginRequiredMixin, ListView): model = Ticket template_name = "pages/tickets/ticket_list.html" context_object_name = "tickets" paginate_by = 20 def get_queryset(self): user = self.request.user qs = Ticket.objects.select_related("creator", "project", "assignee") if user.is_admin(): return qs.all() if user.is_client(): return qs.filter(creator=user) return qs.filter(project__members=user) class TicketDetailView(LoginRequiredMixin, DetailView): model = Ticket template_name = "pages/tickets/ticket_detail.html" context_object_name = "ticket" def get_queryset(self): user = self.request.user qs = Ticket.objects.select_related("creator", "project", "assignee") if user.is_admin(): return qs.all() if user.is_client(): return qs.filter(creator=user) return qs.filter(project__members=user) def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) context["comments"] = self.object.comments.select_related("author").all() return context class TicketCreateView(LoginRequiredMixin, CreateView): model = Ticket template_name = "pages/tickets/ticket_form.html" fields = ["project", "title", "description", "ticket_type", "priority", "assignee"] def form_valid(self, form): form.instance.creator = self.request.user return super().form_valid(form) def get_success_url(self): return reverse_lazy("ticket_detail", kwargs={"pk": self.object.pk}) class TicketUpdateView(LoginRequiredMixin, UpdateView): model = Ticket template_name = "pages/tickets/ticket_form.html" fields = ["title", "description", "ticket_type", "status", "priority", "assignee"] def get_success_url(self): return reverse_lazy("ticket_detail", kwargs={"pk": self.object.pk}) class TicketDeleteView(AdminRequiredMixin, DeleteView): model = Ticket template_name = "pages/tickets/ticket_confirm_delete.html" success_url = reverse_lazy("ticket_list") class TicketCommentCreateView(LoginRequiredMixin, View): def post(self, request, ticket_pk): ticket = get_object_or_404(Ticket, pk=ticket_pk) body = request.POST.get("body", "") if body: TicketComment.objects.create(ticket=ticket, author=request.user, body=body) if request.htmx: return render(request, "partials/tickets/comment_list.html", {"comments": ticket.comments.all()}) return render(request, "pages/tickets/ticket_detail.html", {"ticket": ticket, "comments": ticket.comments.all()})