diff options
author | Étienne Loks <etienne.loks@proxience.com> | 2015-08-19 15:12:43 +0200 |
---|---|---|
committer | Étienne Loks <etienne.loks@proxience.com> | 2015-08-19 15:12:43 +0200 |
commit | ab53d8cfdcfbbaff8cc5b6bc0e44ee923485d9bb (patch) | |
tree | 840ab617f2927fec8143f6005cfd2d498d1c738f /ishtar_common/widgets.py | |
parent | b4a8dcb2836c202edf250c9953327a9ca5280004 (diff) | |
download | Ishtar-ab53d8cfdcfbbaff8cc5b6bc0e44ee923485d9bb.tar.bz2 Ishtar-ab53d8cfdcfbbaff8cc5b6bc0e44ee923485d9bb.zip |
Archaeological files: change planning service management
Diffstat (limited to 'ishtar_common/widgets.py')
-rw-r--r-- | ishtar_common/widgets.py | 178 |
1 files changed, 98 insertions, 80 deletions
diff --git a/ishtar_common/widgets.py b/ishtar_common/widgets.py index ba7e61e46..efafa38e2 100644 --- a/ishtar_common/widgets.py +++ b/ishtar_common/widgets.py @@ -1,6 +1,6 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- -# Copyright (C) 2010-2014 Étienne Loks <etienne.loks_AT_peacefrogsDOTnet> +# Copyright (C) 2010-2015 Étienne Loks <etienne.loks_AT_peacefrogsDOTnet> # Copyright (C) 2007 skam <massimo dot scamarcia at gmail.com> # (http://djangosnippets.org/snippets/233/) @@ -21,7 +21,7 @@ from django import forms from django.conf import settings -from django.core.urlresolvers import resolve, reverse +from django.core.urlresolvers import reverse from django.db.models import fields from django.forms import ClearableFileInput from django.forms.widgets import flatatt @@ -44,7 +44,7 @@ class Select2Multiple(forms.SelectMultiple): css = { 'all': ('select2/css/select2.css',) } - js = ('select2/js/select2.min.js', + js = ('select2/js/select2.min.js', 'select2/js/init.js') def render(self, name, value, attrs=None, choices=()): @@ -54,7 +54,8 @@ class Select2Multiple(forms.SelectMultiple): attrs = {} attrs['class'] = klass return super(Select2Multiple, self).render(name, value, attrs, - choices) + choices) + class MultipleAutocompleteField(forms.MultipleChoiceField): def __init__(self, *args, **kwargs): @@ -65,10 +66,10 @@ class MultipleAutocompleteField(forms.MultipleChoiceField): kwargs['choices'] = [] new = kwargs.pop('new') if 'new' in kwargs else None if 'widget' not in kwargs and self.model: - kwargs['widget'] = JQueryAutoComplete(reverse_lazy( - 'autocomplete-'+self.model.__name__.lower()), - associated_model=self.model, new=new, - multiple=True) + kwargs['widget'] = JQueryAutoComplete( + reverse_lazy('autocomplete-'+self.model.__name__.lower()), + associated_model=self.model, new=new, + multiple=True) super(MultipleAutocompleteField, self).__init__(*args, **kwargs) def get_choices(self): @@ -89,17 +90,18 @@ class MultipleAutocompleteField(forms.MultipleChoiceField): val = value value = [] for v in val: - v = unicode(v).strip('[').strip(']' - ).strip('u').strip("'").strip('"') - value += [int(v.strip()) - for v in list(set(v.split(','))) - if v.strip()] + v = unicode(v).strip('[').strip(']')\ + .strip('u').strip("'").strip('"') + value += [int(va.strip()) + for va in list(set(v.split(','))) + if va.strip()] except (TypeError, ValueError): value = [] else: value = [] return super(MultipleAutocompleteField, self).clean(value) + class DeleteWidget(forms.CheckboxInput): def render(self, name, value, attrs=None): final_attrs = flatatt(self.build_attrs(attrs, name=name, @@ -109,28 +111,31 @@ class DeleteWidget(forms.CheckboxInput): output.append('</td></tr>') return mark_safe('\n'.join(output)) + class ImageFileInput(ClearableFileInput): template_with_initial = u'<span class="prettyPhoto">%(initial)s</span>'\ - u' %(clear_template)s<br />%(input_text)s: %(input)s' + u' %(clear_template)s<br />%(input_text)s: %(input)s' + class SquareMeterWidget(forms.TextInput): def render(self, name, value, attrs=None): if not value: value = u"" 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('-', '_')} + 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)) return mark_safe(rendered) AreaWidget = forms.TextInput + if settings.SURFACE_UNIT == 'square-metre': - #global AreaWidget AreaWidget = SquareMeterWidget + class JQueryDate(forms.TextInput): def __init__(self, *args, **kwargs): super(JQueryDate, self).__init__(*args, **kwargs) @@ -166,12 +171,14 @@ class JQueryDate(forms.TextInput): } $(window).load(load_jquerydate_%(var_name)s); //--></script> -""" % {"name":name, "var_name":var_name, "country":settings.COUNTRY} +""" % {"name": name, "var_name": var_name, "country": settings.COUNTRY} return rendered + class JQueryAutoComplete(forms.TextInput): def __init__(self, source, associated_model=None, options={}, attrs={}, - new=False, multiple=False, limit={}): + new=False, url_new='', multiple=False, limit={}, + dynamic_limit=[]): """ Source can be a list containing the autocomplete values or a string containing the url used for the request. @@ -184,8 +191,10 @@ class JQueryAutoComplete(forms.TextInput): self.options = JSONEncoder().encode(options) self.attrs.update(attrs) self.new = new + self.url_new = url_new self.multiple = multiple self.limit = limit + self.dynamic_limit = dynamic_limit def value_from_datadict(self, data, files, name): if self.multiple: @@ -203,8 +212,14 @@ class JQueryAutoComplete(forms.TextInput): source = "'" + unicode(self.source) + "'" except: raise ValueError('source type is not valid') - dct = {'source':mark_safe(source), - 'field_id':field_id,} + dynamic_limit = [ + 'id_' + lim.replace('_', '') + '-' + + '-'.join(field_id.split('-')[1:-1]) + '-' + lim + for lim in self.dynamic_limit + ] + dct = {'source': mark_safe(source), + 'field_id': field_id, + 'dynamic_limit': dynamic_limit} if self.options: dct['options'] = mark_safe('%s' % self.options) @@ -253,7 +268,7 @@ class JQueryAutoComplete(forms.TextInput): if hiddens and selects: attrs_hidden['value'] = hiddens[0] attrs_select['value'] = selects[0] - if not self.attrs.has_key('id'): + if 'id' not in self.attrs: attrs_hidden['id'] = 'id_%s' % name attrs_select['id'] = 'id_select_%s' % name if 'class' not in attrs_select: @@ -264,11 +279,14 @@ class JQueryAutoComplete(forms.TextInput): limits = [] for k in self.limit: limits.append(k + "__" + "-".join( - [unicode(v) for v in self.limit[k]])) + [unicode(v) for v in self.limit[k]])) args = [attrs_select['id']] if limits: args.append(';'.join(limits)) - url_new = reverse('new-' + model_name, args=args) + url_new = 'new-' + model_name + if self.url_new: + url_new = self.url_new + url_new = reverse(url_new, args=args) new = u' <a href="#" class="add-button" '\ u'onclick="open_window(\'%s\');">+</a>' % url_new html = u'''<input%(attrs_select)s/>%(new)s\ @@ -276,13 +294,14 @@ class JQueryAutoComplete(forms.TextInput): <script type="text/javascript"><!--// $(function() {%(js)s});//--></script> ''' % { - 'attrs_select' : flatatt(attrs_select), - 'attrs_hidden' : flatatt(attrs_hidden), - 'js' : self.render_js(name), - 'new':new + 'attrs_select': flatatt(attrs_select), + 'attrs_hidden': flatatt(attrs_hidden), + 'js': self.render_js(name), + 'new': new } return html + class JQueryTown(forms.TextInput): """ Town fields whith state and department pre-selections @@ -305,7 +324,7 @@ class JQueryTown(forms.TextInput): if isinstance(source, list): encoded_src = JSONEncoder().encode(source) elif isinstance(source, str) \ - or isinstance(source, unicode): + or isinstance(source, unicode): src = escape(source) if not src.endswith('/'): src += "/" @@ -357,31 +376,32 @@ class JQueryTown(forms.TextInput): if hiddens and selects: attrs_hidden['value'] = hiddens[0] attrs_select['value'] = selects[0] - if not self.attrs.has_key('id'): + if 'id' not in self.attrs: attrs_hidden['id'] = 'id_%s' % name attrs_select['id'] = 'id_select_%s' % name if 'class' not in attrs_select: attrs_select['class'] = 'autocomplete' source = self.encode_source(self.source) - dct = {'source':mark_safe(source), - 'selected':selected, - 'safe_field_id':slugify(name).replace('-', '_'), - 'field_id':name} + dct = {'source': mark_safe(source), + 'selected': selected, + 'safe_field_id': slugify(name).replace('-', '_'), + 'field_id': name} if self.options: dct['options'] = mark_safe('%s' % self.options) - dct.update({'attrs_select':mark_safe(flatatt(attrs_select)), - 'attrs_hidden':mark_safe(flatatt(attrs_hidden)), - 'name':name, - 'states':models.State.objects.all().order_by('label'), - 'selected_department':selected_department, - 'selected_state':selected_state - }) - html = loader.get_template('blocks/JQueryAdvancedTown.html').render( - Context(dct)) + dct.update({'attrs_select': mark_safe(flatatt(attrs_select)), + 'attrs_hidden': mark_safe(flatatt(attrs_hidden)), + 'name': name, + 'states': models.State.objects.all().order_by('label'), + 'selected_department': selected_department, + 'selected_state': selected_state} + ) + html = loader.get_template('blocks/JQueryAdvancedTown.html')\ + .render(Context(dct)) return html + class JQueryPersonOrganization(forms.TextInput): """ Complex widget which manage: @@ -392,7 +412,7 @@ class JQueryPersonOrganization(forms.TextInput): def __init__(self, source, edit_source, model, options={}, attrs={}, new=False, limit={}, - html_template = 'blocks/PersonOrganization.html', + html_template='blocks/PersonOrganization.html', js_template='blocks/JQueryPersonOrganization.js'): self.options = None self.attrs = {} @@ -413,7 +433,7 @@ class JQueryPersonOrganization(forms.TextInput): if isinstance(source, list): encoded_src = JSONEncoder().encode(source) elif isinstance(source, str) \ - or isinstance(source, unicode): + or isinstance(source, unicode): encoded_src = "'%s'" % escape(source) else: try: @@ -425,11 +445,11 @@ class JQueryPersonOrganization(forms.TextInput): def render_js(self, field_id, selected=''): source = self.encode_source(self.source) edit_source = self.encode_source(self.edit_source) - dct = {'source':mark_safe(source), - 'edit_source':mark_safe(edit_source), - 'selected':selected, - 'safe_field_id':slugify(field_id).replace('-', '_'), - 'field_id':field_id} + dct = {'source': mark_safe(source), + 'edit_source': mark_safe(edit_source), + 'selected': selected, + 'safe_field_id': slugify(field_id).replace('-', '_'), + 'field_id': field_id} if self.options: dct['options'] = mark_safe('%s' % self.options) js = loader.get_template(self.js_template).render(Context(dct)) @@ -467,33 +487,33 @@ class JQueryPersonOrganization(forms.TextInput): if hiddens and selects: attrs_hidden['value'] = hiddens[0] attrs_select['value'] = selects[0] - if not self.attrs.has_key('id'): + if 'id' not in self.attrs: attrs_hidden['id'] = 'id_%s' % name attrs_select['id'] = 'id_select_%s' % name if 'class' not in attrs_select: attrs_select['class'] = 'autocomplete' new = '' - dct = {'attrs_select':mark_safe(flatatt(attrs_select)), - 'attrs_hidden':mark_safe(flatatt(attrs_hidden)), - 'name':name, - 'js':self.render_js(name, selected), - 'new':mark_safe(new)} + dct = {'attrs_select': mark_safe(flatatt(attrs_select)), + 'attrs_hidden': mark_safe(flatatt(attrs_hidden)), + 'name': name, + 'js': self.render_js(name, selected), + 'new': mark_safe(new)} html = loader.get_template(self.html_template).render(Context(dct)) return html + class JQueryJqGrid(forms.RadioSelect): COL_TPL = "{name:'%(idx)s', index:'%(idx)s', sortable:true}" + class Media: js = ['%s/js/i18n/grid.locale-%s.js' % (settings.STATIC_URL, settings.COUNTRY), - '%s/js/jquery.jqGrid.min.js' % settings.STATIC_URL, - ] - css = {'all':['%s/media/ui.jqgrid.css' % settings.STATIC_URL, - ]} + '%s/js/jquery.jqGrid.min.js' % settings.STATIC_URL] + css = {'all': ['%s/media/ui.jqgrid.css' % settings.STATIC_URL]} def __init__(self, source, form, associated_model, attrs={}, - table_cols='TABLE_COLS', multiple=False, multiple_cols=[2], new=False, - new_message="", source_full=None): + table_cols='TABLE_COLS', multiple=False, multiple_cols=[2], + new=False, new_message="", source_full=None): self.source = source self.form = form self.attrs = attrs @@ -507,7 +527,7 @@ class JQueryJqGrid(forms.RadioSelect): def render(self, name, value=None, attrs=None): t = loader.get_template('blocks/form_snippet.html') form = self.form() - rendered = t.render(Context({'form':form})) + rendered = t.render(Context({'form': form})) dct = {} if self.new: model_name = self.associated_model._meta.object_name.lower() @@ -516,7 +536,6 @@ class JQueryJqGrid(forms.RadioSelect): extra_cols = [] col_names, col_idx = [], [] for k in form.get_input_ids(): - #field = form.fields[k] col_idx.append(u'"%s"' % k) for field_name in getattr(self.associated_model, self.table_cols): field = self.associated_model @@ -536,7 +555,7 @@ class JQueryJqGrid(forms.RadioSelect): else: continue col_names.append(u'"%s"' % field_verbose_name) - extra_cols.append(self.COL_TPL % {'idx':field_name}) + extra_cols.append(self.COL_TPL % {'idx': field_name}) col_names = col_names and ", ".join(col_names) or "" col_idx = col_idx and ", ".join(col_idx) or "" extra_cols = extra_cols and ", ".join(extra_cols) or "" @@ -544,19 +563,18 @@ class JQueryJqGrid(forms.RadioSelect): dct['source'] = unicode(self.source) if unicode(self.source_full) and unicode(self.source_full) != 'None': dct['source_full'] = unicode(self.source_full) - dct.update({'name':name, - 'col_names':col_names, - 'extra_cols':extra_cols, - 'source':unicode(self.source), - 'col_idx':col_idx, - 'no_result':unicode(_("No results")), - 'loading':unicode(_("Loading...")), - 'remove':unicode(_(u"Remove")), - 'sname':name.replace('-', ''), - 'multiple':self.multiple, - 'multi_cols': ",".join((u'"%d"' % col \ - for col in self.multiple_cols)) - }) + dct.update({'name': name, + 'col_names': col_names, + 'extra_cols': extra_cols, + 'source': unicode(self.source), + 'col_idx': col_idx, + 'no_result': unicode(_("No results")), + 'loading': unicode(_("Loading...")), + 'remove': unicode(_(u"Remove")), + 'sname': name.replace('-', ''), + 'multiple': self.multiple, + 'multi_cols': ",".join((u'"%d"' % col + for col in self.multiple_cols))}) t = loader.get_template('blocks/JQueryJqGrid.html') rendered += t.render(Context(dct)) return mark_safe(rendered) |