148 lines
5.2 KiB
Python
148 lines
5.2 KiB
Python
from django import forms
|
|
from django.contrib.auth.forms import UserCreationForm
|
|
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, UserInvite, 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', 'url']
|
|
widgets = {
|
|
'comment': forms.Textarea(attrs={'class': 'form-control', 'rows': 3}),
|
|
'url': forms.URLInput(attrs={'class': 'form-control', 'placeholder': 'URL'}),
|
|
}
|
|
|
|
|
|
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 = ['language', 'show_notes', 'show_open_todos', 'show_done_todos', 'show_links', 'due_first', 'overview_lines']
|
|
labels = {
|
|
'language': _('Language'),
|
|
'show_notes': _('Show notes'),
|
|
'show_open_todos': _('Show open tasks'),
|
|
'show_done_todos': _('Show completed tasks'),
|
|
'show_links': _('Show links'),
|
|
'due_first': _('Always show due items first'),
|
|
'overview_lines': _('Lines in overview'),
|
|
}
|
|
widgets = {
|
|
'language': forms.Select(attrs={'class': 'form-select'}),
|
|
'overview_lines': forms.NumberInput(attrs={'class': 'form-control', 'min': 1, 'max': 50}),
|
|
}
|
|
|
|
|
|
class UserInviteForm(forms.ModelForm):
|
|
email = forms.EmailField(required=True, label=_('Email'), widget=forms.EmailInput(attrs={'class': 'form-control', 'placeholder': 'person@example.com', 'required': True}))
|
|
|
|
class Meta:
|
|
model = UserInvite
|
|
fields = ['email']
|
|
|
|
|
|
class InviteRegistrationForm(UserCreationForm):
|
|
email = forms.EmailField(required=False, label=_('Email'), widget=forms.EmailInput(attrs={'class': 'form-control'}))
|
|
|
|
class Meta:
|
|
model = User
|
|
fields = ['username', 'email', 'password1', 'password2']
|
|
widgets = {'username': forms.TextInput(attrs={'class': 'form-control'})}
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
super().__init__(*args, **kwargs)
|
|
for name in ['password1', 'password2']:
|
|
self.fields[name].widget.attrs.update({'class': 'form-control'})
|
|
|
|
|
|
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']
|