예제 #1
0
파일: events.py 프로젝트: mgimle/onlineweb4
    def dehydrate(self, bundle):

        # Setting slug-field
        bundle.data['slug'] = slugify(unidecode(bundle.data['title']))

        # If image is set
        if bundle.data['image']:
            # Parse to FileObject used by Filebrowser
            temp_image = FileObject(bundle.data['image'])

            # Itterate the different versions (by key)
            for ver in VERSIONS.keys():
                # Check if the key start with article_ (if it does, we want to crop to that size)
                if ver.startswith('events_'):
                    # Adding the new image to the object
                    bundle.data['image_' +
                                ver] = temp_image.version_generate(ver).url

            # Unset the image-field
            del (bundle.data['image'])

        # Do the same thing for the company image
        if 'image' in bundle.data and bundle.data['image']:
            for company in bundle.data['company_event']:
                temp_image = FileObject(
                    company.data['companies'].data['old_image'])
                for ver in VERSIONS.keys():
                    if ver.startswith('companies_thumb'):
                        company.data['companies'].data[
                            'old_image_' +
                            ver] = temp_image.version_generate(ver).url
                del (company.data['companies'].data['old_image'])

        # Returning washed object
        return bundle
예제 #2
0
    def get(self, request, *args, **kwargs):
        ''' Receives the request '''

        ctx = {'show_profile': "0"}
        if 'loggedin_user_credentials' in request.session:
            ctx = request.session['loggedin_user_credentials']

        try:
            PhotographerObj = Photographer.objects.get(user_ref=request.user)
            if len(PhotographerObj.image.all()):
                formargs = {'username': request.user.username, 'home_page_desc': PhotographerObj.home_page_desc}

                count = 1
                for k in PhotographerObj.image.all().order_by('created_date'):
                    if k.profile_image:
                        rel_path = os.path.join(os.path.join(FILEBROWSER_DIRECTORY,request.user.username) + '/', k.image.filename)
                        a = FileObject(rel_path)
                        version = a.version_generate('thumbnail').url
                        formargs.update({'profile_image_name': k.image.filename,
                                         'profile_image': version})

                    name = 'image_' + str(count) + '_desc'
                    rel_path = os.path.join(os.path.join(FILEBROWSER_DIRECTORY,request.user.username) + '/', k.image.filename)
                    a = FileObject(rel_path)
                    version = a.version_generate('thumbnail').url

                    formargs.update({'image_' + str(count) + '_name': k.image.filename,
                                     'image_' + str(count): version
                                 })

                    formargs.update({'image_' + str(count) + '_desc': k.image_desc})
                    count += 1

                # formargs.update({'image_1_desc': PhotographerObj.image_1_desc,
                #                  'image_2_desc': PhotographerObj.image_2_desc,
                #                  'image_3_desc': PhotographerObj.image_3_desc,
                #                  'image_4_desc': PhotographerObj.image_4_desc,
                #                  })

                formsubmit = self.form_class(formargs)
                ctx.update({'upload_form': formsubmit})
                ctx.update({'show_profile': "1"})

        except Exception as e:
            ctx.update({'show_profile': "0"})
            pass

        ctx.update({'username': request.user.username})
        return Response(ctx, template_name=self.template_name)
예제 #3
0
def get_teaser_image(path, version):
    if path:
        image = FileObject(path)
        if image.filetype == "Image":
            return image.version_generate(version).url.split('adimas.info')[1]
    else:
        return ""
예제 #4
0
 def image_thumbnail(self):
     if self.image:
         image = FileObject(self.image.path)
         if image.filetype == "Image":
             return '<img src="%s" />' % image.version_generate('admin_thumbnail').url
     else:
         return ""
예제 #5
0
 def render(self, context):
     try:
         version_suffix = self.suffix.resolve(context)
         source = self.src.resolve(context)
     except VariableDoesNotExist:
         return None
     if version_suffix not in VERSIONS:
         return ""  # FIXME: should this throw an error?
     if isinstance(source, FileObject):
         source = source.path
     elif isinstance(source, File):
         source = source.name
     else:  # string
         source = source
     site = context.get('filebrowser_site', get_default_site())
     if FORCE_PLACEHOLDER or (SHOW_PLACEHOLDER and not site.storage.isfile(source)):
         source = PLACEHOLDER
     fileobject = FileObject(source, site=site)
     try:
         version = fileobject.version_generate(version_suffix)
         context[self.var_name] = version
     except Exception as e:
         if settings.TEMPLATE_DEBUG:
             raise e
         context[self.var_name] = ""
     return ""
예제 #6
0
def get_teaser_image(path, version):
    if path:
        image = FileObject(path)
        if image.filetype == "Image":
            return  image.version_generate(version).url.split('adimas.info')[1]
    else:
        return ""
