# $Id: ReadOnlyWidget.py 487 2009-08-12 09:01:09Z tguettler $
# $HeadURL: svn+ssh://svnserver/svn/djangotools/trunk/widgets/ReadOnlyWidget.py $

# This is http://www.djangosnippets.org/snippets/1682/
# based on http://www.djangosnippets.org/snippets/937/

from django import forms
from django.db import models
empty_magic=object()
class ReadOnlyWidget(forms.Widget):
    u'''
    Usage1: foo_field.widget=ReadOnlyWidget(mystring)
    Usage2: ReadOnlyWidget(myint, my_display_string)
    Usage3: ReadOnylWidget(form=myform, field_name='foo')
    '''
    def __init__(self, original_value=empty_magic, display_value=None, form=None, name=None):
        if original_value is empty_magic:
            assert form and name
            field=form.fields[name]
            original_value = form.initial.get(name, field.initial)
            if callable(original_value):
                original_value = original_value()
            if isinstance(field, forms.ChoiceField):
                for v, display in field.choices:
                    if v==original_value:
                        display_value=display
                        break
        else:
            assert not (form or name)
        if display_value is None:
            if original_value is None:
                display_value=u''
            else:
                display_value=original_value
        if isinstance(original_value, models.Model):
            original_value=original_value.pk
        self.original_value = original_value
        self.display_value = display_value

        super(ReadOnlyWidget, self).__init__()

    def render(self, name, value, attrs=None):
        if self.display_value is not None:
            if not isinstance(self.display_value, basestring):
                return unicode(self.display_value)
            return self.display_value
        return unicode(self.original_value)

    def value_from_datadict(self, data, files, name):
        return self.original_value