Files
my2dos/core/forms.py
T
2026-08-22 16:26:46 +02:00

103 lines
3.7 KiB
Python

from django import forms
from django.contrib.auth.models import User
from .models import ApiKey, Attachment, Item, Kanban, Tag, UserPreference
class MultipleFileInput(forms.ClearableFileInput):
allow_multiple_selected = True
class MultipleFileField(forms.FileField):
def clean(self, data, initial=None):
if not data:
return []
files = data if isinstance(data, (list, tuple)) else [data]
return [super(MultipleFileField, self).clean(file, initial) for file in files]
class QuickItemForm(forms.ModelForm):
files = MultipleFileField(required=False, widget=MultipleFileInput(attrs={'multiple': True}))
class Meta:
model = Item
fields = ['content']
widgets = {'content': forms.Textarea(attrs={
'class': 'form-control form-control-lg',
'rows': 3,
'placeholder': 'Schreibe etwas … /todo /link /public #tag [[note:1]]',
'x-model': 'text',
'@keydown': 'onKeydown($event)',
'@input': 'onInput($event)',
'@paste': 'handlePaste($event)',
})}
class EditItemForm(forms.ModelForm):
files = MultipleFileField(required=False, widget=MultipleFileInput(attrs={'multiple': True}))
class Meta:
model = Item
fields = ['content', 'comment', 'visibility', 'due_at', 'url']
widgets = {
'comment': forms.Textarea(attrs={'class': 'form-control', 'rows': 3}),
'due_at': forms.DateTimeInput(attrs={'type': 'datetime-local'}, format='%Y-%m-%dT%H:%M'),
'url': forms.URLInput(attrs={'class': 'form-control', 'placeholder': 'URL'}),
}
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['due_at'].input_formats = ['%Y-%m-%dT%H:%M']
class UserSettingsForm(forms.ModelForm):
class Meta:
model = User
fields = ['first_name', 'last_name', 'email']
widgets = {field: forms.TextInput(attrs={'class': 'form-control'}) for field in ['first_name', 'last_name', 'email']}
class UserPreferenceForm(forms.ModelForm):
class Meta:
model = UserPreference
fields = ['show_notes', 'show_open_todos', 'show_done_todos', 'show_links', 'show_journal', 'overview_lines']
labels = {
'show_notes': 'Notizen anzeigen',
'show_open_todos': 'Offene Aufgaben anzeigen',
'show_done_todos': 'Erledigte Aufgaben anzeigen',
'show_links': 'Links anzeigen',
'show_journal': 'Journal anzeigen',
'overview_lines': 'Zeilen in der Übersicht',
}
widgets = {'overview_lines': forms.NumberInput(attrs={'class': 'form-control', 'min': 1, 'max': 50})}
class KanbanForm(forms.ModelForm):
tag_name = forms.CharField(label='Tag', widget=forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'my2dos'}))
class Meta:
model = Kanban
fields = ['name', 'tag_name']
widgets = {'name': forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Name des Kanbans'})}
def save(self, commit=True):
tag_name = self.cleaned_data['tag_name'].strip().lstrip('#').lower()
tag, _ = Tag.objects.get_or_create(name=tag_name)
self.instance.tag = tag
return super().save(commit=commit)
class ApiKeyForm(forms.ModelForm):
class Meta:
model = ApiKey
fields = ['name', 'tags']
widgets = {
'name': forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Name des API Keys'}),
'tags': forms.CheckboxSelectMultiple(),
}
class AttachmentForm(forms.ModelForm):
class Meta:
model = Attachment
fields = ['file']