예제 #7
0
 def render(self, context):
     try:
         version_suffix = self.suffix.resolve(context)
         source = self.src.resolve(context)
     except VariableDoesNotExist:
         return None
     if version_suffix not in VERSIONS:
         return ""  # FIXME: should this throw an error?
     if isinstance(source, FileObject):
         source = source.path
     elif isinstance(source, File):
         source = source.name
     else:  # string
         source = source
     site = context.get('filebrowser_site', get_default_site())
     if FORCE_PLACEHOLDER or (SHOW_PLACEHOLDER
                              and not site.storage.isfile(source)):
         source = PLACEHOLDER
     fileobject = FileObject(source, site=site)
     try:
         version = fileobject.version_generate(version_suffix)
         context[self.var_name] = version
     except Exception:
         if settings.TEMPLATE_DEBUG:
             raise
         context[self.var_name] = ""
     return ""
예제 #8
0
 def image_thumbnail(self, obj):
     if obj.image:
         image = FileObject(obj.image.path)
         if image.filetype == "Image":
             return '<img src="%s" />' % image.version_generate(ADMIN_THUMBNAIL).url
     else:
         return ""
예제 #9
0
    def test_unicode_options_namer_version(self):
        path_unicode = os.path.join(self.FOLDER_PATH, '測試文件.jpg')
        expected = u'測試文件_large--680x0.jpg'

        shutil.copy(self.STATIC_IMG_PATH, path_unicode)
        f = FileObject(path_unicode, site=site)
        version = f.version_generate('large')
        self.assertEqual(version.filename, expected)
예제 #10
0
    def test_unicode_options_namer_version(self):
        path_unicode = os.path.join(self.FOLDER_PATH, "測試文件.jpg")
        expected = u"測試文件_large--680x0.jpg"

        shutil.copy(self.STATIC_IMG_PATH, path_unicode)
        f = FileObject(path_unicode, site=site)
        version = f.version_generate("large")
        self.assertEqual(version.filename, expected)
예제 #11
0
    def save_file(self, file):
        """
            Little helper to save a file default save to media/temp/
        """

        # original_name = file.name
        # extension = os.path.splitext(original_name)[1][1:]
        # filename = os.path.splitext(original_name)[0].strip('.')
        # filename = filename + '__' + str(time.time()) + '.' + extension
        # rel_path = os.path.join(TEMP_UPLOAD_DIR, filename)

        #Create user directory in temp folder
        try:
            os.makedirs(os.path.join(MEDIA_ROOT, TEMP_UPLOAD_DIR))
        except OSError:
            # Do nothing Assume that dir is already created.
            pass

        try:
            userdirpath = os.path.join(
                os.path.join(MEDIA_ROOT, TEMP_UPLOAD_DIR),
                self.request.user.username)
            os.makedirs(userdirpath)
        except OSError:
            # Do nothing Assume that dir is already created.
            pass

        source_dir = os.path.join(MEDIA_ROOT)
        destination_dir = os.path.join(
            source_dir,
            os.path.join(TEMP_UPLOAD_DIR, self.request.user.username))

        ext = '.' + os.path.splitext(file.name)[1][1:]
        img_name = file.name.split(ext)[0]
        img_name = generate_unique_file_name(destination_dir, img_name, ext)

        rel_path = os.path.join(
            os.path.join(TEMP_UPLOAD_DIR, self.request.user.username) + '/',
            img_name)
        fd = open(os.path.join(MEDIA_ROOT, rel_path), 'wb')
        for chunk in file.chunks():
            fd.write(chunk)
        fd.close()

        try:
            a = FileObject(rel_path)
            version = a.version_generate('thumbnail').url
        except Exception as e:
            pass

        return {
            'path': MEDIA_URL + rel_path,
            'file': img_name,
            'name': img_name,
            'version': version
        }
예제 #12
0
파일: admin.py 프로젝트: gbezyuk/shift
def get_image_thumbnail_html(image):
    if image:
        image_fileobject = FileObject(image.path)
        if image_fileobject and image_fileobject.filetype == "Image" \
        and os.path.isfile(settings.MEDIA_ROOT + image.path):
            str = '<img src="%s" />' % image_fileobject.version_generate(settings.FILEBROWSER_ADMIN_THUMBNAIL).url
            return str
        return False
    else:
        return False
예제 #13
0
파일: admin.py 프로젝트: camoguard/proto
 def image_thumbnail(self, obj):
     image = obj.content_object.image
     if image:
         fb_image = FileObject(image.path)
         if fb_image.filetype == 'Image':
             url = image.url.rsplit('/',
                                    1)[0] + '/' + fb_image.version_generate(
                                        ADMIN_THUMBNAIL).filename
             return '<img src="%s" />' % url
     else:
         return '(None)'
