feat: added new Course class to model

This commit is contained in:
2025-05-29 16:12:38 +02:00
parent 4a28f18e94
commit 5688d96e4f
5 changed files with 168 additions and 120 deletions

View File

@@ -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 }}</textarea>
</div>
<div>
<label class="block text-sm font-medium mb-1">Kurs:</label>
<select name="course"
{% 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 %}">
{% for course in form.course.field.queryset %}
<option value="{{ course.pk }}"
{% if course.pk == ticket.course.pk %}selected{% endif %}>{{ course }}</option>
{% endfor %}
</select>
</div>
<div class="grid grid-cols-2 gap-4">
<div>
<label class="block text-sm font-medium mb-1">Status:</label>

View File

@@ -1,127 +1,129 @@
{% extends "ticketsystem/base.html" %}
{% block content %}
<!-- Messages -->
{% if messages %}
<div class="max-w-4xl mx-auto px-4 pt-4">
{% for message in messages %}
<div class="mb-4 p-3 rounded {% if message.tags == 'error' %}bg-red-100 text-red-700{% elif message.tags == 'success' %}bg-green-100 text-green-700{% else %}bg-yellow-100 text-yellow-700{% endif %}">
{{ message }}
</div>
{% endfor %}
</div>
{% endif %}
<div class="max-w-4xl mx-auto px-4 py-6">
<!-- Ticket Erstellen -->
<div class="bg-white rounded-lg shadow p-6">
<h1 class="text-3xl font-bold mb-4"> Neues Ticket erstellen</h1>
<div class="text-sm text-gray-500 mb-6">
Fülle die Felder aus um ein neues Ticket zu erstellen
<!-- Messages -->
{% if messages %}
<div class="max-w-4xl mx-auto px-4 pt-4">
{% for message in messages %}
<div class="mb-4 p-3 rounded {% if message.tags == 'error' %}bg-red-100 text-red-700{% elif message.tags == 'success' %}bg-green-100 text-green-700{% else %}bg-yellow-100 text-yellow-700{% endif %}">
{{ message }}
</div>
{% endfor %}
</div>
<form method="post" class="space-y-4">
{% csrf_token %}
<!-- Form Errors -->
{% if form.non_field_errors %}
<div class="bg-red-100 border border-red-200 rounded p-3">
{{ form.non_field_errors }}
</div>
{% endif %}
<!-- Titel -->
<div>
<label class="block text-sm font-medium mb-1">Titel: *</label>
<input type="text" name="title" value="{{ form.title.value|default:'' }}"
required
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="Kurze Beschreibung des Problems">
{% if form.title.errors %}
<div class="text-red-600 text-sm mt-1">{{ form.title.errors }}</div>
{% endif %}
<div class="max-w-4xl mx-auto px-4 py-6">
<!-- Ticket Erstellen -->
<div class="bg-white rounded-lg shadow p-6">
<h1 class="text-3xl font-bold mb-4"> Neues Ticket erstellen</h1>
<div class="text-sm text-gray-500 mb-6">Fülle die Felder aus um ein neues Ticket zu erstellen</div>
<form method="post" class="space-y-4">
{% csrf_token %}
<!-- Form Errors -->
{% if form.non_field_errors %}
<div class="bg-red-100 border border-red-200 rounded p-3">{{ form.non_field_errors }}</div>
{% endif %}
</div>
<!-- Beschreibung -->
<div>
<label class="block text-sm font-medium mb-1">Beschreibung: *</label>
<textarea name="description" rows="6"
required
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="Detaillierte Beschreibung des Problems oder der Anfrage">{{ form.description.value|default:'' }}</textarea>
{% if form.description.errors %}
<div class="text-red-600 text-sm mt-1">{{ form.description.errors }}</div>
{% endif %}
</div>
<!-- Status und Priorität -->
<div class="grid grid-cols-2 gap-4">
<!-- Titel -->
<div>
<label class="block text-sm font-medium mb-1">Status:</label>
<select name="status"
disabled
class="w-full p-2 border border-gray-300 bg-gray-300 rounded shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500">
<option value="new" {% if form.status.value == 'new' or not form.status.value %}selected{% endif %}>Neu</option>
</select>
<input type="hidden" name="status" value="new">
{% if form.status.errors %}
<div class="text-red-600 text-sm mt-1">{{ form.status.errors }}</div>
<label class="block text-sm font-medium mb-1">Titel: *</label>
<input type="text"
name="title"
value="{{ form.title.value|default:'' }}"
required
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="Kurze Beschreibung des Problems">
{% if form.title.errors %}<div class="text-red-600 text-sm mt-1">{{ form.title.errors }}</div>{% endif %}
</div>
<!-- Beschreibung -->
<div>
<label class="block text-sm font-medium mb-1">Beschreibung: *</label>
<textarea name="description"
rows="6"
required
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="Detaillierte Beschreibung des Problems oder der Anfrage">{{ form.description.value|default:'' }}</textarea>
{% if form.description.errors %}
<div class="text-red-600 text-sm mt-1">{{ form.description.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">Kurs: *</label>
<select name="course"
required
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">
<option value="low" {% if form.priority.value == 'low' %}selected{% endif %}>Niedrig</option>
<option value="medium" {% if form.priority.value == 'medium' or not form.priority.value %}selected{% endif %}>Normal</option>
<option value="high" {% if form.priority.value == 'high' %}selected{% endif %}>Hoch</option>
<option value="">Kurs auswählen...</option>
{% for course in form.course.field.queryset %}
<option value="{{ course.pk }}"
{% if form.course.value == course.pk %}selected{% endif %}>{{ course }}</option>
{% endfor %}
</select>
{% if form.priority.errors %}
<div class="text-red-600 text-sm mt-1">{{ form.priority.errors }}</div>
{% endif %}
{% if form.course.errors %}<div class="text-red-600 text-sm mt-1">{{ form.course.errors }}</div>{% endif %}
</div>
<!-- Status und Priorität -->
<div class="grid grid-cols-2 gap-4">
<div>
<label class="block text-sm font-medium mb-1">Status:</label>
<select name="status"
disabled
class="w-full p-2 border border-gray-300 bg-gray-300 rounded shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500">
<option value="new"
{% if form.status.value == 'new' or not form.status.value %}selected{% endif %}>
Neu
</option>
</select>
<input type="hidden" name="status" value="new">
{% 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"
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">
<option value="low" {% if form.priority.value == 'low' %}selected{% endif %}>Niedrig</option>
<option value="medium"
{% if form.priority.value == 'medium' or not form.priority.value %}selected{% endif %}>
Normal
</option>
<option value="high"
{% if form.priority.value == 'high' %}selected{% endif %}>Hoch</option>
</select>
{% if form.priority.errors %}<div class="text-red-600 text-sm mt-1">{{ form.priority.errors }}</div>{% endif %}
</div>
</div>
<!-- Zugewiesen an -->
<div>
<label class="block text-sm font-medium mb-1">Zugewiesen an:</label>
<select name="assigned_to"
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">
<option value="">Nicht zugewiesen</option>
{% for user in form.assigned_to.field.queryset %}
<option value="{{ user.pk }}"
{% if form.assigned_to.value == user.pk %}selected{% endif %}>
{{ user.username }}
</option>
{% endfor %}
</select>
{% if form.assigned_to.errors %}<div class="text-red-600 text-sm mt-1">{{ form.assigned_to.errors }}</div>{% endif %}
</div>
<!-- Buttons -->
<div class="flex gap-4 pt-4">
<button type="submit"
class="bg-green-500 hover:bg-green-600 text-white px-6 py-2 rounded font-medium">
✅ Ticket erstellen
</button>
<a href="{% url 'ticket-list' %}"
class="bg-gray-500 hover:bg-gray-600 text-white px-6 py-2 rounded font-medium">❌ Abbrechen</a>
</div>
</form>
<!-- Hilfe Text -->
<div class="mt-8 p-4 bg-blue-50 rounded border-l-4 border-blue-400">
<h3 class="font-medium text-blue-900 mb-2">💡 Tipps:</h3>
<ul class="text-sm text-blue-800 space-y-1">
<li>
• Verwende einen <strong>aussagekräftigen Titel</strong>
</li>
<li>
• Beschreibe das Problem so <strong>detailliert wie möglich</strong>
</li>
</ul>
</div>
<!-- Zugewiesen an -->
<div>
<label class="block text-sm font-medium mb-1">Zugewiesen an:</label>
<select name="assigned_to"
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">
<option value="">Nicht zugewiesen</option>
{% for user in form.assigned_to.field.queryset %}
<option value="{{ user.pk }}" {% if form.assigned_to.value == user.pk %}selected{% endif %}>
{{ user.username }}
</option>
{% endfor %}
</select>
{% if form.assigned_to.errors %}
<div class="text-red-600 text-sm mt-1">{{ form.assigned_to.errors }}</div>
{% endif %}
</div>
<!-- Buttons -->
<div class="flex gap-4 pt-4">
<button type="submit"
class="bg-green-500 hover:bg-green-600 text-white px-6 py-2 rounded font-medium">
✅ Ticket erstellen
</button>
<a href="{% url 'ticket-list' %}"
class="bg-gray-500 hover:bg-gray-600 text-white px-6 py-2 rounded font-medium">
❌ Abbrechen
</a>
</div>
</form>
<!-- Hilfe Text -->
<div class="mt-8 p-4 bg-blue-50 rounded border-l-4 border-blue-400">
<h3 class="font-medium text-blue-900 mb-2">💡 Tipps:</h3>
<ul class="text-sm text-blue-800 space-y-1">
<li>• Verwende einen <strong>aussagekräftigen Titel</strong></li>
<li>• Beschreibe das Problem so <strong>detailliert wie möglich</strong></li>
</ul>
</div>
</div>
</div>
{% endblock %}
{% endblock %}