From 2cbac826d42ef89db2f971f6ca5f066377dbc22c Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Wed, 2 Jan 2019 02:39:24 -0400 Subject: [PATCH] Add a reusable filtered choice form Signed-off-by: Roberto Rosario --- mayan/apps/common/forms.py | 55 +++++++++++++++++++++++++++++++++++++- 1 file changed, 54 insertions(+), 1 deletion(-) diff --git a/mayan/apps/common/forms.py b/mayan/apps/common/forms.py index 2b09759742..d7cba8309e 100644 --- a/mayan/apps/common/forms.py +++ b/mayan/apps/common/forms.py @@ -4,6 +4,7 @@ import os from django import forms from django.conf import settings +from django.core.exceptions import ImproperlyConfigured from django.db import models from django.utils.module_loading import import_string from django.utils.translation import ugettext_lazy as _ @@ -111,7 +112,10 @@ class FileDisplayForm(forms.Form): text = forms.CharField( label='', widget=TextAreaDiv( - attrs={'class': 'full-height scrollable', 'data-height-difference': 270} + attrs={ + 'class': 'full-height scrollable', + 'data-height-difference': 270 + } ) ) @@ -125,6 +129,55 @@ class FileDisplayForm(forms.Form): self.fields['text'].initial = file_object.read() +class FilteredSelectionForm(forms.Form): + """ + Form to select the from a list of choice filtered by access. Can be + configure to allow single or multiple selection. + """ + def __init__(self, *args, **kwargs): + field_name = kwargs.pop('field_name', None) + label = kwargs.pop('label', None) + help_text = kwargs.pop('help_text', None) + permission = kwargs.pop('permission', None) + queryset = kwargs.pop('queryset', None) + + if queryset is None: + model = kwargs.pop('model', None) + if not model: + raise ImproperlyConfigured( + 'Must provide a queryset or a model.' + ) + + queryset = model.objects.all() + + user = kwargs.pop('user', None) + widget_class = kwargs.pop('widget_class', None) + widget_attributes = kwargs.pop('widget_attributes', {'size': '10'}) + + if not widget_class: + if kwargs.pop('allow_multiple', False): + extra_kwargs = {} + field_class = forms.ModelMultipleChoiceField + widget_class = forms.widgets.SelectMultiple + else: + extra_kwargs = {'empty_label': None} + field_class = forms.ModelChoiceField + widget_class = forms.widgets.Select + + super(FilteredSelectionForm, self).__init__(*args, **kwargs) + + if permission: + queryset = AccessControlList.objects.filter_by_access( + permission=permission, queryset=queryset, user=user + ) + + self.fields[field_name] = field_class( + help_text=help_text, label=label, + queryset=queryset, required=True, + widget=widget_class(attrs=widget_attributes), **extra_kwargs + ) + + class LicenseForm(FileDisplayForm): DIRECTORY = () FILENAME = 'LICENSE'