diff options
Diffstat (limited to 'app/lib/filebrowser/base.py')
-rw-r--r-- | app/lib/filebrowser/base.py | 219 |
1 files changed, 219 insertions, 0 deletions
diff --git a/app/lib/filebrowser/base.py b/app/lib/filebrowser/base.py new file mode 100644 index 0000000..1b60dce --- /dev/null +++ b/app/lib/filebrowser/base.py @@ -0,0 +1,219 @@ +# coding: utf-8 + +# imports +import os, re, datetime +from time import gmtime, strftime + +# django imports +from django.conf import settings + +# filebrowser imports +from filebrowser.settings import * +from filebrowser.functions import get_file_type, url_join, is_selectable, get_version_path +from django.utils.encoding import force_unicode + +# PIL import +if STRICT_PIL: + from PIL import Image +else: + try: + from PIL import Image + except ImportError: + import Image + + +class FileObject(object): + """ + The FileObject represents a File on the Server. + + PATH has to be relative to MEDIA_ROOT. + """ + + def __init__(self, path): + path = force_unicode(path) + self.path = path + self.url_rel = path.replace("\\","/") + self.head = os.path.split(path)[0] + self.filename = os.path.split(path)[1] + self.filename_lower = self.filename.lower() # important for sorting + # ABP: fix for dotted folder names + if os.path.isdir(self.path_full): + self.filetype = 'Folder' + else: + self.filetype = get_file_type(self.filename) + + def _filesize(self): + """ + Filesize. + """ + path = self.path + if os.path.isfile(os.path.join(MEDIA_ROOT, path)) or os.path.isdir(os.path.join(MEDIA_ROOT, path)): + return os.path.getsize(os.path.join(MEDIA_ROOT, path)) + return "" + filesize = property(_filesize) + + def _date(self): + """ + Date. + """ + if os.path.isfile(os.path.join(MEDIA_ROOT, self.path)) or os.path.isdir(os.path.join(MEDIA_ROOT, self.path)): + return os.path.getmtime(os.path.join(MEDIA_ROOT, self.path)) + return "" + date = property(_date) + + def _datetime(self): + """ + Datetime Object. + """ + return datetime.datetime.fromtimestamp(self.date) + datetime = property(_datetime) + + def _extension(self): + """ + Extension. + """ + return u"%s" % os.path.splitext(self.filename)[1] + extension = property(_extension) + + def _filetype_checked(self): + if self.filetype == "Folder" and os.path.isdir(self.path_full): + return self.filetype + elif self.filetype != "Folder" and os.path.isfile(self.path_full): + return self.filetype + else: + return "" + filetype_checked = property(_filetype_checked) + + def _path_full(self): + """ + Full server PATH including MEDIA_ROOT. + """ + return os.path.join(MEDIA_ROOT, self.path) + path_full = property(_path_full) + + def _path_relative(self): + return self.path + path_relative = property(_path_relative) + + def _path_relative_directory(self): + """ + Path relative to initial directory. + """ + directory_re = re.compile(r'^(%s)' % (DIRECTORY)) + value = directory_re.sub('', self.path) + return u"%s" % value + path_relative_directory = property(_path_relative_directory) + + def _url_relative(self): + return self.url_rel + url_relative = property(_url_relative) + + def _url_full(self): + """ + Full URL including MEDIA_URL. + """ + return force_unicode(url_join(MEDIA_URL, self.url_rel)) + url_full = property(_url_full) + + def _url_save(self): + """ + URL used for the filebrowsefield. + """ + if SAVE_FULL_URL: + return self.url_full + else: + return self.url_rel + url_save = property(_url_save) + + def _url_thumbnail(self): + """ + Thumbnail URL. + """ + if self.filetype == "Image": + return u"%s" % url_join(MEDIA_URL, get_version_path(self.path, 'fb_thumb')) + else: + return "" + url_thumbnail = property(_url_thumbnail) + + def url_admin(self): + if self.filetype_checked == "Folder": + directory_re = re.compile(r'^(%s)' % (DIRECTORY)) + value = directory_re.sub('', self.path) + return u"%s" % value + else: + return u"%s" % url_join(MEDIA_URL, self.path) + + def _folder(self): + directory_re = re.compile(r'^(%s)' % (DIRECTORY.rstrip('/'))) + return u"%s/" % directory_re.sub('', self.head) + folder = property(_folder) + + def _folder_for_link(self): + directory_re = re.compile(r'^(%s)' % (DIRECTORY.rstrip('/'))) + return u"%s" % directory_re.sub('', self.head)[1:] + folder_for_link = property(_folder_for_link) + + def _dimensions(self): + """ + Image Dimensions. + """ + if self.filetype == 'Image': + try: + im = Image.open(os.path.join(MEDIA_ROOT, self.path)) + return im.size + except: + pass + else: + return False + dimensions = property(_dimensions) + + def _width(self): + """ + Image Width. + """ + return self.dimensions[0] + width = property(_width) + + def _height(self): + """ + Image Height. + """ + return self.dimensions[1] + height = property(_height) + + def _orientation(self): + """ + Image Orientation. + """ + if self.dimensions: + if self.dimensions[0] >= self.dimensions[1]: + return "Landscape" + else: + return "Portrait" + else: + return None + orientation = property(_orientation) + + def _is_empty(self): + """ + True if Folder is empty, False if not. + """ + if os.path.isdir(self.path_full): + if not os.listdir(self.path_full): + return True + else: + return False + else: + return None + is_empty = property(_is_empty) + + def __repr__(self): + return force_unicode(self.url_save) + + def __str__(self): + return force_unicode(self.url_save) + + def __unicode__(self): + return force_unicode(self.url_save) + + |