fix: code reformatted

This commit is contained in:
2025-05-05 18:59:00 +02:00
parent afa44011d0
commit 07ea49a035
13 changed files with 139 additions and 93 deletions

View File

@@ -2,4 +2,4 @@ from django.contrib import admin
from .models import Ticket
admin.site.register(Ticket)
admin.site.register(Ticket)

View File

@@ -2,5 +2,5 @@ from django.apps import AppConfig
class TicketsystemConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'ticketsystem'
default_auto_field = "django.db.models.BigAutoField"
name = "ticketsystem"

View File

@@ -7,5 +7,7 @@ class CommentForm(forms.ModelForm):
model = Comment
fields = ["text"]
widgets = {
"text": forms.Textarea(attrs={"rows": 3, "placeholder": "Kommentar schreiben..."}),
"text": forms.Textarea(
attrs={"rows": 3, "placeholder": "Kommentar schreiben..."}
),
}

View File

@@ -4,23 +4,33 @@ from django.contrib.auth.models import User
class Ticket(models.Model):
STATUS_CHOICES = [
('open', 'Offen'),
('in_progress', 'In Bearbeitung'),
('closed', 'Geschlossen'),
("open", "Offen"),
("in_progress", "In Bearbeitung"),
("closed", "Geschlossen"),
]
PRIORITY_CHOICES = [
('low', 'Niedrig'),
('medium', 'Mittel'),
('high', 'Hoch'),
("low", "Niedrig"),
("medium", "Mittel"),
("high", "Hoch"),
]
title = models.CharField(max_length=200)
description = models.TextField()
status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='open')
priority = models.CharField(max_length=10, choices=PRIORITY_CHOICES, default='medium')
created_by = models.ForeignKey(User, related_name='tickets_created', on_delete=models.CASCADE)
assigned_to = models.ForeignKey(User, related_name='tickets_assigned', null=True, blank=True, on_delete=models.SET_NULL)
status = models.CharField(max_length=20, choices=STATUS_CHOICES, default="open")
priority = models.CharField(
max_length=10, choices=PRIORITY_CHOICES, default="medium"
)
created_by = models.ForeignKey(
User, related_name="tickets_created", on_delete=models.CASCADE
)
assigned_to = models.ForeignKey(
User,
related_name="tickets_assigned",
null=True,
blank=True,
on_delete=models.SET_NULL,
)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
@@ -29,7 +39,9 @@ class Ticket(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)
text = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
@@ -39,7 +51,9 @@ class Comment(models.Model):
class TicketHistory(models.Model):
ticket = models.ForeignKey("Ticket", on_delete=models.CASCADE, related_name="history")
ticket = models.ForeignKey(
"Ticket", on_delete=models.CASCADE, related_name="history"
)
changed_by = models.ForeignKey(User, on_delete=models.SET_NULL, null=True)
changed_at = models.DateTimeField(auto_now_add=True)

View File

