feat: added assigned_tickets page
This commit is contained in:
@@ -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
|
||||||
|
|||||||
69
ticketsystem/templates/ticketsystem/assigned_tickets.html
Normal file
69
ticketsystem/templates/ticketsystem/assigned_tickets.html
Normal 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 %}
|
||||||
@@ -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 %}
|
||||||
|
|||||||
@@ -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"),
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user