diff options
Diffstat (limited to 'ishtar_common/widgets.py')
-rw-r--r-- | ishtar_common/widgets.py | 82 |
1 files changed, 42 insertions, 40 deletions
diff --git a/ishtar_common/widgets.py b/ishtar_common/widgets.py index 42a93ddaa..eb68bac2e 100644 --- a/ishtar_common/widgets.py +++ b/ishtar_common/widgets.py @@ -26,15 +26,16 @@ from django.conf import settings from django.core.urlresolvers import reverse, NoReverseMatch from django.db.models import fields from django.forms import ClearableFileInput -from django.forms.widgets import flatatt, \ - CheckboxSelectMultiple as CheckboxSelectMultipleBase -from django.template import Context, loader +from django.forms.utils import flatatt +from django.forms.widgets import CheckboxSelectMultiple as \ + CheckboxSelectMultipleBase +from django.template import loader from django.template.defaultfilters import slugify from django.utils.encoding import smart_unicode from django.utils.functional import lazy from django.utils.html import escape from django.utils.safestring import mark_safe -from django.utils.simplejson import JSONEncoder +from json import JSONEncoder from django.utils.translation import ugettext_lazy as _ from ishtar_common import models @@ -134,8 +135,8 @@ class Select2Multiple(forms.SelectMultiple): else: options = "{" options += " containerCssClass: 'full-width'}" - html = super(Select2Multiple, self).render(name, value, attrs, - choices) + self.choices = choices + html = super(Select2Multiple, self).render(name, value, attrs) html += """<script type="text/javascript"> $(document).ready(function() {{ $("#id_{}").select2({}); @@ -155,8 +156,7 @@ class CheckboxSelectMultiple(CheckboxSelectMultipleBase): value = value.split(',') if type(value) not in (list, tuple): value = [value] - return super(CheckboxSelectMultiple, self).render(name, value, attrs, - choices) + return super(CheckboxSelectMultiple, self).render(name, value, attrs) class Select2MultipleField(forms.MultipleChoiceField): @@ -191,9 +191,9 @@ class Select2MultipleField(forms.MultipleChoiceField): class DeleteWidget(forms.CheckboxInput): - def render(self, name, value, attrs=None): - final_attrs = flatatt(self.build_attrs(attrs, name=name, - value='1')) + def render(self, name, value, attrs=None, renderer=None): + final_attrs = flatatt( + self.build_attrs(attrs, {"name": name, "value": '1'})) output = ['<tr class="delete"><td colspan="2">'] output.append(u"<button%s>%s</button>" % (final_attrs, _("Delete"))) output.append('</td></tr>') @@ -206,16 +206,17 @@ class ImageFileInput(ClearableFileInput): class SquareMeterWidget(forms.TextInput): - def render(self, name, value, attrs=None): + def render(self, name, value, attrs=None, renderer=None): if not value: value = u"" - final_attrs = flatatt(self.build_attrs(attrs, name=name, value=value)) + final_attrs = flatatt( + self.build_attrs(attrs, {"name": name, "value": value})) dct = {'final_attrs': final_attrs, 'unit': settings.SURFACE_UNIT_LABEL, 'id': attrs['id'], "safe_id": attrs['id'].replace('-', '_')} t = loader.get_template('blocks/SquareMeterWidget.html') - rendered = t.render(Context(dct)) + rendered = t.render(dct) return mark_safe(rendered) AreaWidget = forms.TextInput @@ -231,7 +232,7 @@ class JQueryDate(forms.TextInput): self.attrs['class'] = '' self.attrs['class'] = 'date-pickup' - def render(self, name, value=None, attrs=None): + def render(self, name, value, attrs=None, renderer=None): if value: value = unicode(value) # very specific... @@ -266,25 +267,29 @@ class JQueryDate(forms.TextInput): class JQueryAutoComplete(forms.TextInput): - def __init__(self, source, associated_model=None, options={}, attrs={}, - new=False, url_new='', multiple=False, limit={}, - dynamic_limit=[]): + def __init__(self, source, associated_model=None, options=None, attrs=None, + new=False, url_new='', multiple=False, limit=None, + dynamic_limit=None): """ Source can be a list containing the autocomplete values or a string containing the url used for the request. """ - self.options = None - self.attrs = {} self.source = source self.associated_model = associated_model - if len(options) > 0: + + self.options = None + if options and len(options) > 0: self.options = JSONEncoder().encode(options) - self.attrs.update(attrs) + self.attrs = {} + + if attrs: + self.attrs.update(attrs) + self.new = new self.url_new = url_new self.multiple = multiple - self.limit = limit - self.dynamic_limit = dynamic_limit + self.limit = limit or {} + self.dynamic_limit = dynamic_limit or [] def value_from_datadict(self, data, files, name): if self.multiple: @@ -313,22 +318,20 @@ class JQueryAutoComplete(forms.TextInput): if self.options: dct['options'] = mark_safe('%s' % self.options) - js = "" tpl = 'blocks/JQueryAutocomplete.js' if self.multiple: tpl = 'blocks/JQueryAutocompleteMultiple.js' t = loader.get_template(tpl) - js = t.render(Context(dct)) + js = t.render(dct) return js - def render(self, name, value=None, attrs=None): - attrs_hidden = self.build_attrs(attrs, name=name) + def render(self, name, value, attrs=None, renderer=None): + attrs_hidden = self.build_attrs(attrs, {"name": name}) attrs_select = self.build_attrs(attrs) attrs_select['placeholder'] = _(u"Search...") if value: hiddens = [] selects = [] - values = value if type(value) not in (list, tuple): values = unicode(escape(smart_unicode(value))) values = values.replace('[', '').replace(']', '') @@ -428,8 +431,8 @@ class JQueryTown(forms.TextInput): raise ValueError('source type is not valid') return encoded_src - def render(self, name, value=None, attrs=None): - attrs_hidden = self.build_attrs(attrs, name=name) + def render(self, name, value, attrs=None, renderer=None): + attrs_hidden = self.build_attrs(attrs, {"name": name}) attrs_select = self.build_attrs(attrs) attrs_select['placeholder'] = _(u"Search...") selected = '' @@ -487,7 +490,7 @@ class JQueryTown(forms.TextInput): 'selected_state': selected_state} ) html = loader.get_template('blocks/JQueryAdvancedTown.html')\ - .render(Context(dct)) + .render(dct) return html @@ -540,11 +543,11 @@ class JQueryPersonOrganization(forms.TextInput): 'field_id': field_id} if self.options: dct['options'] = mark_safe('%s' % self.options) - js = loader.get_template(self.js_template).render(Context(dct)) + js = loader.get_template(self.js_template).render(dct) return js - def render(self, name, value=None, attrs=None): - attrs_hidden = self.build_attrs(attrs, name=name) + def render(self, name, value, attrs=None, renderer=None): + attrs_hidden = self.build_attrs(attrs, {'name': name}) attrs_select = self.build_attrs(attrs) attrs_select['placeholder'] = _(u"Search...") selected = '' @@ -586,7 +589,7 @@ class JQueryPersonOrganization(forms.TextInput): 'name': name, 'js': self.render_js(name, selected), 'new': mark_safe(new)} - html = loader.get_template(self.html_template).render(Context(dct)) + html = loader.get_template(self.html_template).render(dct) return html @@ -692,11 +695,10 @@ class JQueryJqGrid(forms.RadioSelect): extra_cols = extra_cols and ", ".join(extra_cols) or "" return jq_col_names, extra_cols - def render(self, name, value=None, attrs=None): + def render(self, name, value, attrs=None, renderer=None): t = loader.get_template('blocks/form_flex_snippet.html') form = self.form() - rendered = t.render(Context({'form': form, - 'flex': True})) + rendered = t.render({'form': form, 'flex': True}) dct = {} if self.new: model_name = self.associated_model._meta.object_name.lower() @@ -744,5 +746,5 @@ class JQueryJqGrid(forms.RadioSelect): 'multi_cols': ",".join((u'"%d"' % col for col in self.multiple_cols))}) t = loader.get_template('blocks/JQueryJqGrid.html') - rendered += t.render(Context(dct)) + rendered += t.render(dct) return mark_safe(rendered) |