@@ -1,16 +1,16 @@
{% block content %}
{% if messages %}
<div style="max-width: 600px; margin: 1rem auto;">
<div style="max-width: 600px; margin: 1rem auto;">
{% for message in messages %}
<div style="padding: 1rem; border-radius: 5px; margin-bottom: 1rem;
<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>
</div>
{% endfor %}
</div>
</div>
{% endif %}
<style>
.ticket-container {
@@ -133,21 +133,21 @@
</form>
{% endif %}
<div style="margin-top: 3rem;">
<h2>🕓 Bearbeitungshistorie</h2>
{% if ticket.history.exists %}
<ul style="list-style: none; padding: 0;">
{% for entry in ticket.history.all %}
<li style="margin-bottom: 1rem; background-color: #f9f9f9; border-left: 4px solid #ccc; padding: 0.5rem 1rem;">
<strong>{{ entry.changed_by.username }}</strong>
hat <code>{{ entry.field }}</code> geändert:<br>
<em>{{ entry.old_value }}</em><strong>{{ entry.new_value }}</strong><br>
<small>am {{ entry.changed_at|date:"d.m.Y H:i" }}</small>
</li>
{% endfor %}
</ul>
{% else %}
<p><em>Keine Änderungen bisher.</em></p>
{% endif %}
</div>
<h2>🕓 Bearbeitungshistorie</h2>
{% if ticket.history.exists %}
<ul style="list-style: none; padding: 0;">
{% for entry in ticket.history.all %}
<li style="margin-bottom: 1rem; background-color: #f9f9f9; border-left: 4px solid #ccc; padding: 0.5rem 1rem;">
<strong>{{ entry.changed_by.username }}</strong>
hat <code>{{ entry.field }}</code> geändert:<br>
<em>{{ entry.old_value }}</em><strong>{{ entry.new_value }}</strong><br>
<small>am {{ entry.changed_at|date:"d.m.Y H:i" }}</small>
</li>
{% endfor %}
</ul>
{% else %}
<p><em>Keine Änderungen bisher.</em></p>
{% endif %}
</div>
</div>
{% endblock %}

View File

@@ -1,5 +1,5 @@
{% block content %}
<style>
<style>
.form-container {
max-width: 600px;
margin: 2rem auto;
@@ -44,14 +44,26 @@
.form-container button:hover {
background-color: #0056b3;
}
</style>
</style>
<div class="form-container">
<h1>🎫 Neues Ticket erstellen</h1>
<div class="form-container">
<h1>
{% if object.pk %}
✏️ Ticket bearbeiten
{% else %}
🎫 Neues Ticket erstellen
{% endif %}
</h1>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Erstellen</button>
{% csrf_token %}
{{ form.as_p }}
<button type="submit">
{% if object.pk %}
Speichern
{% else %}
Erstellen
{% endif %}
</button>
</form>
</div>
</div>
{% endblock %}

View File

@@ -1,7 +1,13 @@
from django.urls import path
from . import views
from .views import TicketListView, TicketCreateView, TicketUpdateView, HomeView, TicketDetailView
from .views import (
TicketListView,
TicketCreateView,
TicketUpdateView,
HomeView,
TicketDetailView,
)
urlpatterns = [
# /ticketsystem/
@@ -13,4 +19,4 @@ urlpatterns = [
# /ticketsystem/new/
path("new/", TicketCreateView.as_view(), name="create"),
path("<int:pk>/modify/", TicketUpdateView.as_view(), name="modify"),
]
]

View File

@@ -5,7 +5,6 @@ from django.views.generic.detail import DetailView
from django.views.generic.edit import FormMixin
from .forms import CommentForm
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
@@ -66,12 +65,19 @@ class TicketDetailView(FormMixin, DetailView):
class TicketCreateView(CreateView):
model = Ticket
fields = ["title", "description", "priority", "assigned_to"] # user & status wird automatisch gesetzt
fields = [
"title",
"description",
"priority",
"assigned_to",
] # user & status wird automatisch gesetzt
template_name = "ticketsystem/ticket_form.html"
success_url = reverse_lazy("ticket-list")
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"
return super().form_valid(form)
@@ -80,7 +86,6 @@ class TicketUpdateView(LoginRequiredMixin, UpdateView):
model = Ticket
fields = ["title", "description", "status", "priority", "assigned_to"]
template_name = "ticketsystem/ticket_form.html"
success_url = reverse_lazy("ticket-list")
def dispatch(self, request, *args, **kwargs):
ticket = self.get_object()
@@ -99,7 +104,7 @@ class TicketUpdateView(LoginRequiredMixin, UpdateView):
response = super().form_valid(form) # Speichert das Ticket
tracked_fields = ["status", "description"]
tracked_fields = ["status", "description", "priority"]
for field in tracked_fields:
if field in form.changed_data:
old_value = getattr(original, field)
@@ -111,5 +116,7 @@ class TicketUpdateView(LoginRequiredMixin, UpdateView):
old_value=str(old_value),
new_value=str(new_value),
)
return response
def get_success_url(self):
return reverse_lazy("detail", kwargs={"pk": self.object.pk})