from django import forms from django.contrib.auth.models import User from django.utils.translation import gettext_lazy as _ from .models import ApiKey, Attachment, Item, Kanban, Tag, Team, TeamInvite, 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': _('Write something … /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': _('Show notes'), 'show_open_todos': _('Show open tasks'), 'show_done_todos': _('Show completed tasks'), 'show_links': _('Show links'), 'show_journal': _('Show journal'), 'overview_lines': _('Lines in overview'), } widgets = {'overview_lines': forms.NumberInput(attrs={'class': 'form-control', 'min': 1, 'max': 50})} class TeamForm(forms.ModelForm): class Meta: model = Team fields = ['name', 'slug'] labels = {'name': _('Team name'), 'slug': _('Team tag')} widgets = { 'name': forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'my2dos'}), 'slug': forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'my2dos'}), } def clean_slug(self): return self.cleaned_data['slug'].strip().lstrip('#').lower() class TeamInviteForm(forms.ModelForm): class Meta: model = TeamInvite fields = ['email'] labels = {'email': _('Email')} widgets = {'email': forms.EmailInput(attrs={'class': 'form-control', 'placeholder': 'person@example.com'})} 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': _('Kanban name')})} 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': _('API key name')}), 'tags': forms.CheckboxSelectMultiple(), } class AttachmentForm(forms.ModelForm): class Meta: model = Attachment fields = ['file']