diff options
author | Ivan Kolodyazhny <e0ne@e0ne.info> | 2017-09-26 17:26:45 +0300 |
---|---|---|
committer | Akihiro Motoki <amotoki@gmail.com> | 2018-01-16 15:46:24 +0000 |
commit | 2ab0ea8c6a6eb8f1d6d6e04959426487c558c4a9 (patch) | |
tree | 22831fa5f383f8cbe476784ec4d0256c529e83a0 | |
parent | 39d863ec239601ea6c57ef5273d6137d5930d80e (diff) | |
download | horizon-2ab0ea8c6a6eb8f1d6d6e04959426487c558c4a9.tar.gz |
Add render method to ThemableCheckboxSelectMultiple
Django 1.11+ doesn't have RenderMixin class for widgets, so we have to
implement render method for ThemableCheckboxSelectMultiple to get it
rendered in a correct way with all supported Django versions until we
find a better solution for our widgets implementation.
Change-Id: I656afb162e130f2b77853368945b74330bedf747
Closes-Bug: #1715066
(cherry picked from commit c13d6da80e7a68c28aa0adfe63459be8a6dbedfd)
-rw-r--r-- | horizon/forms/fields.py | 55 | ||||
-rw-r--r-- | openstack_dashboard/dashboards/project/instances/workflows/create_instance.py | 7 |
2 files changed, 22 insertions, 40 deletions
diff --git a/horizon/forms/fields.py b/horizon/forms/fields.py index a74b3be1f..02932d8cf 100644 --- a/horizon/forms/fields.py +++ b/horizon/forms/fields.py @@ -527,10 +527,14 @@ class ThemableCheckboxChoiceInput(ChoiceInput): def __init__(self, *args, **kwargs): super(ThemableCheckboxChoiceInput, self).__init__(*args, **kwargs) - self.value = set(force_text(v) for v in self.value) + # NOTE(e0ne): Django sets default value to None + if self.value: + self.value = set(force_text(v) for v in self.value) def is_checked(self): - return self.choice_value in self.value + if self.value: + return self.choice_value in self.value + return False def render(self, name=None, value=None, attrs=None, choices=()): if self.id_for_label: @@ -545,43 +549,23 @@ class ThemableCheckboxChoiceInput(ChoiceInput): ) -# NOTE(adriant): CheckboxFieldRenderer was removed in Django 1.11 so -# has been moved here until we redo how we handle widgets. -@html.html_safe -@python_2_unicode_compatible -class CheckboxFieldRenderer(object): - """CheckboxFieldRenderer class from django 1.10.7 codebase - - An object used by RadioSelect to enable customization of radio widgets. - """ - - choice_input_class = None +class ThemableCheckboxSelectMultiple(widgets.CheckboxSelectMultiple): + choice_input_class = ThemableCheckboxChoiceInput + _empty_value = [] outer_html = '<ul{id_attr}>{content}</ul>' inner_html = '<li>{choice_value}{sub_widgets}</li>' - def __init__(self, name, value, attrs, choices): - self.name = name - self.value = value - self.attrs = attrs - self.choices = choices - - def __getitem__(self, idx): - return list(self)[idx] - - def __iter__(self): - for idx, choice in enumerate(self.choices): - yield self.choice_input_class( - self.name, self.value, self.attrs.copy(), choice, idx) - - def __str__(self): - return self.render() - - def render(self): + def render(self, name=None, value=None, attrs=None): """Outputs a <ul> for this set of choice fields. If an id was given to the field, it is applied to the <ul> (each item in the list will get an id of `$id_$i`). """ + attrs = {} or attrs + self.attrs = attrs + self.name = name + self.value = value + id_ = self.attrs.get('id') output = [] for i, choice in enumerate(self.choices): @@ -615,15 +599,6 @@ class CheckboxFieldRenderer(object): ) -class ThemableCheckboxFieldRenderer(CheckboxFieldRenderer): - choice_input_class = ThemableCheckboxChoiceInput - - -class ThemableCheckboxSelectMultiple(widgets.CheckboxSelectMultiple): - renderer = ThemableCheckboxFieldRenderer - _empty_value = [] - - class ExternalFileField(fields.FileField): """Special FileField to upload file to some external location. diff --git a/openstack_dashboard/dashboards/project/instances/workflows/create_instance.py b/openstack_dashboard/dashboards/project/instances/workflows/create_instance.py index df53b6041..912a814b2 100644 --- a/openstack_dashboard/dashboards/project/instances/workflows/create_instance.py +++ b/openstack_dashboard/dashboards/project/instances/workflows/create_instance.py @@ -715,6 +715,13 @@ class SetNetworkAction(workflows.Action): def __init__(self, request, *args, **kwargs): super(SetNetworkAction, self).__init__(request, *args, **kwargs) + + # NOTE(e0ne): we don't need 'required attribute for networks + # checkboxes to be able to select only one network + # NOTE(e0ne): we need it for compatibility with different + # Django versions (prior to 1.11) + self.use_required_attribute = False + network_list = self.fields["network"].choices if len(network_list) == 1: self.fields['network'].initial = [network_list[0][0]] |