diff options
Diffstat (limited to 'ishtar_common/widgets.py')
| -rw-r--r-- | ishtar_common/widgets.py | 204 | 
1 files changed, 202 insertions, 2 deletions
| diff --git a/ishtar_common/widgets.py b/ishtar_common/widgets.py index 0ba4061a8..ba7e61e46 100644 --- a/ishtar_common/widgets.py +++ b/ishtar_common/widgets.py @@ -26,6 +26,7 @@ from django.db.models import fields  from django.forms import ClearableFileInput  from django.forms.widgets import flatatt  from django.template import Context, 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 @@ -33,7 +34,7 @@ from django.utils.safestring import mark_safe  from django.utils.simplejson import JSONEncoder  from django.utils.translation import ugettext_lazy as _ -import models +from ishtar_common import models  reverse_lazy = lazy(reverse, unicode) @@ -203,7 +204,7 @@ class JQueryAutoComplete(forms.TextInput):              except:                  raise ValueError('source type is not valid')          dct = {'source':mark_safe(source), -               'field_id':field_id} +               'field_id':field_id,}          if self.options:              dct['options'] = mark_safe('%s' % self.options) @@ -218,6 +219,7 @@ class JQueryAutoComplete(forms.TextInput):      def render(self, name, value=None, attrs=None):          attrs_hidden = self.build_attrs(attrs, name=name)          attrs_select = self.build_attrs(attrs) +        attrs_select['placeholder'] = _(u"Search...")          if value:              hiddens = []              selects = [] @@ -281,6 +283,204 @@ class JQueryAutoComplete(forms.TextInput):          }          return html +class JQueryTown(forms.TextInput): +    """ +    Town fields whith state and department pre-selections +    """ + +    def __init__(self, source, options={}, +                 attrs={}, new=False, limit={}): +        self.options = None +        self.attrs = {} +        self.source = source +        if len(options) > 0: +            self.options = JSONEncoder().encode(options) +        self.attrs.update(attrs) +        self.new = new +        self.limit = limit + +    @classmethod +    def encode_source(cls, source): +        encoded_src = '' +        if isinstance(source, list): +            encoded_src = JSONEncoder().encode(source) +        elif isinstance(source, str) \ +           or isinstance(source, unicode): +            src = escape(source) +            if not src.endswith('/'): +                src += "/" +            encoded_src = "'%s'" % src +        else: +            try: +                src = unicode(source) +                if not src.endswith('/'): +                    src += "/" +                encoded_src = "'%s'" % src +            except: +                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) +        attrs_select = self.build_attrs(attrs) +        attrs_select['placeholder'] = _(u"Search...") +        selected = '' +        selected_state = '' +        selected_department = '' +        if value: +            hiddens = [] +            selects = [] +            if type(value) not in (list, tuple): +                values = unicode(escape(smart_unicode(value))) +                values = values.replace('[', '').replace(']', '') +                values = values.split(',') +            else: +                values = [] +                for v in value: +                    values += v.split(',') +            for v in values: +                if not v: +                    continue +                hiddens.append(v) +                selects.append(v) +                try: +                    item = models.Town.objects.get(pk=v) +                    selects[-1] = unicode(item) +                    if item.departement: +                        selected_department = item.departement.number +                        if item.departement.state: +                            selected_state = item.departement.state.number +                    selected = item.pk +                except (models.Town.DoesNotExist, ValueError): +                    selects.pop() +                    hiddens.pop() +            if hiddens and selects: +                attrs_hidden['value'] = hiddens[0] +                attrs_select['value'] = selects[0] +        if not self.attrs.has_key('id'): +            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} +        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)) +        return html + +class JQueryPersonOrganization(forms.TextInput): +    """ +    Complex widget which manage: +     * link between person and organization +     * display addresses of the person and of the organization +     * create new person and new organization +    """ + +    def __init__(self, source, edit_source, model, options={}, +                 attrs={}, new=False, limit={}, +                 html_template = 'blocks/PersonOrganization.html', +                 js_template='blocks/JQueryPersonOrganization.js'): +        self.options = None +        self.attrs = {} +        self.model = model +        self.source = source +        self.edit_source = edit_source +        if len(options) > 0: +            self.options = JSONEncoder().encode(options) +        self.attrs.update(attrs) +        self.new = new +        self.limit = limit +        self.js_template = js_template +        self.html_template = html_template + +    @classmethod +    def encode_source(cls, source): +        encoded_src = '' +        if isinstance(source, list): +            encoded_src = JSONEncoder().encode(source) +        elif isinstance(source, str) \ +           or isinstance(source, unicode): +            encoded_src = "'%s'" % escape(source) +        else: +            try: +                encoded_src = "'" + unicode(source) + "'" +            except: +                raise ValueError('source type is not valid') +        return encoded_src + +    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} +        if self.options: +            dct['options'] = mark_safe('%s' % self.options) +        js = loader.get_template(self.js_template).render(Context(dct)) +        return js + +    def render(self, name, value=None, attrs=None): +        attrs_hidden = self.build_attrs(attrs, name=name) +        attrs_select = self.build_attrs(attrs) +        attrs_select['placeholder'] = _(u"Search...") +        selected = '' +        if value: +            hiddens = [] +            selects = [] +            if type(value) not in (list, tuple): +                values = unicode(escape(smart_unicode(value))) +                values = values.replace('[', '').replace(']', '') +                values = values.split(',') +            else: +                values = [] +                for v in value: +                    values += v.split(',') +            for v in values: +                if not v: +                    continue +                hiddens.append(v) +                selects.append(v) +                if self.model: +                    try: +                        item = self.model.objects.get(pk=v) +                        selects[-1] = unicode(item) +                        selected = item.pk +                    except (self.model.DoesNotExist, ValueError): +                        selects.pop() +                        hiddens.pop() +            if hiddens and selects: +                attrs_hidden['value'] = hiddens[0] +                attrs_select['value'] = selects[0] +        if not self.attrs.has_key('id'): +            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)} +        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: | 
