All pastes #2072754 Raw Edit

Unnamed

public python v1 · immutable
#2072754 ·published 2011-05-31 13:31 UTC
rendered paste body
class 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)}        <input {{ flat_att|safe }} type='text' value='{% if value %}#{{ value }}{% endif %}' />{% if not skip_display_span %}<span id='display_{{ name }}' class='inline-colour' {% if value %}style='background-color: #{{ value }};'{% else %}style='display: none;'{% endif %} />{% endif %}        <script type='text/javascript'>            window.addEvent("domready", function(ev) {                var el = document.body.getElement("input[name={{ name }}]");                el.store(                    'colourpicker', new MooRainbow(el, {                        'id': 'picker{{ name }}',                        'imgPath': STATIC_URL+'images/mooRainbow/',                        'startColor': [{{ rgb_value.0 }}, {{ rgb_value.1 }}, {{ rgb_value.2 }}],                        'onComplete': function(val) {                            el.set('value', val.hex);                            var next = el.getNext("#display_{{ name }}");                            console.log(next);                            if(next) {                                next.setStyle("background-color", val.hex);                                next.setStyle("display", "");                            }                        }                       })                );                el.addEvent('keyup', function(ev) {                    if (el.get('value').length == 7) {                        el.retrieve('colourpicker').hexInput.set('value', el.get('value'));                        el.retrieve('colourpicker').hexInput.fireEvent('keyup', [el, ev]);                    }                });                el.addEvent('change', function(ev) {                    if (el.get('value').length == 7) {                        el.retrieve('colourpicker').hexInput.set('value', el.get('value'));                        el.retrieve('colourpicker').hexInput.fireEvent('keyup', [el, ev]);                    }                });            });        </script>