rendered paste bodyclass HexColourPicker(TextInput):
def __init__(self, attrs=None,
template='forms/widgets/hex_colourpicker.html'):
super(TextInput, self).__init__(attrs)
self.template = template
def render(self, name, value, attrs=None, choices=()):
if value is None: value = ''
elif len(value) > 0 and value[0] == '#': value = value[1:]
final_attrs = self.build_attrs(attrs, name=name)
flat_att = forms.util.flatatt(final_attrs)
output = render_to_string(self.template, {
'name': name,
'value': value,
'rgb_value': HexColourField.hex_to_rgb(value) \
if value else HexColourField.hex_to_rgb('#FFFFFF'),
'final_attrs': final_attrs,
'flat_att': flat_att,
})
return mark_safe(output)
class HexColourField(fields.Field):
widget = HexColourPicker
default_error_messages = {
'hex_error': _('This is an invalid color code. '+\
'It must be given in a valid hexadecimal format: e.g. #000000')
}
@staticmethod
def hex_to_rgb(value):
if value[0] == '#': value = value[1:]
return (int('0x%s' % value[0:2], 0),
int('0x%s' % value[2:4], 0), int('0x%s' % value[4:6], 0))
def clean(self, value):
super(HexColourField, self).clean(value)
if value in fields.EMPTY_VALUES:
return u''
value = smart_unicode(value)
value_length = len(value)
if value_length != 7 or not re.match(
'^\#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$', value):
raise ValidationError(self.error_messages['hex_error'])
return value.lower( )[1:]
def widget_attrs(self, widget):
if isinstance(widget, (fields.TextInput)) or \
isinstance(widget, (HexColourPicker)):
return {'maxlength': str(7), 'size': str(7)}