init
This commit is contained in:
2
files_widget/forms/__init__.py
Normal file
2
files_widget/forms/__init__.py
Normal file
@@ -0,0 +1,2 @@
|
||||
from .fields import *
|
||||
from .widgets import *
|
||||
62
files_widget/forms/fields.py
Normal file
62
files_widget/forms/fields.py
Normal file
@@ -0,0 +1,62 @@
|
||||
from django import forms
|
||||
from django.core import exceptions, validators
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
import six
|
||||
|
||||
from files_widget.conf import *
|
||||
|
||||
|
||||
class UnicodeWithAttr(six.text_type):
|
||||
deleted_files = None
|
||||
moved_files = None
|
||||
|
||||
class FilesFormField(forms.MultiValueField):
|
||||
def __init__(self, max_length=None, **kwargs):
|
||||
super(FilesFormField, self).__init__(**kwargs)
|
||||
|
||||
def compress(self, data_list):
|
||||
files = UnicodeWithAttr(data_list[0])
|
||||
files.deleted_files = data_list[1]
|
||||
files.moved_files = data_list[2]
|
||||
return files
|
||||
|
||||
def clean(self, value):
|
||||
"""
|
||||
This is a copy of MultiValueField.clean() with a BUGFIX:
|
||||
- if self.required and field_value in validators.EMPTY_VALUES:
|
||||
+ if field.required and field_value in validators.EMPTY_VALUES:
|
||||
"""
|
||||
from django.forms.utils import ErrorList
|
||||
from django.core.exceptions import ValidationError
|
||||
|
||||
clean_data = []
|
||||
errors = ErrorList()
|
||||
if not value or isinstance(value, (list, tuple)):
|
||||
if not value or not [v for v in value if v not in validators.EMPTY_VALUES]:
|
||||
if self.required:
|
||||
raise ValidationError(self.error_messages['required'])
|
||||
else:
|
||||
return self.compress(value)
|
||||
else:
|
||||
raise ValidationError(self.error_messages['invalid'])
|
||||
for i, field in enumerate(self.fields):
|
||||
try:
|
||||
field_value = value[i]
|
||||
except IndexError:
|
||||
field_value = None
|
||||
if field.required and field_value in validators.EMPTY_VALUES:
|
||||
raise ValidationError(self.error_messages['required'])
|
||||
try:
|
||||
clean_data.append(field.clean(field_value))
|
||||
except ValidationError as e:
|
||||
# Collect all validation errors in a single list, which we'll
|
||||
# raise at the end of clean(), rather than raising a single
|
||||
# exception for the first error we encounter.
|
||||
errors.extend(e.messages)
|
||||
if errors:
|
||||
raise ValidationError(errors)
|
||||
|
||||
out = self.compress(clean_data)
|
||||
self.validate(out)
|
||||
self.run_validators(out)
|
||||
return out
|
||||
100
files_widget/forms/widgets.py
Normal file
100
files_widget/forms/widgets.py
Normal file
@@ -0,0 +1,100 @@
|
||||
from django import forms
|
||||
from django.conf import settings
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
from files_widget.conf import *
|
||||
|
||||
|
||||
def use_filebrowser():
|
||||
if USE_FILEBROWSER:
|
||||
try:
|
||||
import filebrowser
|
||||
return True
|
||||
except:
|
||||
try:
|
||||
import filebrowser_safe
|
||||
return True
|
||||
except:
|
||||
pass
|
||||
pass
|
||||
return False
|
||||
|
||||
TO_HIDE_ATTRS = {'class': 'hidden'}
|
||||
class BaseFilesWidget(forms.MultiWidget):
|
||||
def __init__(self,
|
||||
multiple=False,
|
||||
preview_size=150,
|
||||
template="files_widget/files_widget.html",
|
||||
widgets=(forms.HiddenInput,
|
||||
forms.HiddenInput,
|
||||
forms.HiddenInput),
|
||||
**kwargs):
|
||||
super(BaseFilesWidget, self).__init__(widgets, **kwargs)
|
||||
self.multiple = multiple
|
||||
self.preview_size = preview_size
|
||||
self.template = template
|
||||
|
||||
class Media:
|
||||
js = [
|
||||
JQUERY_PATH,
|
||||
JQUERY_UI_PATH,
|
||||
'files_widget/js/jquery.iframe-transport.js',
|
||||
'files_widget/js/jquery.fileupload.js',
|
||||
'files_widget/js/widgets.js',
|
||||
]
|
||||
if use_filebrowser():
|
||||
js.append(FILEBROWSER_JS_PATH)
|
||||
|
||||
css = {
|
||||
'all': (
|
||||
'files_widget/css/widgets.css',
|
||||
),
|
||||
}
|
||||
|
||||
@property
|
||||
def is_hidden(self):
|
||||
return False
|
||||
|
||||
def decompress(self, value):
|
||||
if value:
|
||||
return [value, '', '', ]
|
||||
return ['', '', '', ]
|
||||
|
||||
def render(self, name, value, attrs=None, renderer=None):
|
||||
if not isinstance(value, list):
|
||||
value = self.decompress(value)
|
||||
files, deleted_files, moved_files = value
|
||||
|
||||
context = {
|
||||
'MEDIA_URL': settings.MEDIA_URL,
|
||||
'STATIC_URL': settings.STATIC_URL,
|
||||
'use_filebrowser': use_filebrowser(),
|
||||
'add_image_by_url': ADD_IMAGE_BY_URL,
|
||||
'input_string': super(BaseFilesWidget, self).render(name, value, attrs, renderer),
|
||||
'name': name,
|
||||
'files': files,
|
||||
'deleted_files': deleted_files,
|
||||
'multiple': self.multiple and 1 or 0,
|
||||
'preview_size': str(self.preview_size),
|
||||
}
|
||||
return renderer.render(self.template, context)
|
||||
|
||||
|
||||
class FileWidget(BaseFilesWidget):
|
||||
def __init__(self, multiple=False, preview_size=128, **kwargs):
|
||||
super(FileWidget, self).__init__(multiple, preview_size, template="files_widget/files_widget.html", **kwargs)
|
||||
|
||||
|
||||
class FilesWidget(BaseFilesWidget):
|
||||
def __init__(self, multiple=True, preview_size=64, **kwargs):
|
||||
super(FilesWidget, self).__init__(multiple, preview_size, template="files_widget/files_widget.html", **kwargs)
|
||||
|
||||
|
||||
class ImageWidget(BaseFilesWidget):
|
||||
def __init__(self, multiple=False, preview_size=250, **kwargs):
|
||||
super(ImageWidget, self).__init__(multiple, preview_size, template="files_widget/images_widget.html", **kwargs)
|
||||
|
||||
|
||||
class ImagesWidget(BaseFilesWidget):
|
||||
def __init__(self, multiple=True, preview_size=150, **kwargs):
|
||||
super(ImagesWidget, self).__init__(multiple, preview_size, template="files_widget/images_widget.html", **kwargs)
|
||||
Reference in New Issue
Block a user