| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 |
- import re
- from django import forms
- from django.utils.translation import gettext as _
- from .mixins import BootstrapMixin
- __all__ = (
- 'BulkEditForm',
- 'BulkRenameForm',
- 'ConfirmationForm',
- 'CSVModelForm',
- 'FilterForm',
- 'TableConfigForm',
- )
- class ConfirmationForm(BootstrapMixin, forms.Form):
- """
- A generic confirmation form. The form is not valid unless the `confirm` field is checked.
- """
- return_url = forms.CharField(
- required=False,
- widget=forms.HiddenInput()
- )
- confirm = forms.BooleanField(
- required=True,
- widget=forms.HiddenInput(),
- initial=True
- )
- class BulkEditForm(BootstrapMixin, forms.Form):
- """
- Provides bulk edit support for objects.
- """
- nullable_fields = ()
- class BulkRenameForm(BootstrapMixin, forms.Form):
- """
- An extendable form to be used for renaming objects in bulk.
- """
- find = forms.CharField()
- replace = forms.CharField(
- required=False
- )
- use_regex = forms.BooleanField(
- required=False,
- initial=True,
- label=_('Use regular expressions')
- )
- def clean(self):
- super().clean()
- # Validate regular expression in "find" field
- if self.cleaned_data['use_regex']:
- try:
- re.compile(self.cleaned_data['find'])
- except re.error:
- raise forms.ValidationError({
- 'find': "Invalid regular expression"
- })
- class CSVModelForm(forms.ModelForm):
- """
- ModelForm used for the import of objects in CSV format.
- """
- def __init__(self, *args, headers=None, fields=None, **kwargs):
- headers = headers or {}
- fields = fields or []
- super().__init__(*args, **kwargs)
- # Modify the model form to accommodate any customized to_field_name properties
- for field, to_field in headers.items():
- if to_field is not None:
- self.fields[field].to_field_name = to_field
- # Omit any fields not specified (e.g. because the form is being used to
- # updated rather than create objects)
- if fields:
- for field in list(self.fields.keys()):
- if field not in fields:
- del self.fields[field]
- class FilterForm(BootstrapMixin, forms.Form):
- """
- Base Form class for FilterSet forms.
- """
- q = forms.CharField(
- required=False,
- label=_('Search')
- )
- class TableConfigForm(BootstrapMixin, forms.Form):
- """
- Form for configuring user's table preferences.
- """
- available_columns = forms.MultipleChoiceField(
- choices=[],
- required=False,
- widget=forms.SelectMultiple(
- attrs={'size': 10, 'class': 'form-select'}
- ),
- label=_('Available Columns')
- )
- columns = forms.MultipleChoiceField(
- choices=[],
- required=False,
- widget=forms.SelectMultiple(
- attrs={'size': 10, 'class': 'form-select'}
- ),
- label=_('Selected Columns')
- )
- def __init__(self, table, *args, **kwargs):
- self.table = table
- super().__init__(*args, **kwargs)
- # Initialize columns field based on table attributes
- self.fields['available_columns'].choices = table.available_columns
- self.fields['columns'].choices = table.selected_columns
- @property
- def table_name(self):
- return self.table.__class__.__name__
|