123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132 |
- # -*- coding: utf-8 -*-
- from __future__ import absolute_import
- from __future__ import division
- from __future__ import print_function
- from __future__ import unicode_literals
- from django.forms import widgets
- from django.template import loader, Context
- from django.utils.encoding import force_text
- from rapid.wrappers import ModelData
- _templates_root = 'rapid/widgets/'
- class RapidReadOnly(widgets.Widget):
- def render(self, name, value, attrs=None):
- hidden = '<input type="hidden" name="%s" value="%s" ' % (name, value)
- for a in attrs.keys():
- hidden += '%s="%s" ' % (a, attrs[a])
- hidden += '>'
- return '<span class="data-value">%s</span>%s\n' % (force_text(value), hidden)
- def value_from_datadict(self, data, files, name):
- return data[name]
- class RapidRelationReadOnly(widgets.Widget):
- def __init__(self, model, *args, **kwargs):
- super(RapidRelationReadOnly, self).__init__(*args, **kwargs)
- self.model = ModelData(model)
- def render(self, name, value, attrs=None):
- hidden = '<input type="hidden" name="%s" value="%s" ' % (name, value)
- for a in attrs.keys():
- hidden += '%s="%s" ' % (a, attrs[a])
- hidden += '>'
- if hasattr(value, '__iter__'):
- obj = self.model.default_manager().filter(pk__in=value)
- ret = ''
- for o in obj:
- ret += '<span class="data-value multiple">%s</span>\n' % force_text(o)
- ret += hidden
- return ret
- else:
- obj = self.model.default_manager().get(pk=value)
- return '<span class="data-value">%s</span>%s\n' % (force_text(obj), hidden)
- def value_from_datadict(self, data, files, name):
- return data[name]
- class RapidSelector(widgets.Select):
- """
- Selects one of the target crud type.
- For ForeignKeyFields and OneToOneFields.
- If the target is dependent (that means, has only
- value when linked with this object), only displays
- an edition link.
- """
- def __init__(self, relation, *args, **kwargs):
- super(RapidSelector, self).__init__(*args, **kwargs)
- self.relation = relation
- self.allow_multiple_selected = relation.is_multiple()
- self.remove_deselected = relation.is_weak()
- def render(self, name, value, attrs=None, choices=()):
- tp_id = attrs.get('id', name)
- related = self.relation.related_model()
- if self.allow_multiple_selected:
- if value:
- v = ",".join([str(x) for x in value])
- selected = related.default_manager().filter(pk__in=value)
- else:
- v = ""
- selected = []
- else:
- if value:
- v = str(value)
- selected = related.default_manager().get(pk=value)
- else:
- v = ""
- selected = ""
- select_url = related.select_url()
- if self.allow_multiple_selected:
- icon = 'fa-times'
- if self.remove_deselected:
- icon = 'fa-trash-o'
- else:
- icon = 'fa-search'
- c = Context({'id': tp_id, 'name': name, 'value': v, 'selected': selected, 'icon': icon,
- 'select_url': select_url, 'multiple': self.allow_multiple_selected})
- if self.allow_multiple_selected:
- t = loader.get_template(_templates_root + 'multiple-selector.html')
- else:
- t = loader.get_template(_templates_root + 'single-selector.html')
- return t.render(c)
- def value_from_datadict(self, data, files, name):
- val = data.get(name)
- if self.allow_multiple_selected:
- if val:
- return [int(x) for x in val.split(",") if x]
- return []
- else:
- if val:
- return int(val)
- return None
- def rapid_alternatives_widget(alternatives, selector):
- class RapidAlternativeFormsWidget(widgets.Widget):
- def render(self, name, value, attrs=None):
- attrs = attrs if attrs else []
- c = Context({'name': name,
- 'value': value,
- 'attrs': attrs,
- 'alternatives': alternatives.values(),
- 'selector': selector,
- })
- t = loader.get_template(_templates_root + 'alternativeForms.html')
- return t.render(c)
- def value_from_datadict(self, data, files, name):
- ct_id = data.get(selector)
- if not ct_id:
- return None
- return alternatives.get(int(ct_id))[1]
- return RapidAlternativeFormsWidget
|