from django.utils.safestring import mark_safe
import copy
from django.template import Context, loader
import datetime
from django.utils.encoding import force_unicode
from itertools import chain
try:
#just for check version of Django
from django.forms import Manipulator as _OldManipulator
from django import newforms as forms
except ImportError:
from django import forms
class TextInputPopup(forms.TextInput):
def __init__(self, url,frame_id='popup_div',*args, **kwargs):
attrs = kwargs.setdefault('attrs',{})
if 'onkeyup' not in attrs:
attrs.update({'onkeyup': mark_safe("textinput_popup_keyup(this,'%s','%s');"%(url,frame_id))})
attrs.update({'autocomplete': 'off'})
super(TextInputPopup, self).__init__(*args, **kwargs)
def render(self, name, value, attrs=None):
return super(TextInputPopup, self).render(name, value, attrs)
class DateWidget(forms.TextInput):
def __init__(self,attrs=None, format=None):
super(DateWidget,self).__init__(attrs)
self.format = format
def render(self, name, value, attrs=None):
if self.format and isinstance(value,datetime.date):
value = value.strftime(self.format)
return super(DateWidget,self).render(name, value, attrs)
class FormWidget(forms.Widget):
def __init__(self,subform=None,template = None, attrs=None,buttons=None):
self.template = template or 'forms/form_widget.html'
self.buttons = buttons or []
if isinstance(subform, type):
subform = subform()
self.subform = subform
super(FormWidget, self).__init__(attrs)
def render(self, name, value, attrs=None):
subform = copy.deepcopy(self.subform)
data = {}
if value is not None:
data = value
subform.is_bound = True
subform.inital = {}
subform.data = data
template = self.template
if hasattr(subform,'template'):
template = subform.template
template = loader.get_template(template)
return template.render(Context({'widget': self,
'subform': subform,
}))
def value_from_datadict(self, data, files, name):
value = dict()
if data.has_key(name):
[ value.update( {"%s-%s"%(name,k): v } ) for k,v in data[name].iteritems() ]
return value
value = dict()
[ k.startswith(self.subform.prefix) and value.update( {k: v[0]} ) for k,v in data.iteritems() ]
for k,v in value.iteritems():
if v in forms.fields.EMPTY_VALUES:
value[k]= None
return value
class RangeWidget(forms.MultiWidget):
def __init__(self,attrs=None):
widgets = (forms.TextInput(attrs=attrs), forms.TextInput(attrs=attrs))
super(RangeWidget, self).__init__(widgets, attrs)
def decompress(self, value):
if value:
return [value[0], value[1]]
return [None, None]
class LabelWidget(forms.Select):
def render(self, name, value, attrs=None, choices=()):
if value is None: value = ''
final_attrs = self.build_attrs(attrs, type="text", name=name)
if value != '':
# Only add the 'value' attribute if a value is non-empty.
final_attrs['value'] = force_unicode(value)
final_attrs['type'] = 'hidden'
out_str = u'%s'%(value)
if len(self.choices) > 0:
for option_value, option_label in chain(self.choices, choices):
if option_value == value:
out_str = u'%s'%(option_label)
break
out_str += u''%(forms.util.flatatt(final_attrs))
return mark_safe(out_str)
##
# Hologramm widget used for execute AJAX request to the server
# and after success responce with Key_ID, retrieve image from the server
#
# Argument:
# jsfunction - name of the javascript function;
# this function will calling with next arguments:
# fields_id - ID of hidden field where need to
# store request ID
# image_id - ID of target image
#
# "jsfunction" will calling after page load with Mochikit function
#
class Hologramm(forms.Widget):
input_type = 'hologram'
def __init__(self, jsfunction, default_img='', attrs=None):
self.jsfunction = jsfunction
self.default_img = default_img
super(Hologramm, self).__init__(attrs)
def render(self, name, value, attrs=None):
if value is None: value = ''
final_attrs = self.build_attrs(attrs, type=self.input_type, name=name)
if value != '':
# Only add the 'value' attribute if a value is non-empty.
final_attrs['value'] = force_unicode(value)
# print final_attrs
final_attrs['type'] = 'hidden'
out_str = u''%(forms.util.flatatt(final_attrs))
out_str += u""%(
final_attrs['id'],
self.default_img,
self.jsfunction,
final_attrs['id'],
final_attrs['id'],
value,
)
return mark_safe(out_str)
class SelectOrAdd(forms.Select):
def __init__(self, attrs=None, choices=(), onclick=None, img=None):
super(SelectOrAdd, self).__init__(attrs, choices)
self._img = img or '/s/img/16x16/add.png'
self._onclick = onclick or 'select_or_add';
def render(self, name, value, attrs=None, choices=()):
rc = super(SelectOrAdd, self).render(name, value, attrs, choices)
img = u''%(self._onclick,
name,
self._img)
return rc + mark_safe(img)