Dodanie aplikacji sorl.thumbnail i filebrowser.
[redakcja.git] / apps / filebrowser / fields.py
diff --git a/apps/filebrowser/fields.py b/apps/filebrowser/fields.py
new file mode 100644 (file)
index 0000000..85e981b
--- /dev/null
@@ -0,0 +1,121 @@
+# coding: utf-8
+
+import os
+
+# django imports
+from django.db import models
+from django import forms
+from django.forms.widgets import Input
+from django.db.models.fields import Field, CharField
+from django.utils.encoding import force_unicode
+from django.template.loader import render_to_string
+from django.utils.translation import ugettext_lazy as _
+
+# filebrowser imports
+from filebrowser.functions import _url_to_path, _dir_from_url, _get_version_path, _url_join
+from filebrowser.fb_settings import *
+from filebrowser.base import FileObject
+
+class FileBrowseWidget(Input):
+    input_type = 'text'
+    
+    class Media:
+        js = (os.path.join(URL_FILEBROWSER_MEDIA, 'js/AddFileBrowser.js'), )
+    
+    def __init__(self, attrs=None):
+        self.directory = attrs.get('directory', '')
+        self.extensions = attrs.get('extensions', '')
+        self.format = attrs.get('format', '')
+        if attrs is not None:
+            self.attrs = attrs.copy()
+        else:
+            self.attrs = {}
+    
+    def render(self, name, value, attrs=None):
+        if value is None:
+            value = ""
+        final_attrs = self.build_attrs(attrs, type=self.input_type, name=name)
+        final_attrs['search_icon'] = URL_FILEBROWSER_MEDIA + 'img/filebrowser_icon_show.gif'
+        final_attrs['directory'] = self.directory
+        final_attrs['extensions'] = self.extensions
+        final_attrs['format'] = self.format
+        final_attrs['ADMIN_THUMBNAIL'] = ADMIN_THUMBNAIL
+        final_attrs['DEBUG'] = DEBUG
+        if value != "":
+            try:
+                final_attrs['directory'] = os.path.split(value.path_relative_directory)[0]
+            except:
+                pass
+        return render_to_string("filebrowser/custom_field.html", locals())
+    
+
+class FileBrowseFormField(forms.CharField):
+    widget = FileBrowseWidget
+    
+    default_error_messages = {
+        'extension': _(u'Extension %(ext)s is not allowed. Only %(allowed)s is allowed.'),
+    }
+    
+    def __init__(self, max_length=None, min_length=None,
+                 directory=None, extensions=None, format=None,
+                 *args, **kwargs):
+        self.max_length, self.min_length = max_length, min_length
+        self.directory = directory
+        self.extensions = extensions
+        if format:
+            self.format = format or ''
+            self.extensions = extensions or EXTENSIONS.get(format)
+        super(FileBrowseFormField, self).__init__(*args, **kwargs)
+    
+    def clean(self, value):
+        value = super(FileBrowseFormField, self).clean(value)
+        if value == '':
+            return value
+        file_extension = os.path.splitext(value)[1].lower()
+        if self.extensions and not file_extension in self.extensions:
+            raise forms.ValidationError(self.error_messages['extension'] % {'ext': file_extension, 'allowed': ", ".join(self.extensions)})
+        return value
+    
+
+class FileBrowseField(Field):
+    __metaclass__ = models.SubfieldBase
+    
+    def __init__(self, *args, **kwargs):
+        self.directory = kwargs.pop('directory', '')
+        self.extensions = kwargs.pop('extensions', '')
+        self.format = kwargs.pop('format', '')
+        return super(FileBrowseField, self).__init__(*args, **kwargs)
+    
+    def to_python(self, value):
+        if not value or isinstance(value, FileObject):
+            return value
+        return FileObject(_url_to_path(value))
+    
+    def get_db_prep_value(self, value):
+        if value is None:
+            return None
+        return unicode(value)
+        
+    
+    def get_manipulator_field_objs(self):
+        return [oldforms.TextField]
+    
+    def get_internal_type(self):
+        return "CharField"
+    
+    def formfield(self, **kwargs):
+        attrs = {}
+        attrs["directory"] = self.directory
+        attrs["extensions"] = self.extensions
+        attrs["format"] = self.format
+        defaults = {
+            'form_class': FileBrowseFormField,
+            'widget': FileBrowseWidget(attrs=attrs),
+            'directory': self.directory,
+            'extensions': self.extensions,
+            'format': self.format
+        }
+        defaults.update(kwargs)
+        return super(FileBrowseField, self).formfield(**defaults)
+    
+