123 lines
4.1 KiB
Python
123 lines
4.1 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(LoginRequiredMixin, 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})
|