Files
korrekturmanagementsystem/ticketsystem/views.py
2025-05-05 18:59:00 +02:00

123 lines
4.0 KiB
Python

from django.views.generic import ListView, TemplateView
from django.views.generic.edit import CreateView, UpdateView
from django.urls import reverse_lazy
from django.views.generic.detail import DetailView
from django.views.generic.edit import FormMixin
from .forms import CommentForm
from django.urls import reverse
from django.contrib.auth.mixins import LoginRequiredMixin
from django.contrib import messages
from django.shortcuts import redirect
from .models import Ticket, TicketHistory
class HomeView(TemplateView):
template_name = "ticketsystem/home.html"
class TicketListView(ListView):
model = Ticket
template_name = "ticketsystem/index.html"
context_object_name = "tickets"
ordering = ["-created_at"] # neueste zuerst
paginate_by = 10 # optional: Pagination (10 Tickets pro Seite)
def get_queryset(self):
queryset = super().get_queryset()
status = self.request.GET.get("status")
if status:
queryset = queryset.filter(status=status)
return queryset
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["selected_status"] = self.request.GET.get("status", "")
return context
class TicketDetailView(FormMixin, DetailView):
model = Ticket
template_name = "ticketsystem/detail.html"
context_object_name = "ticket"
form_class = CommentForm
def get_success_url(self):
return reverse("detail", kwargs={"pk": self.object.pk})
def post(self, request, *args, **kwargs):
self.object = self.get_object()
form = self.get_form()
if form.is_valid():
comment = form.save(commit=False)
comment.ticket = self.object
comment.author = request.user
comment.save()
return super().form_valid(form)
return self.form_invalid(form)
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["form"] = self.get_form()
return context
class TicketCreateView(CreateView):
model = Ticket
fields = [
"title",
"description",
"priority",
"assigned_to",
] # user & status wird automatisch gesetzt
template_name = "ticketsystem/ticket_form.html"
success_url = reverse_lazy("ticket-list")
def form_valid(self, form):
form.instance.created_by = (
self.request.user
) # Der angemeldete User wird automatisch gesetzt
form.instance.status = "open" # Neues Ticket beginnt immer als "offen"
return super().form_valid(form)
class TicketUpdateView(LoginRequiredMixin, UpdateView):
model = Ticket
fields = ["title", "description", "status", "priority", "assigned_to"]
template_name = "ticketsystem/ticket_form.html"
def dispatch(self, request, *args, **kwargs):
ticket = self.get_object()
user = request.user
if user != ticket.assigned_to:
messages.error(request, "⛔ Du darfst dieses Ticket nicht bearbeiten.")
return redirect("detail", pk=ticket.pk)
return super().dispatch(request, *args, **kwargs)
def get_queryset(self):
return Ticket.objects.all() # Optional: Nur eigene Tickets bearbeiten lassen?
def form_valid(self, form):
ticket = form.instance
original = Ticket.objects.get(pk=ticket.pk)
response = super().form_valid(form) # Speichert das Ticket
tracked_fields = ["status", "description", "priority"]
for field in tracked_fields:
if field in form.changed_data:
old_value = getattr(original, field)
new_value = form.cleaned_data.get(field)
TicketHistory.objects.create(
ticket=ticket,
changed_by=self.request.user,
field=field,
old_value=str(old_value),
new_value=str(new_value),
)
return response
def get_success_url(self):
return reverse_lazy("detail", kwargs={"pk": self.object.pk})