--- /dev/null
+# 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)
+
+