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

@@ -11,6 +11,6 @@ import os
from django.core.asgi import get_asgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'korrekturmanagementsystem.settings')
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "korrekturmanagementsystem.settings")
application = get_asgi_application()

View File

@@ -20,7 +20,7 @@ BASE_DIR = Path(__file__).resolve().parent.parent
# See https://docs.djangoproject.com/en/5.2/howto/deployment/checklist/
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'django-insecure-^20f=_*q+z6a3x_-7)10ku8e)1-k3!-4it1^@+7s0u3zpjcgn2'
SECRET_KEY = "django-insecure-^20f=_*q+z6a3x_-7)10ku8e)1-k3!-4it1^@+7s0u3zpjcgn2"
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
@@ -31,52 +31,52 @@ ALLOWED_HOSTS = []
# Application definition
INSTALLED_APPS = [
'ticketsystem.apps.TicketsystemConfig',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
"ticketsystem.apps.TicketsystemConfig",
"django.contrib.admin",
"django.contrib.auth",
"django.contrib.contenttypes",
"django.contrib.sessions",
"django.contrib.messages",
"django.contrib.staticfiles",
]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
"django.middleware.security.SecurityMiddleware",
"django.contrib.sessions.middleware.SessionMiddleware",
"django.middleware.common.CommonMiddleware",
"django.middleware.csrf.CsrfViewMiddleware",
"django.contrib.auth.middleware.AuthenticationMiddleware",
"django.contrib.messages.middleware.MessageMiddleware",
"django.middleware.clickjacking.XFrameOptionsMiddleware",
]
ROOT_URLCONF = 'korrekturmanagementsystem.urls'
ROOT_URLCONF = "korrekturmanagementsystem.urls"
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
"BACKEND": "django.template.backends.django.DjangoTemplates",
"DIRS": [],
"APP_DIRS": True,
"OPTIONS": {
"context_processors": [
"django.template.context_processors.request",
"django.contrib.auth.context_processors.auth",
"django.contrib.messages.context_processors.messages",
],
},
},
]
WSGI_APPLICATION = 'korrekturmanagementsystem.wsgi.application'
WSGI_APPLICATION = "korrekturmanagementsystem.wsgi.application"
# Database
# https://docs.djangoproject.com/en/5.2/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
"default": {
"ENGINE": "django.db.backends.sqlite3",
"NAME": BASE_DIR / "db.sqlite3",
}
}
@@ -86,16 +86,18 @@ DATABASES = {
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
"NAME": (
"django.contrib.auth.password_validation.UserAttributeSimilarityValidator"
),
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
"NAME": "django.contrib.auth.password_validation.MinimumLengthValidator",
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
"NAME": "django.contrib.auth.password_validation.CommonPasswordValidator",
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
"NAME": "django.contrib.auth.password_validation.NumericPasswordValidator",
},
]
@@ -103,9 +105,9 @@ AUTH_PASSWORD_VALIDATORS = [
# Internationalization
# https://docs.djangoproject.com/en/5.2/topics/i18n/
LANGUAGE_CODE = 'de-de'
LANGUAGE_CODE = "de-de"
TIME_ZONE = 'CET'
TIME_ZONE = "CET"
USE_I18N = True
@@ -115,9 +117,9 @@ USE_TZ = True
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/5.2/howto/static-files/
STATIC_URL = 'static/'
STATIC_URL = "static/"
# Default primary key field type
# https://docs.djangoproject.com/en/5.2/ref/settings/#default-auto-field
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField"

View File

@@ -14,6 +14,7 @@ Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import include, path

View File

@@ -11,6 +11,6 @@ import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'korrekturmanagementsystem.settings')
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "korrekturmanagementsystem.settings")
application = get_wsgi_application()

View File

@@ -6,7 +6,9 @@ import sys
def main():
"""Run administrative tasks."""
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'korrekturmanagementsystem.settings')
os.environ.setdefault(
"DJANGO_SETTINGS_MODULE", "korrekturmanagementsystem.settings"
)
try:
from django.core.management import execute_from_command_line
except ImportError as exc:
@@ -18,5 +20,5 @@ def main():
execute_from_command_line(sys.argv)
if __name__ == '__main__':
if __name__ == "__main__":
main()

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,6 +1,6 @@
{% 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;
background-color: {% if message.tags == 'error' %}#f8d7da
@@ -10,7 +10,7 @@
{{ message }}
</div>
{% endfor %}
</div>
</div>
{% endif %}
<style>
.ticket-container {
@@ -148,6 +148,6 @@
{% else %}
<p><em>Keine Änderungen bisher.</em></p>
{% endif %}
</div>
</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>
<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/

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})