Use URL safe encoded filename
This commit is contained in:
@@ -42,8 +42,7 @@ class APIStagingSourceView(generics.RetrieveAPIView):
|
|||||||
class APIStagingSourceFileImageView(generics.GenericAPIView):
|
class APIStagingSourceFileImageView(generics.GenericAPIView):
|
||||||
def get(self, request, staging_folder_pk, filename):
|
def get(self, request, staging_folder_pk, filename):
|
||||||
staging_folder = get_object_or_404(StagingFolder, pk=staging_folder_pk)
|
staging_folder = get_object_or_404(StagingFolder, pk=staging_folder_pk)
|
||||||
|
staging_file = staging_folder.get_file(encoded_filename=filename)
|
||||||
staging_file = staging_folder.get_file(filename)
|
|
||||||
|
|
||||||
#try:
|
#try:
|
||||||
# Permission.objects.check_permissions(request.user, [PERMISSION_DOCUMENT_VIEW])
|
# Permission.objects.check_permissions(request.user, [PERMISSION_DOCUMENT_VIEW])
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ from __future__ import absolute_import
|
|||||||
import base64
|
import base64
|
||||||
import errno
|
import errno
|
||||||
import os
|
import os
|
||||||
|
import urllib
|
||||||
|
|
||||||
from django.core.exceptions import ObjectDoesNotExist
|
from django.core.exceptions import ObjectDoesNotExist
|
||||||
from django.core.files import File
|
from django.core.files import File
|
||||||
@@ -22,9 +23,14 @@ class StagingFile(object):
|
|||||||
Simple class to extend the File class to add preview capabilities
|
Simple class to extend the File class to add preview capabilities
|
||||||
files in a directory on a storage
|
files in a directory on a storage
|
||||||
"""
|
"""
|
||||||
def __init__(self, staging_folder, filename):
|
def __init__(self, staging_folder, filename=None, encoded_filename=None):
|
||||||
self.staging_folder = staging_folder
|
self.staging_folder = staging_folder
|
||||||
|
if encoded_filename:
|
||||||
|
self.encoded_filename = str(encoded_filename)
|
||||||
|
self.filename = base64.urlsafe_b64decode(urllib.unquote_plus(self.encoded_filename))
|
||||||
|
else:
|
||||||
self.filename = filename
|
self.filename = filename
|
||||||
|
self.encoded_filename = base64.urlsafe_b64encode(filename)
|
||||||
|
|
||||||
def __unicode__(self):
|
def __unicode__(self):
|
||||||
return unicode(self.filename)
|
return unicode(self.filename)
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ from .permissions import (PERMISSION_SOURCES_SETUP_VIEW,
|
|||||||
document_create_multiple = {'text': _(u'upload new documents'), 'view': 'document_create_multiple', 'famfam': 'page_add', 'permissions': [PERMISSION_DOCUMENT_CREATE], 'children_view_regex': [r'upload_interactive']}
|
document_create_multiple = {'text': _(u'upload new documents'), 'view': 'document_create_multiple', 'famfam': 'page_add', 'permissions': [PERMISSION_DOCUMENT_CREATE], 'children_view_regex': [r'upload_interactive']}
|
||||||
document_create_siblings = {'text': _(u'clone metadata'), 'view': 'document_create_siblings', 'args': 'object.id', 'famfam': 'page_copy', 'permissions': [PERMISSION_DOCUMENT_CREATE]}
|
document_create_siblings = {'text': _(u'clone metadata'), 'view': 'document_create_siblings', 'args': 'object.id', 'famfam': 'page_copy', 'permissions': [PERMISSION_DOCUMENT_CREATE]}
|
||||||
|
|
||||||
staging_file_delete = {'text': _(u'delete'), 'view': 'staging_file_delete', 'args': ['source.pk', 'object.filename'], 'famfam': 'delete', 'keep_query': True, 'permissions': [PERMISSION_DOCUMENT_NEW_VERSION, PERMISSION_DOCUMENT_CREATE]}
|
staging_file_delete = {'text': _(u'delete'), 'view': 'staging_file_delete', 'args': ['source.pk', 'object.encoded_filename'], 'famfam': 'delete', 'keep_query': True, 'permissions': [PERMISSION_DOCUMENT_NEW_VERSION, PERMISSION_DOCUMENT_CREATE]}
|
||||||
|
|
||||||
setup_sources = {'text': _(u'sources'), 'view': 'setup_web_form_list', 'famfam': 'application_form', 'icon': 'application_form.png', 'children_classes': [WebForm], 'permissions': [PERMISSION_SOURCES_SETUP_VIEW], 'children_view_regex': [r'setup_web_form', r'setup_staging_folder', r'setup_source_']}
|
setup_sources = {'text': _(u'sources'), 'view': 'setup_web_form_list', 'famfam': 'application_form', 'icon': 'application_form.png', 'children_classes': [WebForm], 'permissions': [PERMISSION_SOURCES_SETUP_VIEW], 'children_view_regex': [r'setup_web_form', r'setup_staging_folder', r'setup_source_']}
|
||||||
setup_web_form_list = {'text': _(u'web forms'), 'view': 'setup_web_form_list', 'famfam': 'application_form', 'icon': 'application_form.png', 'children_classes': [WebForm], 'permissions': [PERMISSION_SOURCES_SETUP_VIEW]}
|
setup_web_form_list = {'text': _(u'web forms'), 'view': 'setup_web_form_list', 'famfam': 'application_form', 'icon': 'application_form.png', 'children_classes': [WebForm], 'permissions': [PERMISSION_SOURCES_SETUP_VIEW]}
|
||||||
|
|||||||
@@ -169,15 +169,15 @@ class StagingFolder(InteractiveBaseModel):
|
|||||||
|
|
||||||
return DIMENSION_SEPARATOR.join(dimensions)
|
return DIMENSION_SEPARATOR.join(dimensions)
|
||||||
|
|
||||||
def get_file(self, filename):
|
def get_file(self, *args, **kwargs):
|
||||||
return StagingFile(staging_folder=self, filename=filename)
|
return StagingFile(staging_folder=self, *args, **kwargs)
|
||||||
|
|
||||||
def get_files(self):
|
def get_files(self):
|
||||||
try:
|
try:
|
||||||
for entry in sorted([os.path.normcase(f) for f in os.listdir(self.folder_path) if os.path.isfile(os.path.join(self.folder_path, f))]):
|
for entry in sorted([os.path.normcase(f) for f in os.listdir(self.folder_path) if os.path.isfile(os.path.join(self.folder_path, f))]):
|
||||||
yield self.get_file(filename=entry)
|
yield self.get_file(filename=entry)
|
||||||
except OSError as exception:
|
except OSError as exception:
|
||||||
raise Exception(ugettext(u'Unable get list of staging files: %s') % exception)
|
raise Exception(_(u'Unable get list of staging files: %s') % exception)
|
||||||
|
|
||||||
class Meta(InteractiveBaseModel.Meta):
|
class Meta(InteractiveBaseModel.Meta):
|
||||||
verbose_name = _(u'staging folder')
|
verbose_name = _(u'staging folder')
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ from .literals import (SOURCE_CHOICE_WEB_FORM, SOURCE_CHOICE_STAGING,
|
|||||||
from .wizards import DocumentCreateWizard
|
from .wizards import DocumentCreateWizard
|
||||||
|
|
||||||
urlpatterns = patterns('sources.views',
|
urlpatterns = patterns('sources.views',
|
||||||
url(r'^staging_file/(?P<staging_folder_pk>\d+)/(?P<filename>[0-9_\.\w-]+)/delete/$', 'staging_file_delete', name='staging_file_delete'),
|
url(r'^staging_file/(?P<staging_folder_pk>\d+)/(?P<filename>.+)/delete/$', 'staging_file_delete', name='staging_file_delete'),
|
||||||
|
|
||||||
url(r'^upload/document/new/interactive/(?P<source_type>\w+)/(?P<source_id>\d+)/$', 'upload_interactive', (), 'upload_interactive'),
|
url(r'^upload/document/new/interactive/(?P<source_type>\w+)/(?P<source_id>\d+)/$', 'upload_interactive', (), 'upload_interactive'),
|
||||||
url(r'^upload/document/new/interactive/$', 'upload_interactive', (), 'upload_interactive'),
|
url(r'^upload/document/new/interactive/$', 'upload_interactive', (), 'upload_interactive'),
|
||||||
@@ -39,8 +39,8 @@ urlpatterns = patterns('sources.views',
|
|||||||
|
|
||||||
|
|
||||||
#version_0_api_services = [
|
#version_0_api_services = [
|
||||||
url(r'^api/staging_folder/file/(?P<staging_folder_pk>[0-9]+)/(?P<filename>[0-9_\.\w-]+)/image/$', APIStagingSourceFileImageView.as_view(), name='stagingfolderfile-image-view'),
|
url(r'^api/staging_folder/file/(?P<staging_folder_pk>[0-9]+)/(?P<filename>.+)/image/$', APIStagingSourceFileImageView.as_view(), name='stagingfolderfile-image-view'),
|
||||||
url(r'^api/staging_folder/file/(?P<staging_folder_pk>[0-9]+)/(?P<filename>[0-9_\.\w-]+)/$', APIStagingSourceFileView.as_view(), name='stagingfolderfile-detail'),
|
url(r'^api/staging_folder/file/(?P<staging_folder_pk>[0-9]+)/(?P<filename>.+)/$', APIStagingSourceFileView.as_view(), name='stagingfolderfile-detail'),
|
||||||
url(r'^api/staging_folder/$', APIStagingSourceListView.as_view(), name='stagingfolder-list'),
|
url(r'^api/staging_folder/$', APIStagingSourceListView.as_view(), name='stagingfolder-list'),
|
||||||
url(r'^api/staging_folder/(?P<pk>[0-9]+)/$', APIStagingSourceView.as_view(), name='stagingfolder-detail')
|
url(r'^api/staging_folder/(?P<pk>[0-9]+)/$', APIStagingSourceView.as_view(), name='stagingfolder-detail')
|
||||||
#]
|
#]
|
||||||
|
|||||||
@@ -378,7 +378,7 @@ def staging_file_delete(request, staging_folder_pk, filename):
|
|||||||
Permission.objects.check_permissions(request.user, [PERMISSION_DOCUMENT_CREATE, PERMISSION_DOCUMENT_NEW_VERSION])
|
Permission.objects.check_permissions(request.user, [PERMISSION_DOCUMENT_CREATE, PERMISSION_DOCUMENT_NEW_VERSION])
|
||||||
staging_folder = get_object_or_404(StagingFolder, pk=staging_folder_pk)
|
staging_folder = get_object_or_404(StagingFolder, pk=staging_folder_pk)
|
||||||
|
|
||||||
staging_file = staging_folder.get_file(filename)
|
staging_file = staging_folder.get_file(encoded_filename=filename)
|
||||||
next = request.POST.get('next', request.GET.get('next', request.META.get('HTTP_REFERER', '/')))
|
next = request.POST.get('next', request.GET.get('next', request.META.get('HTTP_REFERER', '/')))
|
||||||
previous = request.POST.get('previous', request.GET.get('previous', request.META.get('HTTP_REFERER', '/')))
|
previous = request.POST.get('previous', request.GET.get('previous', request.META.get('HTTP_REFERER', '/')))
|
||||||
|
|
||||||
|
|||||||
@@ -54,7 +54,7 @@ def staging_file_html_widget(staging_file, click_view=None, page=DEFAULT_PAGE_NU
|
|||||||
|
|
||||||
query_string = urlencode(query_dict)
|
query_string = urlencode(query_dict)
|
||||||
|
|
||||||
preview_view = u'%s?%s' % (reverse('stagingfolderfile-image-view', args=[staging_file.staging_folder.pk, staging_file.filename]), query_string)
|
preview_view = u'%s?%s' % (reverse('stagingfolderfile-image-view', args=[staging_file.staging_folder.pk, staging_file.encoded_filename]), query_string)
|
||||||
|
|
||||||
plain_template = []
|
plain_template = []
|
||||||
plain_template.append(u'<img src="%s" alt="%s" />' % (preview_view, alt_text))
|
plain_template.append(u'<img src="%s" alt="%s" />' % (preview_view, alt_text))
|
||||||
@@ -70,7 +70,7 @@ def staging_file_html_widget(staging_file, click_view=None, page=DEFAULT_PAGE_NU
|
|||||||
# TODO: fix this hack
|
# TODO: fix this hack
|
||||||
query_dict['size'] = PREVIEW_SIZE
|
query_dict['size'] = PREVIEW_SIZE
|
||||||
query_string = urlencode(query_dict)
|
query_string = urlencode(query_dict)
|
||||||
result.append(u'<a %s class="%s" href="%s" %s>' % (gallery_template, fancybox_class, u'%s?%s' % (reverse(click_view, args=[staging_file.staging_folder.pk, staging_file.filename]), query_string), title_template))
|
result.append(u'<a %s class="%s" href="%s" %s>' % (gallery_template, fancybox_class, u'%s?%s' % (reverse(click_view, args=[staging_file.staging_folder.pk, staging_file.encoded_filename]), query_string), title_template))
|
||||||
|
|
||||||
if nolazyload:
|
if nolazyload:
|
||||||
result.append(u'<img style="border: 1px solid black;" src="%s" alt="%s" />' % (preview_view, alt_text))
|
result.append(u'<img style="border: 1px solid black;" src="%s" alt="%s" />' % (preview_view, alt_text))
|
||||||
|
|||||||
Reference in New Issue
Block a user