예제 #14
0
 def add_root_elements(self, handler):
     super(iTunesFeed, self).add_root_elements(handler)
     image_file = FileObject(self.programme.photo.name,
                             site=get_default_site())
     image_url = self.request.build_absolute_uri(
         image_file.version_generate('rss_image').url)
     itunes_image_url = self.request.build_absolute_uri(
         image_file.version_generate('itunes_image').url)
     handler.addQuickElement('itunes:explicit', 'clean')
     handler.addQuickElement('itunes:summary', self.programme.synopsis_text)
     handler.addQuickElement('itunes:image', '', {'href': itunes_image_url})
     if self.programme.category:
         handler.addQuickElement('itunes:category', '',
                                 {'text': self.programme.category})
     handler.addQuickElement(
         'image', '', {
             'url':
             image_url,
             'title':
             self.programme.name,
             'link':
             self.request.build_absolute_uri(
                 self.programme.get_absolute_url()),
         })
예제 #15
0
def preview(request):
    if not request.is_ajax():
        raise PermissionDenied

    file = request.GET.get('file')
    obj = FileObject(file) if file else ""
    thumbnail_name = request.GET.get('thumbnail_name', THUMBNAIL)

    return JsonResponse(
        dict(filename=obj.filename,
             url=obj.url,
             filetype=obj.filetype,
             filesize=filesizeformat(obj.filesize),
             thumbnail=obj.version_generate(thumbnail_name).url
             if obj.filetype == 'Image' else None))
예제 #16
0
파일: models.py 프로젝트: lrbmx/ezlog
    def generate_summary(self, nchars=200):
        '''提出摘要, 最终返回以HTML片段. 代表插图 + 前N个文字'''
        orig_html = pq(self.html_content)
        # 优先提取带有 cover 类的图片作为封面
        cover = orig_html('img.cover:first') or orig_html('img:first')
        if cover:
            try:
                # 清楚来自图片上传插件(ckeditor)自动添加的属性
                cover.removeAttr('style').removeAttr('width').removeAttr(
                    'height')
            except KeyError:
                pass

            cover.addClass('cover')
            orig_src = cover.attr('src')
            # 如果是本地图片, 则封面img标签使用django-filebrowser生成的缩略图
            if orig_src.startswith(settings.MEDIA_URL):
                print "更新封面"
                relative_path = orig_src.replace(settings.MEDIA_URL, '')
                if relative_path.startswith(
                        settings.FILEBROWSER_VERSIONS_BASEDIR):
                    # 如果已经引用的是FileBrowser生成的小尺寸图片,
                    # 则试图推导出原图路径, 并根据原图生成缩略图.
                    relative_path = re.sub(
                        r'^%s' % settings.FILEBROWSER_VERSIONS_BASEDIR,
                        settings.FILEBROWSER_DIRECTORY, relative_path)

                    # FileBrowser生成图片的后缀模式:
                    postfix_pat = '|'.join(
                        ['_' + i for i in settings.FILEBROWSER_ADMIN_VERSIONS])
                    relative_path = re.sub(r'(%s)\.' % postfix_pat, '.',
                                           relative_path)
                fileobject = FileObject(relative_path)
                if fileobject.exists():
                    fileobject = fileobject.original
                    thumbnail = fileobject.version_generate('thumbnail')
                    cover.attr('src',
                               thumbnail.url).attr('data-orig-src', orig_src)
                    cover.css(height='100px', width='100px')
                else:
                    print u'引用的图片不存在: %s' % fileobject.path

        summary_text = cgi.escape(orig_html.text()[:int(nchars)])
        return (cover.outerHtml() or "") + \
            (u'<span class="summary-text">%s...</span>' % summary_text) + \
            (u'<a class="more" href="/%d/">阅读全文→</a>' % self.id) + \
            u'<div class="clear"></div>'
예제 #17
0
    def save_file(self, file):
        """
            Little helper to save a file default save to media/temp/
        """

        # original_name = file.name
        # extension = os.path.splitext(original_name)[1][1:]
        # filename = os.path.splitext(original_name)[0].strip('.')
        # filename = filename + '__' + str(time.time()) + '.' + extension
        # rel_path = os.path.join(TEMP_UPLOAD_DIR, filename)

        #Create user directory in temp folder
        try:
            os.makedirs(os.path.join(MEDIA_ROOT, TEMP_UPLOAD_DIR))
        except OSError:
            # Do nothing Assume that dir is already created.
            pass

        try:
            userdirpath = os.path.join(os.path.join(MEDIA_ROOT, TEMP_UPLOAD_DIR), self.request.user.username)
            os.makedirs(userdirpath)
        except OSError:
            # Do nothing Assume that dir is already created.
            pass

        source_dir = os.path.join(MEDIA_ROOT)
        destination_dir = os.path.join(source_dir,os.path.join(TEMP_UPLOAD_DIR,self.request.user.username))

        ext = '.' + os.path.splitext(file.name)[1][1:]
        img_name = file.name.split(ext)[0]
        img_name = generate_unique_file_name(destination_dir, img_name, ext)

        rel_path = os.path.join(os.path.join(TEMP_UPLOAD_DIR,self.request.user.username) + '/', img_name)
        fd = open(os.path.join(MEDIA_ROOT, rel_path), 'wb')
        for chunk in file.chunks():
            fd.write(chunk)
        fd.close()

        try:
            a = FileObject(rel_path)
            version = a.version_generate('thumbnail').url
        except Exception as e:
            pass

        return {'path': MEDIA_URL + rel_path, 'file': img_name, 'name': img_name, 'version': version}
