summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIvan Kolodyazhny <e0ne@e0ne.info>2017-09-26 17:26:45 +0300
committerAkihiro Motoki <amotoki@gmail.com>2018-01-16 15:46:24 +0000
commit2ab0ea8c6a6eb8f1d6d6e04959426487c558c4a9 (patch)
tree22831fa5f383f8cbe476784ec4d0256c529e83a0
parent39d863ec239601ea6c57ef5273d6137d5930d80e (diff)
downloadhorizon-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.py55
-rw-r--r--openstack_dashboard/dashboards/project/instances/workflows/create_instance.py7
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]]