feat: replaced priority with mistake

This commit is contained in:
2025-06-03 00:21:33 +02:00
parent 985b8cc88c
commit 6dd1a7e1c3
6 changed files with 39 additions and 42 deletions

View File

@@ -38,7 +38,7 @@ class TicketForm(forms.ModelForm):
class Meta:
model = Ticket
fields = ["title", "description", "status", "priority", "course", "answer", "material"]
fields = ["title", "description", "status", "mistake", "course", "answer", "material"]
widgets = {
'answer': forms.Textarea(attrs={
'rows': 4,
@@ -68,14 +68,17 @@ class TicketForm(forms.ModelForm):
def _set_field_permissions(self, is_tutor, is_creator, is_superuser):
"""Setzt welche Felder bearbeitet werden dürfen"""
if is_tutor and not is_superuser:
if self.ticket.status == 'resolved' and is_creator and not is_superuser:
for field_name in self.fields:
if field_name == "answer":
self.fields[field_name].disabled = True
elif is_tutor and not is_superuser:
# Tutor darf ändern:
readonly_fields = ['title', 'description', 'material']
for field_name in readonly_fields:
if field_name in self.fields:
self.fields[field_name].disabled = True
elif is_creator and not is_superuser and self.ticket.status != 'resolved':
# Creator darf ändern bei resolved
for field_name in self.fields:
self.fields[field_name].disabled = True

View File

@@ -39,10 +39,14 @@ class Ticket(models.Model):
("closed", "Geschlossen"),
]
PRIORITY_CHOICES = [
("low", "Niedrig"),
("medium", "Mittel"),
("high", "Hoch"),
MISTAKE_CHOICES = [
("typo", "Tippfehler"),
("formatting_issue", "Formatierungsfehler"),
("missing_content", "Fehlender Inhalt"),
("outdated_content", "Veralteter Inhalt"),
("audio_problem", "Audio-Problem"),
("video_problem", "Video-Problem"),
("other", "Sonstiges"),
]
MATERIAL_CHOICES = [
@@ -58,7 +62,7 @@ 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")
mistake = models.CharField(max_length=20, choices=MISTAKE_CHOICES, default="medium")
material = models.CharField(max_length=20, choices=MATERIAL_CHOICES, default="script")
answer = models.TextField(
@@ -89,7 +93,7 @@ class Ticket(models.Model):
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return f"[{self.get_priority_display()}] {self.title} ({self.get_status_display()})"
return f"[{self.get_mistake_display()}] {self.title} ({self.get_status_display()})"
class Comment(models.Model):

View File

@@ -76,13 +76,13 @@
</div>
<div>
<label class="block text-sm font-medium mb-1">Priorität:</label>
<select name="priority"
{% if not view.can_edit or form.priority.field.disabled %}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 or form.priority.field.disabled %}bg-gray-100{% endif %}">
<option value="low" {% if ticket.priority == 'low' %}selected{% endif %}>Niedrig</option>
<option value="medium"
{% if ticket.priority == 'medium' %}selected{% endif %}>Normal</option>
<option value="high" {% if ticket.priority == 'high' %}selected{% endif %}>Hoch</option>
<select name="mistake"
{% if not view.can_edit or form.mistake.field.disabled %}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 or form.mistake.field.disabled %}bg-gray-100{% endif %}">
{% for value, label in form.mistake.field.choices %}
<option value="{{ value }}"
{% if value == ticket.mistake %}selected{% endif %}>{{ label }}</option>
{% endfor %}
</select>
</div>
</div>
@@ -124,7 +124,9 @@
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 placeholder:text-black {% if not view.can_edit or ticket.status != 'resolved' %}bg-gray-100 cursor-not-allowed{% endif %}">{{ ticket.answer|default:'' }}</textarea>
{% if form.answer.errors %}<div class="text-red-600 text-sm mt-1">{{ form.answer.errors }}</div>{% endif %}
<p class="text-xs text-gray-500 mt-1">
{% if ticket.status != 'resolved' or ticket.status != 'closed' %}Eine Antwort ist erforderlich beim Setzen des Status auf "Gelöst"{% endif %}
{% if ticket.status != 'resolved' or ticket.status != 'closed' %}
Eine Antwort ist erforderlich beim Setzen des Status auf "Gelöst"
{% endif %}
</p>
{% endif %}
</div>

View File

@@ -132,7 +132,7 @@
<th class="px-4 py-3 text-center text-sm font-bold">#</th>
<th class="px-4 py-3 text-left text-sm font-bold">Titel</th>
<th class="px-4 py-3 text-center text-sm font-bold">Status</th>
<th class="px-4 py-3 text-center text-sm font-bold">Priorität</th>
<th class="px-4 py-3 text-center text-sm font-bold">Fehlerart</th>
<th class="px-4 py-3 text-left text-sm font-bold">Zugewiesen an</th>
<th class="px-4 py-3 text-center text-sm font-bold">Erstellt</th>
</tr>
@@ -163,19 +163,7 @@
{% endif %}
</td>
<td class="px-4 py-3 text-center">
{% if ticket.priority == 'low' %}
<span class="px-2 py-1 rounded-full text-xs font-bold bg-blue-500 text-white">{{ ticket.get_priority_display }}</span>
{% elif ticket.priority == 'medium' %}
<span class="px-2 py-1 rounded-full text-xs font-bold bg-yellow-400 text-gray-900">
{{ ticket.get_priority_display }}
</span>
{% elif ticket.priority == 'high' %}
<span class="px-2 py-1 rounded-full text-xs font-bold bg-orange-500 text-white">
{{ ticket.get_priority_display }}
</span>
{% elif ticket.priority == 'urgent' %}
<span class="px-2 py-1 rounded-full text-xs font-bold bg-red-500 text-white">{{ ticket.get_priority_display }}</span>
{% endif %}
<span class="px-2 py-1 rounded-full text-xs font-bold bg-blue-500 text-white">{{ ticket.get_mistake_display }}</span>
</td>
<td class="px-4 py-3 text-sm text-gray-600">
{% if ticket.assigned_to %}

View File

@@ -93,15 +93,15 @@
{% if form.status.errors %}<div class="text-red-600 text-sm mt-1">{{ form.status.errors }}</div>{% endif %}
</div>
<div>
<label class="block text-sm font-medium mb-1">Priorität:</label>
<select name="priority"
<label class="block text-sm font-medium mb-1">Fehlerart:</label>
<select name="mistake"
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">
{% for value, display in form.fields.priority.choices %}
{% for value, display in form.fields.mistake.choices %}
<option value="{{ value }}"
{% if form.priority.value == value %}selected{% endif %}>{{ display }}</option>
{% if form.mistake.value == value %}selected{% endif %}>{{ display }}</option>
{% endfor %}
</select>
{% if form.priority.errors %}<div class="text-red-600 text-sm mt-1">{{ form.priority.errors }}</div>{% endif %}
{% if form.mistake.errors %}<div class="text-red-600 text-sm mt-1">{{ form.mistake.errors }}</div>{% endif %}
</div>
</div>
<!-- Zugewiesen an -->

View File

@@ -128,7 +128,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", "course", "answer", "material"]
tracked_fields = ["title", "description", "status", "mistake", "course", "answer", "material"]
for field in tracked_fields:
if field in form.changed_data:
old_value = getattr(original, field)
@@ -138,9 +138,9 @@ class TicketDetailUpdateView(UpdateView):
if field == "status":
old_value = original.get_status_display()
new_value = ticket.get_status_display()
elif field == "priority":
old_value = original.get_priority_display()
new_value = ticket.get_priority_display()
elif field == "mistake":
old_value = original.get_mistake_display()
new_value = ticket.get_mistake_display()
elif field == "course":
old_value = str(old_value)
new_value = str(new_value)
@@ -239,7 +239,7 @@ class TicketCreateView(CreateView):
class TicketUpdateView(LoginRequiredMixin, UpdateView):
model = Ticket
fields = ["title", "description", "status", "priority", "assigned_to", "course"]
fields = ["title", "description", "status", "mistake", "assigned_to", "course"]
template_name = "ticketsystem/ticket_form.html"
def dispatch(self, request, *args, **kwargs):
@@ -259,7 +259,7 @@ class TicketUpdateView(LoginRequiredMixin, UpdateView):
response = super().form_valid(form) # Speichert das Ticket
tracked_fields = ["status", "description", "priority"]
tracked_fields = ["status", "description", "mistake"]
for field in tracked_fields:
if field in form.changed_data:
old_value = getattr(original, field)