예제 #18
0
def set_version_img_url(image, context, version):
    if isinstance(image, FileObject):
        source = image.path
    elif isinstance(image, File):
        source = image.name
    else:  # string
        source = image
    site = context.get('filebrowser_site', get_default_site())
    if getattr(settings, 'FILEBROWSER_FORCE_PLACEHOLDER', None) \
        or \
    (getattr(settings, 'FILEBROWSER_SHOW_PLACEHOLDER', None) and not site.storage.isfile(source)):
        source = settings.FILEBROWSER_PLACEHOLDER
    fileobject = FileObject(source, site=site)
    try:
        version = fileobject.version_generate(version)
        image = version.path
    except Exception as e:
        raise e
    return settings.MEDIA_URL + image
예제 #19
0
파일: models.py 프로젝트: Missyliang1/ezlog
    def generate_summary(self, nchars=200):
        '''提出摘要, 最终返回以HTML片段. 代表插图 + 前N个文字'''
        orig_html = pq(self.html_content)
        # 优先提取带有 cover 类的图片作为封面
        cover = orig_html('img.cover:first') or orig_html('img:first')
        if cover:
            try:
                # 清楚来自图片上传插件(ckeditor)自动添加的属性
                cover.removeAttr('style').removeAttr('width').removeAttr('height')
            except KeyError:
                pass

            cover.addClass('cover')
            orig_src = cover.attr('src')
            # 如果是本地图片, 则封面img标签使用django-filebrowser生成的缩略图
            if orig_src.startswith(settings.MEDIA_URL):
                print "更新封面"
                relative_path = orig_src.replace(settings.MEDIA_URL, '')
                if relative_path.startswith(settings.FILEBROWSER_VERSIONS_BASEDIR):
                    # 如果已经引用的是FileBrowser生成的小尺寸图片,
                    # 则试图推导出原图路径, 并根据原图生成缩略图.
                    relative_path = re.sub(r'^%s' % settings.FILEBROWSER_VERSIONS_BASEDIR,
                                           settings.FILEBROWSER_DIRECTORY, relative_path)
                    
                    # FileBrowser生成图片的后缀模式:
                    postfix_pat = '|'.join(['_'+i for i in settings.FILEBROWSER_ADMIN_VERSIONS])
                    relative_path = re.sub(r'(%s)\.' % postfix_pat, '.', relative_path)
                fileobject = FileObject(relative_path)
                if fileobject.exists():
                    fileobject = fileobject.original
                    thumbnail = fileobject.version_generate('thumbnail')
                    cover.attr('src', thumbnail.url).attr('data-orig-src', orig_src)
                    cover.css(height='100px', width='100px')
                else:
                    print u'引用的图片不存在: %s' % fileobject.path

        summary_text = cgi.escape(orig_html.text()[:int(nchars)])
        return (cover.outerHtml() or "") + \
            (u'<span class="summary-text">%s...</span>' % summary_text) + \
            (u'<a class="more" href="/%d/">阅读全文→</a>' % self.id) + \
            u'<div class="clear"></div>'
