feat: replaced TicketDetailView with TicketDetailUpdateView
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user