feat: restricted ticket modifications to specific users

This commit is contained in:
2025-05-05 18:10:49 +02:00
parent 15f980d0b5
commit b8daab5b54
3 changed files with 32 additions and 7 deletions

View File

@@ -27,6 +27,7 @@ class Ticket(models.Model):
def __str__(self): def __str__(self):
return f"[{self.get_priority_display()}] {self.title} ({self.get_status_display()})" return f"[{self.get_priority_display()}] {self.title} ({self.get_status_display()})"
class Comment(models.Model): class Comment(models.Model):
ticket = models.ForeignKey("Ticket", on_delete=models.CASCADE, related_name="comments") ticket = models.ForeignKey("Ticket", on_delete=models.CASCADE, related_name="comments")
author = models.ForeignKey(User, on_delete=models.CASCADE) author = models.ForeignKey(User, on_delete=models.CASCADE)

View File

@@ -1,4 +1,17 @@
{% block content %} {% block content %}
{% if messages %}
<div style="max-width: 600px; margin: 1rem auto;">
{% for message in messages %}
<div style="padding: 1rem; border-radius: 5px; margin-bottom: 1rem;
background-color: {% if message.tags == 'error' %}#f8d7da
{% elif message.tags == 'success' %}#d4edda
{% else %}#fff3cd{% endif %};
color: #333;">
{{ message }}
</div>
{% endfor %}
</div>
{% endif %}
<style> <style>
.ticket-container { .ticket-container {
max-width: 700px; max-width: 700px;

View File

@@ -1,4 +1,3 @@
from django.shortcuts import get_object_or_404, render
from django.views.generic import ListView, TemplateView from django.views.generic import ListView, TemplateView
from django.views.generic.edit import CreateView, UpdateView from django.views.generic.edit import CreateView, UpdateView
from django.urls import reverse_lazy from django.urls import reverse_lazy
@@ -6,6 +5,10 @@ from django.views.generic.detail import DetailView
from django.views.generic.edit import FormMixin from django.views.generic.edit import FormMixin
from .forms import CommentForm from .forms import CommentForm
from django.urls import reverse from django.urls import reverse
from django.http import HttpResponseForbidden
from django.contrib.auth.mixins import LoginRequiredMixin
from django.contrib import messages
from django.shortcuts import redirect
from .models import Ticket from .models import Ticket
@@ -36,7 +39,7 @@ class TicketListView(ListView):
class TicketDetailView(FormMixin, DetailView): class TicketDetailView(FormMixin, DetailView):
model = Ticket # <- das ist wichtig! model = Ticket
template_name = "ticketsystem/detail.html" template_name = "ticketsystem/detail.html"
context_object_name = "ticket" context_object_name = "ticket"
form_class = CommentForm form_class = CommentForm
@@ -62,20 +65,28 @@ class TicketDetailView(FormMixin, DetailView):
class TicketCreateView(CreateView): class TicketCreateView(CreateView):
model = Ticket model = Ticket
fields = ["title", "description", "priority", "assigned_to"] # user & status setzen wir automatisch fields = ["title", "description", "priority", "assigned_to"] # user & status wird automatisch gesetzt
template_name = "ticketsystem/ticket_form.html" template_name = "ticketsystem/ticket_form.html"
success_url = reverse_lazy("index") success_url = reverse_lazy("ticket-list")
def form_valid(self, form): def form_valid(self, form):
form.instance.created_by = self.request.user # Der angemeldete User wird automatisch gesetzt form.instance.created_by = self.request.user # Der angemeldete User wird automatisch gesetzt
form.instance.status = "open" # Neues Ticket beginnt immer als "offen" form.instance.status = "open" # Neues Ticket beginnt immer als "offen"
return super().form_valid(form) return super().form_valid(form)
class TicketUpdateView(UpdateView): class TicketUpdateView(LoginRequiredMixin, UpdateView):
model = Ticket model = Ticket
fields = ["title", "description", "status", "priority", "assigned_to"] fields = ["title", "description", "status", "priority", "assigned_to"]
template_name = "ticketsystem/ticket_form.html" # kannst das gleiche Template wie beim Erstellen verwenden template_name = "ticketsystem/ticket_form.html"
success_url = reverse_lazy("index") # oder zurück zur Detailseite success_url = reverse_lazy("ticket-list")
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): def get_queryset(self):
return Ticket.objects.all() # Optional: Nur eigene Tickets bearbeiten lassen? return Ticket.objects.all() # Optional: Nur eigene Tickets bearbeiten lassen?