Files
korrekturmanagementsystem/ticketsystem/models.py

136 lines
4.3 KiB
Python
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from django.db import models
from django.contrib.auth.models import User
class Course(models.Model):
"""Kurs-Model für Backend-Verwaltung"""
name = models.CharField(max_length=200, verbose_name="Kurs-Name")
code = models.CharField(max_length=50, unique=True, verbose_name="Kurs-Code") # z.B. "PROG-101"
description = models.TextField(blank=True, verbose_name="Beschreibung")
tutor = models.ForeignKey(
User,
on_delete=models.SET_NULL,
null=True,
blank=True,
verbose_name="Tutor",
related_name="courses_as_tutor"
)
is_active = models.BooleanField(default=True, verbose_name="Aktiv")
created_at = models.DateTimeField(auto_now_add=True)
class Meta:
ordering = ['name']
verbose_name = "Kurs"
verbose_name_plural = "Kurse"
def __str__(self):
if self.tutor:
return f"{self.code} - {self.name} (Tutor: {self.tutor.username})"
return f"{self.code} - {self.name}"
class Ticket(models.Model):
STATUS_CHOICES = [
("new", "Neu"),
("in_progress", "In Bearbeitung"),
("resolved", "Gelöst"),
("pending_close", "Wartend - Schließen"),
("closed", "Geschlossen"),
]
PRIORITY_CHOICES = [
("low", "Niedrig"),
("medium", "Mittel"),
("high", "Hoch"),
]
MATERIAL_CHOICES = [
("learning_sprint", "Learning Sprint"),
("ilse", "Intensive Live Session"),
("video", "Video"),
("exercise", "Übungsaufgabe"),
("solution", "Musterlösung"),
("slides", "Präsentationsfolien"),
("other", "Sonstiges"),
]
title = models.CharField(max_length=200)
description = models.TextField()
status = models.CharField(max_length=20, choices=STATUS_CHOICES, default="new")
priority = models.CharField(max_length=10, choices=PRIORITY_CHOICES, default="medium")
material = models.CharField(max_length=20, choices=MATERIAL_CHOICES, default="script")
answer = models.TextField(
blank=True,
null=True,
verbose_name="Antwort/Lösung",
help_text="Beschreibung der Lösung (erforderlich bei Status 'Gelöst')"
)
answered_at = models.DateTimeField(
blank=True,
null=True,
verbose_name="Beantwortet am"
)
course = models.ForeignKey(
Course,
on_delete=models.CASCADE,
verbose_name="Kurs",
related_name="tickets"
)
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.CASCADE,
)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return f"[{self.get_priority_display()}] {self.title} ({self.get_status_display()})"
class Comment(models.Model):
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)
def __str__(self):
return f"Kommentar von {self.author} zu Ticket #{self.ticket.id}"
class TicketHistory(models.Model):
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)
field = models.CharField(max_length=100) # z.B. "status" oder "description"
old_value = models.TextField(null=True, blank=True)
new_value = models.TextField(null=True, blank=True)
class Meta:
ordering = ["-changed_at"]
class FAQ(models.Model):
"""Einfaches FAQ Model"""
question = models.CharField(max_length=300, verbose_name="Frage")
answer = models.TextField(verbose_name="Antwort")
order = models.IntegerField(default=0, verbose_name="Reihenfolge")
is_active = models.BooleanField(default=True, verbose_name="Aktiv")
class Meta:
ordering = ['order', 'question']
verbose_name = "FAQ"
verbose_name_plural = "FAQs"
def __str__(self):
return self.question