feat: replaced TicketDetailView with TicketDetailUpdateView

This commit is contained in:
2025-05-26 20:16:10 +02:00
parent 6306ffd432
commit 8cc038ee20
3 changed files with 319 additions and 108 deletions

View File

@@ -46,31 +46,96 @@ class TicketListView(ListView):
return context
class TicketDetailView(FormMixin, DetailView):
class TicketDetailUpdateView(UpdateView):
model = Ticket
fields = ["title", "description", "status", "priority", "assigned_to"]
template_name = "ticketsystem/detail.html"
context_object_name = "ticket"
form_class = CommentForm
comment_form_class = CommentForm
def get_success_url(self):
return reverse("detail", kwargs={"pk": self.object.pk})
return reverse('detail-update', 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 dispatch(self, request, *args, **kwargs):
self.ticket = self.get_object()
user = request.user
# Prüfen, ob User bearbeiten darf
self.can_edit = (user == self.ticket.assigned_to) or user.is_superuser
return super().dispatch(request, *args, **kwargs)
def get_form(self, form_class=None):
form = super().get_form(form_class)
if not self.can_edit:
for field in form.fields:
form.fields[field].disabled = True # Felder lesbar, aber nicht änderbar
return form
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["form"] = self.get_form()
# Kommentarformular hinzufügen
if 'comment_form' not in context:
context['comment_form'] = self.comment_form_class()
return context
def form_valid(self, form):
ticket = form.instance
original = Ticket.objects.get(pk=ticket.pk)
response = super().form_valid(form) # Speichert das Ticket
# History tracking für geänderte Felder
tracked_fields = ["title", "description", "status", "priority", "assigned_to"]
for field in tracked_fields:
if field in form.changed_data:
old_value = getattr(original, field)
new_value = form.cleaned_data.get(field)
# Für ForeignKey Felder den Display-Namen verwenden
if field == "assigned_to":
old_value = old_value.username if old_value else "Niemand"
new_value = new_value.username if new_value else "Niemand"
elif field == "status":
old_value = original.get_status_display()
new_value = ticket.get_status_display()
elif field == "priority":
old_value = original.get_priority_display()
new_value = ticket.get_priority_display()
TicketHistory.objects.create(
ticket=ticket,
changed_by=self.request.user,
field=field,
old_value=str(old_value),
new_value=str(new_value),
)
if form.changed_data:
messages.success(self.request,
f"Ticket erfolgreich aktualisiert. Geänderte Felder: {', '.join(form.changed_data)}")
return response
def post(self, request, *args, **kwargs):
self.object = self.get_object() # Wichtig: object setzen für beide Fälle
if 'comment_submit' in request.POST:
# Kommentar absenden
comment_form = self.comment_form_class(request.POST)
if comment_form.is_valid():
comment = comment_form.save(commit=False)
comment.ticket = self.object
comment.author = request.user
comment.save()
messages.success(request, "Kommentar hinzugefügt.")
return redirect(self.get_success_url())
else:
# Kommentarformular fehlerhaft: Seite neu laden mit Fehlern
context = self.get_context_data(comment_form=comment_form)
return self.render_to_response(context)
else:
# Ticket bearbeiten (UpdateView standard)
if not self.can_edit:
messages.error(request, "⛔ Du darfst dieses Ticket nicht bearbeiten.")
return redirect(self.get_success_url())
return super().post(request, *args, **kwargs)
class AssignedTicketListView(LoginRequiredMixin, ListView):
model = Ticket