datatracker/form_utils/widgets.py

113 lines
3.9 KiB
Python

"""
widgets for django-form-utils
parts of this code taken from http://www.djangosnippets.org/snippets/934/
- thanks baumer1122
"""
import os
import posixpath
from django import forms
from django.conf import settings
from django.utils.functional import curry
from django.utils.safestring import mark_safe
from django.core.files.uploadedfile import SimpleUploadedFile as UploadedFile
from form_utils.settings import JQUERY_URL, FORM_UTILS_MEDIA_URL
try:
from sorl.thumbnail.main import DjangoThumbnail
def thumbnail(image_path, width, height):
t = DjangoThumbnail(relative_source=image_path, requested_size=(width,height))
return u'<img src="%s" alt="%s" />' % (t.absolute_url, image_path)
except ImportError:
def thumbnail(image_path, width, height):
absolute_url = posixpath.join(settings.MEDIA_URL, image_path)
return u'<img src="%s" alt="%s" />' % (absolute_url, image_path)
class ImageWidget(forms.FileInput):
template = '%(input)s<br />%(image)s'
def __init__(self, attrs=None, template=None, width=200, height=200):
if template is not None:
self.template = template
self.width = width
self.height = height
super(ImageWidget, self).__init__(attrs)
def render(self, name, value, attrs=None):
input_html = super(forms.FileInput, self).render(name, value, attrs)
if hasattr(value, 'width') and hasattr(value, 'height'):
image_html = thumbnail(value.name, self.width, self.height)
output = self.template % {'input': input_html,
'image': image_html}
else:
output = input_html
return mark_safe(output)
class ClearableFileInput(forms.MultiWidget):
default_file_widget_class = forms.FileInput
template = '%(input)s Clear: %(checkbox)s'
def __init__(self, file_widget=None,
attrs=None, template=None):
if template is not None:
self.template = template
file_widget = file_widget or self.default_file_widget_class()
super(ClearableFileInput, self).__init__(
widgets=[file_widget, forms.CheckboxInput()],
attrs=attrs)
def render(self, name, value, attrs=None):
if isinstance(value, list):
self.value = value[0]
else:
self.value = value
return super(ClearableFileInput, self).render(name, value, attrs)
def decompress(self, value):
# the clear checkbox is never initially checked
return [value, None]
def format_output(self, rendered_widgets):
if self.value:
return self.template % {'input': rendered_widgets[0],
'checkbox': rendered_widgets[1]}
return rendered_widgets[0]
root = lambda path: posixpath.join(FORM_UTILS_MEDIA_URL, path)
class AutoResizeTextarea(forms.Textarea):
"""
A Textarea widget that automatically resizes to accomodate its contents.
"""
class Media:
js = (JQUERY_URL,
root('form_utils/js/jquery.autogrow.js'),
root('form_utils/js/autoresize.js'))
def __init__(self, *args, **kwargs):
attrs = kwargs.setdefault('attrs', {})
try:
attrs['class'] = "%s autoresize" % (attrs['class'],)
except KeyError:
attrs['class'] = 'autoresize'
attrs.setdefault('cols', 80)
attrs.setdefault('rows', 5)
super(AutoResizeTextarea, self).__init__(*args, **kwargs)
class InlineAutoResizeTextarea(AutoResizeTextarea):
def __init__(self, *args, **kwargs):
attrs = kwargs.setdefault('attrs', {})
try:
attrs['class'] = "%s inline" % (attrs['class'],)
except KeyError:
attrs['class'] = 'inline'
attrs.setdefault('cols', 40)
attrs.setdefault('rows', 2)
super(InlineAutoResizeTextarea, self).__init__(*args, **kwargs)