# -*- coding: utf-8 -*-
__author__ = 'marcos.medeiros'
from django.forms import widgets
from django.template import loader, Context
from rapid.wrappers import ModelData, InstanceData
class RapidReadOnly(widgets.Widget):
def __init__(self, *args, **kwargs):
super(RapidReadOnly, self).__init__(*args, **kwargs)
def render(self, name, value, attrs=None):
hidden = ''
return '%s%s\n' % (unicode(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 = ''
if hasattr(value, '__iter__'):
objs = self.model.default_manager().filter(pk__in=value)
ret = ''
for o in objs:
ret += '%s\n' % unicode(o)
ret += hidden
return ret
else:
obj = self.model.default_manager().get(pk=value)
return '%s%s\n' % (unicode(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=()):
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': 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('rapid/widgets/multiple-selector.html')
else:
t = loader.get_template('rapid/widgets/single-selector.html')
return t.render(c)
def value_from_datadict(self, data, files, name):
val = data.get(name)
print val
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