Use URL safe encoded filename

This commit is contained in:
Roberto Rosario
2014-07-08 15:32:42 -04:00
parent 0dee7f3640
commit b430f08509
7 changed files with 19 additions and 14 deletions

View File

@@ -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])

View File

@@ -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
self.filename = filename 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.encoded_filename = base64.urlsafe_b64encode(filename)
def __unicode__(self): def __unicode__(self):
return unicode(self.filename) return unicode(self.filename)

View File

@@ -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]}

View File

@@ -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')

View File

@@ -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')
#] #]

View File

@@ -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', '/')))

View File

@@ -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))