diff options
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) | 
