fix: code reformatted
This commit is contained in:
@@ -2,4 +2,4 @@ from django.contrib import admin
|
||||
|
||||
from .models import Ticket
|
||||
|
||||
admin.site.register(Ticket)
|
||||
admin.site.register(Ticket)
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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..."}
|
||||
),
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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 %}
|
||||
@@ -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 %}
|
||||
@@ -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"),
|
||||
]
|
||||
]
|
||||
|
||||
@@ -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})
|
||||
|
||||
Reference in New Issue
Block a user