feat: added assigned_tickets page

This commit is contained in:
2025-05-19 20:49:52 +02:00
parent 35d53842e1
commit 8df466c61f
5 changed files with 86 additions and 1 deletions

View File

@@ -1,6 +1,7 @@
from django.urls import reverse_lazy from django.urls import reverse_lazy
from django.http import HttpResponseRedirect from django.http import HttpResponseRedirect
class LoginRequiredMiddleware: class LoginRequiredMiddleware:
def __init__(self, get_response): def __init__(self, get_response):
self.get_response = get_response self.get_response = get_response

View File

@@ -0,0 +1,69 @@
{% extends "ticketsystem/base.html" %}
{% block content %}
<style>
.ticket-list-container {
max-width: 700px;
margin: 2rem auto;
padding: 2rem;
border: 1px solid #ddd;
border-radius: 8px;
background-color: #fafafa;
font-family: sans-serif;
}
.ticket-list-container h1 {
margin-bottom: 1.5rem;
font-size: 1.8rem;
color: #333;
}
.ticket-item {
padding: 1rem;
border-bottom: 1px solid #ccc;
}
.ticket-item:last-child {
border-bottom: none;
}
.ticket-item a {
text-decoration: none;
color: #007bff;
font-weight: bold;
}
.ticket-item a:hover {
text-decoration: underline;
}
.ticket-meta {
font-size: 0.9rem;
color: #666;
margin-top: 0.3rem;
}
</style>
<div class="ticket-list-container">
<h1>🧾 Meine zugewiesenen Tickets</h1>
<p style="color: #777; font-size: 0.9rem; margin-top: -0.5rem; margin-bottom: 1.5rem;">
Hinweis: Bereits geschlossene Tickets werden hier nicht aufgelistet.
</p>
{% for ticket in tickets %}
<div class="ticket-item">
<a href="{% url 'detail' ticket.pk %}">
#{{ ticket.id }} {{ ticket.title }}
</a>
<div class="ticket-meta">
Status: {{ ticket.get_status_display }} |
Priorität: {{ ticket.get_priority_display }} |
Angelegt am {{ ticket.created_at|date:"d.m.Y H:i" }}
</div>
</div>
{% empty %}
<p>Es sind derzeit keine Tickets vorhanden.</p>
{% endfor %}
</div>
{% endblock %}

View File

@@ -49,6 +49,7 @@
<div class="navbar-left"> <div class="navbar-left">
<a href="{% url 'home' %}">🏠 Start</a> <a href="{% url 'home' %}">🏠 Start</a>
<a href="{% url 'ticket-list' %}">📋 Tickets</a> <a href="{% url 'ticket-list' %}">📋 Tickets</a>
<a href="{% url 'assigned-tickets' %}">🧾 Meine Tickets</a>
</div> </div>
<div class="navbar-right"> <div class="navbar-right">
{% if user.is_authenticated %} {% if user.is_authenticated %}

View File

@@ -7,6 +7,7 @@ from .views import (
TicketUpdateView, TicketUpdateView,
HomeView, HomeView,
TicketDetailView, TicketDetailView,
AssignedTicketListView
) )
urlpatterns = [ urlpatterns = [
@@ -19,4 +20,5 @@ urlpatterns = [
# /ticketsystem/new/ # /ticketsystem/new/
path("new/", TicketCreateView.as_view(), name="create"), path("new/", TicketCreateView.as_view(), name="create"),
path("<int:pk>/modify/", TicketUpdateView.as_view(), name="modify"), path("<int:pk>/modify/", TicketUpdateView.as_view(), name="modify"),
path("meine-tickets/", AssignedTicketListView.as_view(), name="assigned-tickets"),
] ]

View File

@@ -63,6 +63,18 @@ class TicketDetailView(FormMixin, DetailView):
return context return context
class AssignedTicketListView(LoginRequiredMixin, ListView):
model = Ticket
template_name = "ticketsystem/assigned_tickets.html"
context_object_name = "tickets"
ordering = ["-created_at"]
def get_queryset(self):
return Ticket.objects.filter(
assigned_to=self.request.user
).exclude(status="closed") # oder "geschlossen", je nach Wahl
class TicketCreateView(CreateView): class TicketCreateView(CreateView):
model = Ticket model = Ticket
fields = [ fields = [
@@ -90,7 +102,7 @@ class TicketUpdateView(LoginRequiredMixin, UpdateView):
def dispatch(self, request, *args, **kwargs): def dispatch(self, request, *args, **kwargs):
ticket = self.get_object() ticket = self.get_object()
user = request.user user = request.user
if user != ticket.assigned_to: if user != ticket.assigned_to and not user.is_staff:
messages.error(request, "⛔ Du darfst dieses Ticket nicht bearbeiten.") messages.error(request, "⛔ Du darfst dieses Ticket nicht bearbeiten.")
return redirect("detail", pk=ticket.pk) return redirect("detail", pk=ticket.pk)
return super().dispatch(request, *args, **kwargs) return super().dispatch(request, *args, **kwargs)