예제 #20
0
 def render(self, context):
     try:
         version_suffix = self.suffix.resolve(context)
         source = self.src.resolve(context)
     except VariableDoesNotExist:
         return ""
     if version_suffix not in VERSIONS:
         return "" # FIXME: should this throw an error?
     if isinstance(source, FileObject):
         source = source.path
     elif isinstance(source, File):
         source = source.name
     else: # string
         source = source
     site = context.get('filebrowser_site', get_default_site())
     fileobject = FileObject(source, site=site)
     try:
         version = fileobject.version_generate(version_suffix)
         return version.url
     except Exception, e:
         if settings.TEMPLATE_DEBUG:
             raise e
 def render(self, context):
     try:
         version_suffix = self.suffix.resolve(context)
         source = self.src.resolve(context)
     except VariableDoesNotExist:
         return ""
     if version_suffix not in VERSIONS:
         return ""  # FIXME: should this throw an error?
     if isinstance(source, FileObject):
         source = source.path
     elif isinstance(source, File):
         source = source.name
     else:  # string
         source = source
     site = context.get('filebrowser_site', get_default_site())
     fileobject = FileObject(source, site=site)
     try:
         version = fileobject.version_generate(version_suffix)
         return version.url
     except Exception, e:
         if settings.TEMPLATE_DEBUG:
             raise e
    def _upload_file(self, request):
        """
        Upload file to the server.

        If temporary is true, we upload to UPLOAD_TEMP_DIR, otherwise
        we upload to site.directory
        """
        if request.method == "POST":
            folder = request.GET.get('folder', '')
            temporary = request.GET.get('temporary', '')
            temp_filename = None

            if len(request.FILES) == 0:
                return HttpResponseBadRequest('Invalid request! No files included.')
            if len(request.FILES) > 1:
                return HttpResponseBadRequest('Invalid request! Multiple files included.')

            filedata = list(request.FILES.values())[0]

            fb_uploadurl_re = re.compile(r'^.*(%s)' % reverse("filebrowser:fb_upload", current_app=self.name))
            folder = fb_uploadurl_re.sub('', folder)

            # temporary upload folder should be outside self.directory
            if folder == UPLOAD_TEMPDIR and temporary == "true":
                path = folder
            else:
                path = os.path.join(self.directory, folder)
            # we convert the filename before uploading in order
            # to check for existing files/folders
            file_name = convert_filename(filedata.name)
            filedata.name = file_name
            file_path = os.path.join(path, file_name)
            file_already_exists = self.storage.exists(file_path)

            # construct temporary filename by adding the upload folder, because
            # otherwise we don't have any clue if the file has temporary been
            # uploaded or not
            if folder == UPLOAD_TEMPDIR and temporary == "true":
                temp_filename = os.path.join(folder, file_name)

            # Check for name collision with a directory
            if file_already_exists and self.storage.isdir(file_path):
                ret_json = {'success': False, 'filename': file_name}
                return HttpResponse(json.dumps(ret_json))

            signals.filebrowser_pre_upload.send(sender=request, path=folder, file=filedata, site=self)
            uploadedfile = handle_file_upload(path, filedata, site=self)

            if file_already_exists and OVERWRITE_EXISTING:
                old_file = smart_text(file_path)
                new_file = smart_text(uploadedfile)
                self.storage.move(new_file, old_file, allow_overwrite=True)
                full_path = FileObject(smart_text(old_file), site=self).path_full
            else:
                file_name = smart_text(uploadedfile)
                filedata.name = os.path.relpath(file_name, path)
                full_path = FileObject(smart_text(file_name), site=self).path_full

            # set permissions
            if DEFAULT_PERMISSIONS is not None:
                os.chmod(full_path, DEFAULT_PERMISSIONS)

            f = FileObject(smart_text(file_name), site=self)
            signals.filebrowser_post_upload.send(sender=request, path=folder, file=f, site=self)
            
            # We don't know at this stage if it's an image
            # so attempt to generate an admin thumb and catch the exception
            try:
                admin_thumbnail_url = f.version_generate(ADMIN_THUMBNAIL).url
            except IOError:
                admin_thumbnail_url = ''
            
            # Let Ajax Upload know whether we saved it or not
            ret_json = {
                'success': True,
                'filename': f.filename,
                'temp_filename': temp_filename,
                'url': f.url,
                'admin_thumbnail_url': admin_thumbnail_url,
            }
            return HttpResponse(json.dumps(ret_json), content_type="application/json")
예제 #23
0
    def get(self, request, *args, **kwargs):
        ''' Receives the request '''

        ctx = {'show_profile': "0"}
        if 'loggedin_user_credentials' in request.session:
            ctx = request.session['loggedin_user_credentials']

        try:
            PhotographerObj = Photographer.objects.get(user_ref=request.user)
            if len(PhotographerObj.image.all()):
                formargs = {
                    'username': request.user.username,
                    'home_page_desc': PhotographerObj.home_page_desc
                }

                count = 1
                for k in PhotographerObj.image.all().order_by('created_date'):
                    if k.profile_image:
                        rel_path = os.path.join(
                            os.path.join(FILEBROWSER_DIRECTORY,
                                         request.user.username) + '/',
                            k.image.filename)
                        a = FileObject(rel_path)
                        version = a.version_generate('thumbnail').url
                        formargs.update({
                            'profile_image_name': k.image.filename,
                            'profile_image': version
                        })

                    name = 'image_' + str(count) + '_desc'
                    rel_path = os.path.join(
                        os.path.join(FILEBROWSER_DIRECTORY,
                                     request.user.username) + '/',
                        k.image.filename)
                    a = FileObject(rel_path)
                    version = a.version_generate('thumbnail').url

                    formargs.update({
                        'image_' + str(count) + '_name': k.image.filename,
                        'image_' + str(count): version
                    })

                    formargs.update(
                        {'image_' + str(count) + '_desc': k.image_desc})
                    count += 1

                # formargs.update({'image_1_desc': PhotographerObj.image_1_desc,
                #                  'image_2_desc': PhotographerObj.image_2_desc,
                #                  'image_3_desc': PhotographerObj.image_3_desc,
                #                  'image_4_desc': PhotographerObj.image_4_desc,
                #                  })

                formsubmit = self.form_class(formargs)
                ctx.update({'upload_form': formsubmit})
                ctx.update({'show_profile': "1"})

        except Exception as e:
            ctx.update({'show_profile': "0"})
            pass

        ctx.update({'username': request.user.username})
        return Response(ctx, template_name=self.template_name)
