113 lines
3.9 KiB
Python
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)
|
|
|