đź’¬ Kommentare
{% if ticket.comments.exists %}
- {% for comment in ticket.comments.all %}
-
- {% endfor %}
+ {% for comment in ticket.comments.all %}
+
+ {% endfor %}
{% else %}
-
Keine Kommentare vorhanden.
+
+ Keine Kommentare vorhanden.
+
{% endif %}
+
{% if user.is_authenticated %}
-
📝 Neuen Kommentar schreiben
-
- {% endif %}
-
-
đź•“ Bearbeitungshistorie
- {% if ticket.history.exists %}
-
- {% for entry in ticket.history.all %}
- -
- {{ entry.changed_by.username }}
- hat
{{ entry.field }} geändert:
- {{ entry.old_value }} → {{ entry.new_value }}
- am {{ entry.changed_at|date:"d.m.Y H:i" }}
-
- {% endfor %}
-
- {% else %}
-
Keine Änderungen bisher.
- {% endif %}
+
+ {% endif %}
+
+
+
+
đź•“ Bearbeitungshistorie
+
+ {% if ticket.history.exists %}
+ {% for entry in ticket.history.all %}
+
+
{{ entry.changed_by.username }}
+
+ hat {{ entry.field }} geändert:
+
+
+ {{ entry.old_value }} → {{ entry.new_value }}
+
+
am {{ entry.changed_at|date:"d.m.Y H:i" }}
+
+ {% endfor %}
+ {% else %}
+
+ Keine Änderungen bisher.
+
+ {% endif %}
+
+
{% endblock %}
\ No newline at end of file
diff --git a/ticketsystem/urls.py b/ticketsystem/urls.py
index d9669d3..9a3f3a0 100644
--- a/ticketsystem/urls.py
+++ b/ticketsystem/urls.py
@@ -6,8 +6,8 @@ from .views import (
TicketCreateView,
TicketUpdateView,
HomeView,
- TicketDetailView,
- AssignedTicketListView
+ AssignedTicketListView,
+ TicketDetailUpdateView
)
urlpatterns = [
@@ -16,7 +16,7 @@ urlpatterns = [
# /ticketsystem/tickets
path("tickets", TicketListView.as_view(), name="ticket-list"),
# /ticketsystem/detail/
- path("
/", TicketDetailView.as_view(), name="detail"),
+ path('/', TicketDetailUpdateView.as_view(), name='detail'),
# /ticketsystem/new/
path("new/", TicketCreateView.as_view(), name="create"),
path("/modify/", TicketUpdateView.as_view(), name="modify"),
diff --git a/ticketsystem/views.py b/ticketsystem/views.py
index be05dfd..fe83c40 100644
--- a/ticketsystem/views.py
+++ b/ticketsystem/views.py
@@ -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
{{ comment.author.username }} am {{ comment.created_at|date:"d.m.Y H:i" }}
-{{ comment.text }}
-