summaryrefslogtreecommitdiff
path: root/ishtar_common/widgets.py
diff options
context:
space:
mode:
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
commitab53d8cfdcfbbaff8cc5b6bc0e44ee923485d9bb (patch)
tree840ab617f2927fec8143f6005cfd2d498d1c738f /ishtar_common/widgets.py
parentb4a8dcb2836c202edf250c9953327a9ca5280004 (diff)
downloadIshtar-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.py178
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)