diff --git a/ticketsystem/admin.py b/ticketsystem/admin.py index 649b0bd..f474898 100644 --- a/ticketsystem/admin.py +++ b/ticketsystem/admin.py @@ -1,5 +1,6 @@ from django.contrib import admin -from .models import Ticket +from .models import Ticket, Course admin.site.register(Ticket) +admin.site.register(Course) diff --git a/ticketsystem/models.py b/ticketsystem/models.py index 19e8d55..5dc3b52 100644 --- a/ticketsystem/models.py +++ b/ticketsystem/models.py @@ -2,6 +2,35 @@ 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"), @@ -20,8 +49,13 @@ class Ticket(models.Model): 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" + priority = models.CharField(max_length=10, choices=PRIORITY_CHOICES, default="medium") + + 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 diff --git a/ticketsystem/templates/ticketsystem/detail.html b/ticketsystem/templates/ticketsystem/detail.html index 8233fe7..cdedc6b 100644 --- a/ticketsystem/templates/ticketsystem/detail.html +++ b/ticketsystem/templates/ticketsystem/detail.html @@ -35,6 +35,17 @@ {% if not view.can_edit %}disabled{% endif %} class="w-full p-2 border border-gray-300 rounded shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 {% if not view.can_edit %}bg-gray-100{% endif %}">{{ ticket.description }} +
+ + +
diff --git a/ticketsystem/templates/ticketsystem/ticket_form.html b/ticketsystem/templates/ticketsystem/ticket_form.html index 956195c..7cdb205 100644 --- a/ticketsystem/templates/ticketsystem/ticket_form.html +++ b/ticketsystem/templates/ticketsystem/ticket_form.html @@ -1,127 +1,129 @@ {% extends "ticketsystem/base.html" %} {% block content %} - - -{% if messages %} -
- {% for message in messages %} -
- {{ message }} -
- {% endfor %} -
-{% endif %} - -
- -
-

➕ Neues Ticket erstellen

- -
- Fülle die Felder aus um ein neues Ticket zu erstellen + + {% if messages %} +
+ {% for message in messages %} +
+ {{ message }} +
+ {% endfor %}
- -
- {% csrf_token %} - - - {% if form.non_field_errors %} -
- {{ form.non_field_errors }} -
- {% endif %} - - -
- - - {% if form.title.errors %} -
{{ form.title.errors }}
+ {% endif %} +
+ +
+

➕ Neues Ticket erstellen

+
Fülle die Felder aus um ein neues Ticket zu erstellen
+ + {% csrf_token %} + + {% if form.non_field_errors %} +
{{ form.non_field_errors }}
{% endif %} -
- - -
- - - {% if form.description.errors %} -
{{ form.description.errors }}
- {% endif %} -
- - -
+
- - - - {% if form.status.errors %} -
{{ form.status.errors }}
+ + + {% if form.title.errors %}
{{ form.title.errors }}
{% endif %} +
+ +
+ + + {% if form.description.errors %} +
{{ form.description.errors }}
{% endif %}
- - - - - + + {% for course in form.course.field.queryset %} + + {% endfor %} - {% if form.priority.errors %} -
{{ form.priority.errors }}
- {% endif %} + {% if form.course.errors %}
{{ form.course.errors }}
{% endif %}
+ +
+
+ + + + {% if form.status.errors %}
{{ form.status.errors }}
{% endif %} +
+
+ + + {% if form.priority.errors %}
{{ form.priority.errors }}
{% endif %} +
+
+ +
+ + + {% if form.assigned_to.errors %}
{{ form.assigned_to.errors }}
{% endif %} +
+ +
+ + ❌ Abbrechen +
+ + +
+

💡 Tipps:

+
    +
  • + • Verwende einen aussagekräftigen Titel +
  • +
  • + • Beschreibe das Problem so detailliert wie möglich +
  • +
- - -
- - - {% if form.assigned_to.errors %} -
{{ form.assigned_to.errors }}
- {% endif %} -
- - -
- - - ❌ Abbrechen - -
- - - -
-

💡 Tipps:

-
    -
  • • Verwende einen aussagekräftigen Titel
  • -
  • • Beschreibe das Problem so detailliert wie möglich
  • -
-
- -{% endblock %} \ No newline at end of file +{% endblock %} diff --git a/ticketsystem/views.py b/ticketsystem/views.py index a1e2b33..66410ba 100644 --- a/ticketsystem/views.py +++ b/ticketsystem/views.py @@ -62,7 +62,7 @@ class TicketListView(ListView): class TicketDetailUpdateView(UpdateView): model = Ticket - fields = ["title", "description", "status", "priority", "assigned_to"] + fields = ["title", "description", "status", "priority", "assigned_to", "course"] template_name = "ticketsystem/detail.html" comment_form_class = CommentForm @@ -96,7 +96,7 @@ class TicketDetailUpdateView(UpdateView): response = super().form_valid(form) # Speichert das Ticket # History tracking für geänderte Felder - tracked_fields = ["title", "description", "status", "priority", "assigned_to"] + tracked_fields = ["title", "description", "status", "priority", "assigned_to", "course"] for field in tracked_fields: if field in form.changed_data: old_value = getattr(original, field) @@ -168,7 +168,7 @@ class AssignedTicketListView(LoginRequiredMixin, ListView): class TicketCreateView(CreateView): model = Ticket - fields = ["title", "description", "status", "priority", "assigned_to"] + fields = ["title", "description", "status", "priority", "assigned_to", "course"] template_name = "ticketsystem/ticket_form.html" def form_valid(self, form): @@ -182,7 +182,7 @@ class TicketCreateView(CreateView): class TicketUpdateView(LoginRequiredMixin, UpdateView): model = Ticket - fields = ["title", "description", "status", "priority", "assigned_to"] + fields = ["title", "description", "status", "priority", "assigned_to", "course"] template_name = "ticketsystem/ticket_form.html" def dispatch(self, request, *args, **kwargs):