예제 #24
0
class FileObjectAttributeTests(TestCase):
    
    def setUp(self):
        """
        Save original values/functions so they can be restored in tearDown
        """
        self.original_path = filebrowser.base.os.path
        self.original_directory = site.directory
        self.original_versions_basedir = filebrowser.base.VERSIONS_BASEDIR
        self.original_versions = filebrowser.base.VERSIONS
        self.original_admin_versions = filebrowser.base.ADMIN_VERSIONS

        # DIRECTORY
        # custom directory because this could be set with sites
        # and we cannot rely on filebrowser.settings
        # FIXME: find better directory name
        self.directory = "fb_test_directory/"
        self.directory_path = os.path.join(site.storage.location, self.directory)
        if os.path.exists(self.directory_path):
            self.fail("Test directory already exists.")
        else:
            os.makedirs(self.directory_path)
        # set site directory
        site.directory = self.directory

        # VERSIONS
        self.versions = "_versionstestdirectory"
        self.versions_path = os.path.join(site.storage.location, self.versions)
        if os.path.exists(self.versions_path):
            self.fail("Versions directory already exists.")
        else:
            os.makedirs(self.versions_path)

        # create temporary test folder and move testimage
        # FIXME: find better path names
        self.tmpdir_name = os.path.join("fb_tmp_dir", "fb_tmp_dir_sub")
        self.tmpdir_path = os.path.join(site.storage.location, self.directory, self.tmpdir_name)
        if os.path.exists(self.tmpdir_path):
            self.fail("Temporary testfolder already exists.")
        else:
            os.makedirs(self.tmpdir_path)

        # copy test image to temporary test folder
        self.image_path = os.path.join(FILEBROWSER_PATH, "static", "filebrowser", "img", "testimage.jpg")
        if not os.path.exists(self.image_path):
            self.fail("Testimage not found.")
        shutil.copy(self.image_path, self.tmpdir_path)

        # set posixpath
        filebrowser.base.os.path = posixpath

        # fileobjects
        self.f_image = FileObject(os.path.join(self.directory, self.tmpdir_name, "testimage.jpg"), site=site)
        self.f_folder = FileObject(os.path.join(self.directory, self.tmpdir_name), site=site)

    def test_init_attributes(self):
        """
        FileObject init attributes

        # path
        # head
        # filename
        # filename_lower
        # filename_root
        # extension
        # mimetype
        """
        self.assertEqual(self.f_image.path, "fb_test_directory/fb_tmp_dir/fb_tmp_dir_sub/testimage.jpg")
        self.assertEqual(self.f_image.head, 'fb_test_directory/fb_tmp_dir/fb_tmp_dir_sub')
        self.assertEqual(self.f_image.filename, 'testimage.jpg')
        self.assertEqual(self.f_image.filename_lower, 'testimage.jpg')
        self.assertEqual(self.f_image.filename_root, 'testimage')
        self.assertEqual(self.f_image.extension, '.jpg')
        self.assertEqual(self.f_image.mimetype, ('image/jpeg', None))

    def test_general_attributes(self):
        """
        FileObject general attributes

        # filetype
        # filesize
        # date
        # datetime
        # exists
        """
        self.assertEqual(self.f_image.filetype, 'Image')
        self.assertEqual(self.f_image.filesize, 870037)
        # FIXME: test date/datetime
        self.assertEqual(self.f_image.exists, True)

    def test_path_url_attributes(self):
        """
        FileObject path and url attributes

        # path (see init)
        # path_relative_directory
        # path_full
        # dirname
        # url
        """
        self.assertEqual(self.f_image.path, "fb_test_directory/fb_tmp_dir/fb_tmp_dir_sub/testimage.jpg")
        self.assertEqual(self.f_image.path_relative_directory, "fb_tmp_dir/fb_tmp_dir_sub/testimage.jpg")
        self.assertEqual(self.f_image.path_full, os.path.join(site.storage.location, site.directory, "fb_tmp_dir/fb_tmp_dir_sub/testimage.jpg"))
        self.assertEqual(self.f_image.dirname, "fb_tmp_dir/fb_tmp_dir_sub")
        self.assertEqual(self.f_image.url, site.storage.url(self.f_image.path))

    def test_image_attributes(self):
        """
        FileObject image attributes

        # dimensions
        # width
        # height
        # aspectratio
        # orientation
        """
        self.assertEqual(self.f_image.dimensions, (1000, 750))
        self.assertEqual(self.f_image.width, 1000)
        self.assertEqual(self.f_image.height, 750)
        self.assertEqual(self.f_image.aspectratio, 1.3333333333333333)
        self.assertEqual(self.f_image.orientation, 'Landscape')

    def test_folder_attributes(self):
        """
        FileObject folder attributes

        # directory
        # folder
        # is_folder
        # is_empty
        """
        # test with image
        self.assertEqual(self.f_image.directory, "fb_tmp_dir/fb_tmp_dir_sub/testimage.jpg")
        self.assertEqual(self.f_image.folder, "fb_tmp_dir/fb_tmp_dir_sub") # FIXME: equals dirname?
        self.assertEqual(self.f_image.is_folder, False)
        self.assertEqual(self.f_image.is_empty, False)

        # test with actual folder
        self.assertEqual(self.f_folder.directory, "fb_tmp_dir/fb_tmp_dir_sub")
        self.assertEqual(self.f_folder.folder, "fb_tmp_dir") # FIXME: equals dirname?
        self.assertEqual(self.f_folder.is_folder, True)
        self.assertEqual(self.f_folder.is_empty, False)

    def test_version_attributes_1(self):
        """
        FileObject version attributes/methods
        without versions_basedir

        # is_version
        # original
        # versions_basedir
        # versions
        # admin_versions
        # version_name(suffix)
        # version_path(suffix)
        # version_generate(suffix)
        """
        # new settings
        filebrowser.base.VERSIONS_BASEDIR = ""
        filebrowser.base.VERSIONS = {
            'admin_thumbnail': {'verbose_name': 'Admin Thumbnail', 'width': 60, 'height': 60, 'opts': 'crop'},
            'large': {'verbose_name': 'Large', 'width': 600, 'height': '', 'opts': ''},
        }
        filebrowser.base.ADMIN_VERSIONS = ['large']
        # expected test results
        version_list = ['fb_test_directory/fb_tmp_dir/fb_tmp_dir_sub/testimage_large.jpg', 'fb_test_directory/fb_tmp_dir/fb_tmp_dir_sub/testimage_admin_thumbnail.jpg']
        admin_version_list = ['fb_test_directory/fb_tmp_dir/fb_tmp_dir_sub/testimage_large.jpg']

        self.assertEqual(self.f_image.is_version, False)
        self.assertEqual(self.f_image.original.path, self.f_image.path)
        self.assertEqual(self.f_image.versions_basedir, "fb_test_directory/")
        self.assertEqual(self.f_image.versions(), version_list)
        self.assertEqual(self.f_image.admin_versions(), admin_version_list)
        self.assertEqual(self.f_image.version_name("large"), "testimage_large.jpg")
        self.assertEqual(self.f_image.version_path("large"), "fb_test_directory/fb_tmp_dir/fb_tmp_dir_sub/testimage_large.jpg")

        # version does not exist yet
        f_version = FileObject(os.path.join(self.directory, self.tmpdir_name, "testimage_large.jpg"), site=site)
        self.assertEqual(f_version.exists, False)
        # generate version
        f_version = self.f_image.version_generate("large")
        self.assertEqual(f_version.path, "fb_test_directory/fb_tmp_dir/fb_tmp_dir_sub/testimage_large.jpg")
        self.assertEqual(f_version.exists, True)
        self.assertEqual(f_version.is_version, True)
        self.assertEqual(f_version.original_filename, "testimage.jpg")
        self.assertEqual(f_version.original.path, self.f_image.path)
        # FIXME: versions should not have versions or admin_versions

    def test_version_attributes_2(self):
        """
        FileObject version attributes/methods
        with versions_basedir

        # is_version
        # original
        # versions_basedir
        # versions
        # admin_versions
        # version_name(suffix)
        # version_generate(suffix)
        """
        # new settings
        filebrowser.base.VERSIONS_BASEDIR = "fb_test_directory/_versions"
        filebrowser.base.VERSIONS = {
            'admin_thumbnail': {'verbose_name': 'Admin Thumbnail', 'width': 60, 'height': 60, 'opts': 'crop'},
            'large': {'verbose_name': 'Large', 'width': 600, 'height': '', 'opts': ''},
        }
        filebrowser.base.ADMIN_VERSIONS = ['large']
        # expected test results
        version_list = ['fb_test_directory/_versions/fb_tmp_dir/fb_tmp_dir_sub/testimage_large.jpg', 'fb_test_directory/_versions/fb_tmp_dir/fb_tmp_dir_sub/testimage_admin_thumbnail.jpg']
        admin_version_list = ['fb_test_directory/_versions/fb_tmp_dir/fb_tmp_dir_sub/testimage_large.jpg']

        self.assertEqual(self.f_image.is_version, False)
        self.assertEqual(self.f_image.original.path, self.f_image.path)
        self.assertEqual(self.f_image.versions_basedir, "fb_test_directory/_versions")
        self.assertEqual(self.f_image.versions(), version_list)
        self.assertEqual(self.f_image.admin_versions(), admin_version_list)
        self.assertEqual(self.f_image.version_name("large"), "testimage_large.jpg")
        self.assertEqual(self.f_image.version_path("large"), "fb_test_directory/_versions/fb_tmp_dir/fb_tmp_dir_sub/testimage_large.jpg")

        # version does not exist yet
        f_version = FileObject(os.path.join(self.directory, self.tmpdir_name, "testimage_large.jpg"), site=site)
        self.assertEqual(f_version.exists, False)
        # generate version
        f_version = self.f_image.version_generate("large")
        self.assertEqual(f_version.path, "fb_test_directory/_versions/fb_tmp_dir/fb_tmp_dir_sub/testimage_large.jpg")
        self.assertEqual(f_version.exists, True)
        self.assertEqual(f_version.is_version, True)
        self.assertEqual(f_version.original_filename, "testimage.jpg")
        self.assertEqual(f_version.original.path, self.f_image.path)
        # FIXME: versions should not have versions or admin_versions

    def test_version_attributes_3(self):
        """
        FileObject version attributes/methods
        with alternative versions_basedir

        # is_version
        # original
        # versions_basedir
        # versions
        # admin_versions
        # version_name(suffix)
        # version_generate(suffix)
        """
        # new settings
        filebrowser.base.VERSIONS_BASEDIR = "_versionstestdirectory"
        filebrowser.base.VERSIONS = {
            'admin_thumbnail': {'verbose_name': 'Admin Thumbnail', 'width': 60, 'height': 60, 'opts': 'crop'},
            'large': {'verbose_name': 'Large', 'width': 600, 'height': '', 'opts': ''},
        }
        filebrowser.base.ADMIN_VERSIONS = ['large']
        # expected test results
        version_list = ['_versionstestdirectory/fb_tmp_dir/fb_tmp_dir_sub/testimage_large.jpg', '_versionstestdirectory/fb_tmp_dir/fb_tmp_dir_sub/testimage_admin_thumbnail.jpg']
        admin_version_list = ['_versionstestdirectory/fb_tmp_dir/fb_tmp_dir_sub/testimage_large.jpg']

        self.assertEqual(self.f_image.is_version, False)
        self.assertEqual(self.f_image.original.path, self.f_image.path)
        self.assertEqual(self.f_image.versions_basedir, "_versionstestdirectory")
        self.assertEqual(self.f_image.versions(), version_list)
        self.assertEqual(self.f_image.admin_versions(), admin_version_list)
        self.assertEqual(self.f_image.version_name("large"), "testimage_large.jpg")
        self.assertEqual(self.f_image.version_path("large"), "_versionstestdirectory/fb_tmp_dir/fb_tmp_dir_sub/testimage_large.jpg")

        # version does not exist yet
        f_version = FileObject(os.path.join(self.directory, self.tmpdir_name, "testimage_large.jpg"), site=site)
        self.assertEqual(f_version.exists, False)
        # generate version
        f_version = self.f_image.version_generate("large")
        self.assertEqual(f_version.path, "_versionstestdirectory/fb_tmp_dir/fb_tmp_dir_sub/testimage_large.jpg")
        self.assertEqual(f_version.exists, True)
        self.assertEqual(f_version.is_version, True)
        self.assertEqual(f_version.original_filename, "testimage.jpg")
        self.assertEqual(f_version.original.path, self.f_image.path)
        # FIXME: versions should not have versions or admin_versions

    def test_delete(self):
        """
        FileObject delete methods

        # delete
        # delete_versions
        # delete_admin_versions
        """

        # new settings
        filebrowser.base.VERSIONS_BASEDIR = ""
        filebrowser.base.VERSIONS = {
            'admin_thumbnail': {'verbose_name': 'Admin Thumbnail', 'width': 60, 'height': 60, 'opts': 'crop'},
            'large': {'verbose_name': 'Large', 'width': 600, 'height': '', 'opts': ''},
        }
        filebrowser.base.ADMIN_VERSIONS = ['large']

        # version does not exist yet
        f_version = FileObject(os.path.join(self.directory, self.tmpdir_name, "testimage_large.jpg"), site=site)
        self.assertEqual(f_version.exists, False)
        # generate version
        f_version = self.f_image.version_generate("large")
        f_version_thumb = self.f_image.version_generate("admin_thumbnail")
        self.assertEqual(f_version.exists, True)
        self.assertEqual(f_version_thumb.exists, True)
        self.assertEqual(f_version.path, "fb_test_directory/fb_tmp_dir/fb_tmp_dir_sub/testimage_large.jpg")
        self.assertEqual(f_version_thumb.path, "fb_test_directory/fb_tmp_dir/fb_tmp_dir_sub/testimage_admin_thumbnail.jpg")

        # delete admin versions (large)
        self.f_image.delete_admin_versions()
        self.assertEqual(site.storage.exists(f_version.path), False)

        # delete versions (admin_thumbnail)
        self.f_image.delete_versions()
        self.assertEqual(site.storage.exists(f_version_thumb.path), False)

        
    def tearDown(self):
        """
        Restore original values/functions
        """
        filebrowser.base.os.path = self.original_path
        site.directory = self.original_directory
        filebrowser.base.VERSIONS_BASEDIR = self.original_versions_basedir
        filebrowser.base.VERSIONS = self.original_versions
        filebrowser.base.ADMIN_VERSIONS = self.original_admin_versions

        # remove temporary directory and test folder
        shutil.rmtree(self.directory_path)
        shutil.rmtree(self.versions_path)