From 52bee2002518dd3cc739c2371459977f64a6c973 Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Tue, 8 Feb 2011 20:35:29 -0400 Subject: [PATCH] Added document thumbnail previews in document list view --- README.md | 1 + apps/documents/conf/settings.py | 1 + apps/documents/urls.py | 1 + apps/documents/views.py | 27 ++++++++++++++++++++----- settings.py | 1 + site_media/images/1297211435_error.png | Bin 0 -> 6809 bytes site_media/images/picture_error.png | Bin 0 -> 1486 bytes 7 files changed, 26 insertions(+), 5 deletions(-) create mode 100644 site_media/images/1297211435_error.png create mode 100644 site_media/images/picture_error.png diff --git a/README.md b/README.md index 2d99b3bfff..67947b0bd9 100644 --- a/README.md +++ b/README.md @@ -24,6 +24,7 @@ Requirements * Django - A high-level Python Web framework that encourages rapid development and clean, pragmatic design. * django-pagination +* ImageMagick - Convert, Edit, Or Compose Bitmap Images Or execute pip install -r requirements/production.txt to install the dependencies automatically. diff --git a/apps/documents/conf/settings.py b/apps/documents/conf/settings.py index 194412bafb..8381a95809 100644 --- a/apps/documents/conf/settings.py +++ b/apps/documents/conf/settings.py @@ -32,6 +32,7 @@ STORAGE_BACKEND = getattr(settings, 'DOCUMENTS_STORAGE_BACKEND', DocumentStorage STORAGE_DIRECTORY_NAME = getattr(settings, 'DOCUMENTS_STORAGE_DIRECTORY_NAME', 'documents') # Usage PREVIEW_SIZE = getattr(settings, 'DOCUMENTS_PREVIEW_SIZE', '640x480') +THUMBNAIL_SIZE = getattr(settings, 'DOCUMENTS_THUMBNAIL_SIZE', '50x50') # Serving FILESYSTEM_FILESERVING_ENABLE = getattr(settings, 'DOCUMENTS_FILESYSTEM_FILESERVING_ENABLE', True) FILESYSTEM_FILESERVING_PATH = getattr(settings, 'DOCUMENTS_FILESERVING_PATH', u'/tmp/mayan/documents') diff --git a/apps/documents/urls.py b/apps/documents/urls.py index 6cd82d8b27..9b21f175fa 100644 --- a/apps/documents/urls.py +++ b/apps/documents/urls.py @@ -13,6 +13,7 @@ urlpatterns = patterns('documents.views', url(r'^document/(?P\d+)/delete/$', 'document_delete', (), 'document_delete'), url(r'^document/(?P\d+)/edit/$', 'document_edit', (), 'document_edit'), url(r'^document/(?P\d+)/preview/$', 'document_preview', (), 'document_preview'), + url(r'^document/(?P\d+)/thumbnail/$', 'document_thumbnail', (), 'document_thumbnail'), url(r'^document/(?P\d+)/download/$', 'document_download', (), 'document_download'), url(r'^staging_file/(?P\w+)/preview/$', 'staging_file_preview', (), 'staging_file_preview'), diff --git a/apps/documents/views.py b/apps/documents/views.py index d336871de8..e9b19a7ed6 100644 --- a/apps/documents/views.py +++ b/apps/documents/views.py @@ -10,6 +10,8 @@ from django.core.urlresolvers import reverse from django.views.generic.create_update import create_object, delete_object, update_object from django.forms.formsets import formset_factory from django.core.files.base import File +from django.conf import settings + from filetransfers.api import serve_file from converter.api import convert, in_cache @@ -29,6 +31,7 @@ from documents.conf.settings import USE_STAGING_DIRECTORY from documents.conf.settings import FILESYSTEM_FILESERVING_ENABLE from documents.conf.settings import STAGING_FILES_PREVIEW_SIZE from documents.conf.settings import PREVIEW_SIZE +from documents.conf.settings import THUMBNAIL_SIZE def document_list(request): return object_list( @@ -41,6 +44,8 @@ def document_list(request): {'name':_(u'mimetype'), 'attribute':'file_mimetype'}, {'name':_(u'added'), 'attribute':lambda x: x.date_added.date()}, {'name':_(u'file size'), 'attribute':lambda x: pretty_size(x.file.storage.size(x.file.path)) if x.exists() else '-'}, + {'name':_(u'thumbnail'), 'attribute': + lambda x: '' % reverse('document_thumbnail', args=[x.id])}, ], }, ) @@ -274,10 +279,10 @@ def document_edit(request, document_id): }, context_instance=RequestContext(request)) -def document_preview(request, document_id): +def get_document_image(request, document_id, size=PREVIEW_SIZE): document = get_object_or_404(Document, pk=document_id) - filepath = in_cache(document.uuid, PREVIEW_SIZE) + filepath = in_cache(document.uuid, size) if filepath: return serve_file(request, File(file=open(filepath, 'r'))) @@ -286,12 +291,24 @@ def document_preview(request, document_id): document.file.open() desc = document.file.storage.open(document.file.path) filepath = from_descriptor_to_tempfile(desc, document.uuid) - output_file = convert(filepath, PREVIEW_SIZE) + output_file = convert(filepath, size) + print document_id, output_file return serve_file(request, File(file=open(output_file, 'r'))) except Exception, e: + if size == THUMBNAIL_SIZE: + return serve_file(request, File(file=open('%simages/picture_error.png' % settings.MEDIA_ROOT, 'r'))) + else: + return serve_file(request, File(file=open('%simages/1297211435_error.png' % settings.MEDIA_ROOT, 'r'))) #messages.error(request, e) - return HttpResponse(e) - + #return HttpResponse(e) + + +def document_thumbnail(request, document_id): + return get_document_image(request, document_id, THUMBNAIL_SIZE) + + +def document_preview(request, document_id): + return get_document_image(request, document_id, PREVIEW_SIZE) def document_download(request, document_id): diff --git a/settings.py b/settings.py index 7d9d2c5cb9..be9a8e5df1 100644 --- a/settings.py +++ b/settings.py @@ -183,6 +183,7 @@ LOGIN_EXEMPT_URLS = ( #DOCUMENTS_STORAGE_DIRECTORY_NAME = 'documents' # Usage #DOCUMENTS_PREVIEW_SIZE = '640x480' +#DOCUMENTS_THUMBNAIL_SIZE = '50x50' # Serving #DOCUMENTS_FILESYSTEM_FILESERVING_ENABLE = True #DOCUMENTS_FILESYSTEM_FILESERVING_PATH = u'/tmp/mayan/documents' diff --git a/site_media/images/1297211435_error.png b/site_media/images/1297211435_error.png new file mode 100644 index 0000000000000000000000000000000000000000..439ef61b719523170aa6fe29f947e2f9d218663b GIT binary patch literal 6809 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