Files
fet2020/fet2020/tasks/forms.py

211 lines
5.5 KiB
Python

from django import forms
from django.contrib.admin.widgets import FilteredSelectMultiple
from django.contrib.auth.models import User
from django.core.validators import ValidationError
from django.forms.widgets import HiddenInput
from django.utils import timezone
from django.utils.translation import gettext_lazy as _
from .models import Task, TaskList, Document
class DateInput(forms.DateInput):
input_type = "date"
class DocumentInlineForm(forms.ModelForm):
class Meta:
model = Document
fields = [
"title",
"slug",
"date",
]
labels = {
"title": _("Titel"),
"slug": _("Permalink"),
}
class TaskListAdminForm(forms.ModelForm):
users = forms.ModelMultipleChoiceField(
label="Benutzer",
help_text="Es können nur die Benutzer ausgewählt werden, die sich auf der Homepage angemeldet haben.",
queryset=User.objects.all().order_by("username"),
widget=FilteredSelectMultiple("User", is_stacked=False),
)
class Meta:
model = TaskList
fields = "__all__"
class TaskAdminForm(forms.ModelForm):
class Meta:
model = Task
fields = "__all__"
labels = {
"title": _("Titel"),
"shortterm": _("Kürzel für den Link"),
"slug": _("Permalink"),
"task_list": _("Aufgabenbereich"),
"due_date": _("Fälligkeit"),
"completed": _("Abgeschlossen"),
"completed_date": _("Datum der Fertigstellung"),
"assigned_to": _("Zuweisen an"),
"note": _("Notizen"),
"priority": _("Priorität"),
}
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs) # to get the self.fields set
self.fields["assigned_to"].empty_label = "Alle"
self.fields["assigned_to"].queryset = self.fields[
"assigned_to"
].queryset.order_by("username")
class TaskCreateForm(forms.ModelForm):
class Meta:
model = Task
fields = [
"title",
"task_list",
"due_date",
"assigned_to",
"note",
]
labels = {
"title": _("Titel des Tasks"),
"task_list": _("Task-Gruppe"),
"due_date": _("Fälligkeitsdatum"),
"assigned_to": _("Zuweisen an"),
}
widgets = {
"due_date": DateInput(
format=("%Y-%m-%d"),
)
}
def __init__(self, *args, **kwargs):
if "user" in kwargs:
user = kwargs.pop("user")
else:
user = None
super().__init__(*args, **kwargs) # to get the self.fields set
self.fields["assigned_to"].empty_label = "Alle"
qs = self.fields["assigned_to"].queryset
self.fields["assigned_to"].queryset = qs.order_by("username")
if user:
self.fields["task_list"].queryset = TaskList.objects.filter(users=user)
def clean(self):
cleaned_data = super().clean()
assigned_to = cleaned_data["assigned_to"]
if assigned_to:
task_list = TaskList.objects.get(id=cleaned_data["task_list"].id)
if not task_list.users.filter(username=assigned_to.username):
raise ValidationError(
_(
f"User '{assigned_to}' gibt es nicht in der User-Liste der Task-Gruppe '{task_list}'."
)
)
return cleaned_data
class TaskUpdateForm(forms.ModelForm):
class Meta:
model = Task
fields = [
"assigned_to",
"due_date",
"priority",
"note",
"task_list",
]
labels = {
"due_date": _("Fälligkeitsdatum"),
"assigned_to": _("Zuweisen an"),
}
widgets = {
"due_date": DateInput(
format=("%Y-%m-%d"),
),
"task_list": HiddenInput,
}
def __init__(self, *args, **kwargs):
if "task_list" in kwargs:
task_list = kwargs.pop("task_list")
else:
task_list = None
super().__init__(*args, **kwargs) # to get the self.fields set
self.fields["assigned_to"].empty_label = "Alle"
if task_list:
qs = TaskList.objects.get(id=task_list.id).users
self.fields["assigned_to"].queryset = qs.order_by("username")
class DocumentCreateForm(forms.ModelForm):
class Meta:
model = Document
fields = [
"title",
"date",
"task",
]
labels = {
"title": _("Titel"),
"date": _("Datum"),
}
widgets = {
"date": DateInput(format=("%d-%m-%Y")),
"task": HiddenInput,
}
class InternTaskCreateForm(TaskCreateForm):
# form for creating a task from intern page.
class Meta:
model = Task
fields = [
"title",
"shortterm",
"task_list",
"due_date",
"assigned_to",
"note",
]
labels = {
"title": _("Titel des Tasks"),
"shortterm": _("Kürzel für den Link"),
"task_list": _("Task-Gruppe"),
"due_date": _("Fälligkeitsdatum"),
"assigned_to": _("Zuweisen an"),
}
widgets = {
"due_date": DateInput(
format=("%d-%m-%Y"),
),
"task_list": HiddenInput,
}