diff --git a/ticketsystem/templates/ticketsystem/detail.html b/ticketsystem/templates/ticketsystem/detail.html index 57c4f18..adaeacb 100644 --- a/ticketsystem/templates/ticketsystem/detail.html +++ b/ticketsystem/templates/ticketsystem/detail.html @@ -1,7 +1,7 @@ {% extends "ticketsystem/base.html" %} {% block content %} {% if messages %} -
+
{% for message in messages %}

🎫 Ticket #{{ ticket.id }} – {{ ticket.title }}

-

- ✏️ Dieses Ticket - bearbeiten -

+
+ {% csrf_token %} + {{ form.non_field_errors }} -
- Status: {{ ticket.get_status_display }} -
+
+ + {{ form.title }} +
-
- Priorität: {{ ticket.get_priority_display }} -
+
+ + {{ form.description }} +
-
- Beschreibung:
-
{{ ticket.description }}
-
+
+ + {{ form.status }} +
-
- Erstellt von: {{ ticket.created_by.username }} -
+
+ + {{ form.priority }} +
-
- Zugewiesen an: - {% if ticket.assigned_to %} - {{ ticket.assigned_to.username }} +
+ + {{ form.assigned_to }} +
+ + {% if view.can_edit %} + {% else %} - Niemand zugewiesen +

Du darfst dieses Ticket nicht bearbeiten.

{% endif %} -
+
đź•’ Erstellt am: {{ ticket.created_at|date:"d.m.Y H:i" }}
@@ -112,43 +242,59 @@
-
+ +

đź’¬ Kommentare

{% if ticket.comments.exists %} - {% for comment in ticket.comments.all %} -
-

{{ comment.author.username }} am {{ comment.created_at|date:"d.m.Y H:i" }}

-

{{ comment.text }}

-
- {% endfor %} + {% for comment in ticket.comments.all %} +
+
+ {{ comment.author.username }} am {{ comment.created_at|date:"d.m.Y H:i" }} +
+
{{ comment.text }}
+
+ {% endfor %} {% else %} -

Keine Kommentare vorhanden.

+
+ Keine Kommentare vorhanden. +
{% endif %} + {% if user.is_authenticated %} -

📝 Neuen Kommentar schreiben

-
- {% csrf_token %} - {{ form.as_p }} - -
- {% 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 %} +
+

📝 Neuen Kommentar schreiben

+
+ {% csrf_token %} + {{ comment_form.as_p }} + +
+ {% 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