|
| 1 | +# coding: utf-8 |
| 2 | + |
| 3 | +# PYTHON IMPORTS |
| 4 | +import os |
| 5 | + |
| 6 | +# DJANGO IMPORTS |
| 7 | +from django.core import urlresolvers |
| 8 | +from django.db import models |
| 9 | +from django.db.models.fields import CharField |
| 10 | +from django import forms |
| 11 | +from django.forms.widgets import Input |
| 12 | +from django.template.loader import render_to_string |
| 13 | +from django.utils.six import with_metaclass |
| 14 | +from django.utils.translation import ugettext_lazy as _ |
| 15 | +from django.contrib.admin.templatetags.admin_static import static |
| 16 | + |
| 17 | +# FILEBROWSER IMPORTS |
| 18 | +from filebrowser.settings import UPLOAD_TEMPDIR, ADMIN_THUMBNAIL, EXTENSIONS |
| 19 | +from filebrowser.base import FileObject |
| 20 | +from filebrowser.sites import site |
| 21 | + |
| 22 | + |
| 23 | +class FileBrowseAndUploadWidget(Input): |
| 24 | + input_type = 'text' |
| 25 | + |
| 26 | + class Media: |
| 27 | + js = ( |
| 28 | + 'filebrowser/js/AddFileBrowser.js', |
| 29 | + 'filebrowser/js/fileuploader.js', |
| 30 | + ) |
| 31 | + css = { |
| 32 | + 'all': (os.path.join('/static/filebrowser/css/uploadfield.css'),) |
| 33 | + } |
| 34 | + |
| 35 | + def __init__(self, attrs=None): |
| 36 | + super(FileBrowseAndUploadWidget, self).__init__(attrs) |
| 37 | + self.site = attrs.get('filebrowser_site', '') |
| 38 | + self.directory = attrs.get('directory', '') |
| 39 | + self.extensions = attrs.get('extensions', '') |
| 40 | + self.format = attrs.get('format', '') |
| 41 | + self.upload_to = attrs.get('upload_to', '') |
| 42 | + self.temp_upload_dir = attrs.get('temp_upload_dir', '') |
| 43 | + if attrs is not None: |
| 44 | + self.attrs = attrs.copy() |
| 45 | + else: |
| 46 | + self.attrs = {} |
| 47 | + super(FileBrowseAndUploadWidget, self).__init__(attrs) |
| 48 | + |
| 49 | + def render(self, name, value, attrs=None): |
| 50 | + url = urlresolvers.reverse(self.site.name + ":fb_browse") |
| 51 | + if value is None: |
| 52 | + value = "" |
| 53 | + if value != "" and not isinstance(value, FileObject): |
| 54 | + value = FileObject(value, site=self.site) |
| 55 | + final_attrs = self.build_attrs(attrs, type=self.input_type, name=name) |
| 56 | + final_attrs['search_icon'] = static('filebrowser/img/filebrowser_icon_show.gif') |
| 57 | + final_attrs['url'] = url |
| 58 | + final_attrs['directory'] = self.directory |
| 59 | + final_attrs['extensions'] = self.extensions |
| 60 | + final_attrs['format'] = self.format |
| 61 | + final_attrs['upload_to'] = self.upload_to |
| 62 | + final_attrs['temp_upload_dir'] = UPLOAD_TEMPDIR |
| 63 | + final_attrs['ADMIN_THUMBNAIL'] = ADMIN_THUMBNAIL |
| 64 | + filebrowser_site = self.site |
| 65 | + if value != "": |
| 66 | + try: |
| 67 | + final_attrs['directory'] = os.path.split(value.original.path_relative_directory)[0] |
| 68 | + except: |
| 69 | + pass |
| 70 | + return render_to_string("filebrowser/custom_browse_and_upload_field.html", locals()) |
| 71 | + |
| 72 | + |
| 73 | +class FileBrowseAndUploadFormField(forms.CharField): |
| 74 | + |
| 75 | + default_error_messages = { |
| 76 | + 'extension': _(u'Extension %(ext)s is not allowed. Only %(allowed)s is allowed.'), |
| 77 | + } |
| 78 | + |
| 79 | + def __init__(self, max_length=None, min_length=None, site=None, directory=None, extensions=None, format=None, upload_to=None, temp_upload_dir=None, *args, **kwargs): |
| 80 | + self.max_length, self.min_length = max_length, min_length |
| 81 | + self.site = kwargs.pop('filebrowser_site', site) |
| 82 | + self.directory = directory |
| 83 | + self.extensions = extensions |
| 84 | + if format: |
| 85 | + self.format = format or '' |
| 86 | + self.extensions = extensions or EXTENSIONS.get(format) |
| 87 | + self.upload_to = upload_to |
| 88 | + self.temp_upload_dir = temp_upload_dir |
| 89 | + super(FileBrowseAndUploadFormField, self).__init__(*args, **kwargs) |
| 90 | + |
| 91 | + def clean(self, value): |
| 92 | + value = super(FileBrowseAndUploadFormField, self).clean(value) |
| 93 | + if value == '': |
| 94 | + return value |
| 95 | + file_extension = os.path.splitext(value)[1].lower() |
| 96 | + if self.extensions and file_extension not in self.extensions: |
| 97 | + raise forms.ValidationError(self.error_messages['extension'] % {'ext': file_extension, 'allowed': ", ".join(self.extensions)}) |
| 98 | + return value |
| 99 | + |
| 100 | + |
| 101 | +class FileBrowseAndUploadField(with_metaclass(models.SubfieldBase, CharField)): |
| 102 | + |
| 103 | + description = "FileBrowseAndUploadField" |
| 104 | + |
| 105 | + def __init__(self, *args, **kwargs): |
| 106 | + self.site = kwargs.pop('filebrowser_site', site) |
| 107 | + self.directory = kwargs.pop('directory', '') |
| 108 | + self.extensions = kwargs.pop('extensions', '') |
| 109 | + self.format = kwargs.pop('format', '') |
| 110 | + self.upload_to = kwargs.pop('upload_to', '') |
| 111 | + self.temp_upload_dir = kwargs.pop('temp_upload_dir', '') |
| 112 | + return super(FileBrowseAndUploadField, self).__init__(*args, **kwargs) |
| 113 | + |
| 114 | + def to_python(self, value): |
| 115 | + if not value or isinstance(value, FileObject): |
| 116 | + return value |
| 117 | + return FileObject(value, site=self.site) |
| 118 | + |
| 119 | + def get_db_prep_value(self, value, connection, prepared=False): |
| 120 | + if not value: |
| 121 | + return value |
| 122 | + return value.path |
| 123 | + |
| 124 | + def get_prep_value(self, value): |
| 125 | + if not value: |
| 126 | + return value |
| 127 | + return value.path |
| 128 | + |
| 129 | + def value_to_string(self, obj): |
| 130 | + value = self._get_val_from_obj(obj) |
| 131 | + if not value: |
| 132 | + return value |
| 133 | + return value.path |
| 134 | + |
| 135 | + def formfield(self, **kwargs): |
| 136 | + attrs = {} |
| 137 | + attrs["filebrowser_site"] = self.site |
| 138 | + attrs["directory"] = self.directory |
| 139 | + attrs["extensions"] = self.extensions |
| 140 | + attrs["format"] = self.format |
| 141 | + attrs["upload_to"] = self.upload_to |
| 142 | + attrs["temp_upload_dir"] = self.temp_upload_dir |
| 143 | + defaults = { |
| 144 | + 'form_class': FileBrowseAndUploadFormField, |
| 145 | + 'widget': FileBrowseAndUploadWidget(attrs=attrs), |
| 146 | + 'filebrowser_site': self.site, |
| 147 | + 'directory': self.directory, |
| 148 | + 'extensions': self.extensions, |
| 149 | + 'format': self.format, |
| 150 | + 'upload_to': self.upload_to, |
| 151 | + 'temp_upload_dir': self.temp_upload_dir |
| 152 | + } |
| 153 | + return super(FileBrowseAndUploadField, self).formfield(**defaults) |
| 154 | + |
| 155 | + |
| 156 | +try: |
| 157 | + from south.modelsinspector import add_introspection_rules |
| 158 | + add_introspection_rules([], ["^filebrowser\.fields\.FileBrowseAndUploadField"]) |
| 159 | +except: |
| 160 | + pass |
0 commit comments