ScriptVar subclasses indicate whether they support multiple values, and ScriptForm honors that

This commit is contained in:
Sander Steffann 2020-05-22 20:19:46 +02:00
parent cd236aa886
commit 32094643f9
2 changed files with 22 additions and 0 deletions

View File

@ -1,6 +1,7 @@
from django import forms from django import forms
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from django.utils.datastructures import MultiValueDict
from mptt.forms import TreeNodeMultipleChoiceField from mptt.forms import TreeNodeMultipleChoiceField
from taggit.forms import TagField as TagField_ from taggit.forms import TagField as TagField_
@ -431,6 +432,23 @@ class ScriptForm(BootstrapMixin, forms.Form):
) )
def __init__(self, vars, *args, commit_default=True, **kwargs): def __init__(self, vars, *args, commit_default=True, **kwargs):
from .scripts import MultiObjectVar
if 'initial' in kwargs:
orig_initial = kwargs['initial']
if isinstance(orig_initial, MultiValueDict):
# Convert MultiValueDict to a normal dict with single or multiple values based on the field type
new_initial = {}
for name in orig_initial:
var = vars.get(name)
if var and var.multiple_values:
# Force MultiValueDict to give us the list of values
new_initial[name] = orig_initial.getlist(name)
else:
# By default MultiValueDict gives us the last value
new_initial[name] = orig_initial.get(name)
kwargs['initial'] = new_initial
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)

View File

@ -50,6 +50,9 @@ class ScriptVariable:
""" """
form_field = forms.CharField form_field = forms.CharField
# Accept multiple values (e.g. MultiObjectVar)
multiple_values = False
def __init__(self, label='', description='', default=None, required=True, widget=None): def __init__(self, label='', description='', default=None, required=True, widget=None):
# Initialize field attributes # Initialize field attributes
@ -187,6 +190,7 @@ class MultiObjectVar(ScriptVariable):
Like ObjectVar, but can represent one or more objects. Like ObjectVar, but can represent one or more objects.
""" """
form_field = DynamicModelMultipleChoiceField form_field = DynamicModelMultipleChoiceField
multiple_values = True
def __init__(self, queryset, *args, **kwargs): def __init__(self, queryset, *args, **kwargs):
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)