Added interactive zoom support to document page detail view

This commit is contained in:
Roberto Rosario
2011-04-21 02:32:30 -04:00
parent 680c33227c
commit 27d7aed25c
5 changed files with 77 additions and 17 deletions

View File

@@ -102,17 +102,17 @@ def create_image_cache_filename(input_filepath, *args, **kwargs):
return None
def in_image_cache(input_filepath, size, page=0, format=u'jpg', quality=QUALITY_DEFAULT, extra_options=u''):
output_filepath = create_image_cache_filename(input_filepath, size=size, page=page, format=format, quality=quality, extra_options=extra_options)
def in_image_cache(input_filepath, size, page=0, format=u'jpg', quality=QUALITY_DEFAULT, extra_options=u'', zoom=100):
output_filepath = create_image_cache_filename(input_filepath, size=size, page=page, format=format, quality=quality, extra_options=extra_options, zoom=zoom)
if os.path.exists(output_filepath):
return output_filepath
else:
return None
def convert(input_filepath, size, quality=QUALITY_DEFAULT, cache=True, page=0, format=u'jpg', extra_options=u'', mimetype=None, extension=None, cleanup_files=True):
def convert(input_filepath, size, quality=QUALITY_DEFAULT, cache=True, page=0, format=u'jpg', extra_options=u'', mimetype=None, extension=None, cleanup_files=True, zoom=100):
unoconv_output = None
output_filepath = create_image_cache_filename(input_filepath, size=size, page=page, format=format, quality=quality, extra_options=extra_options)
output_filepath = create_image_cache_filename(input_filepath, size=size, page=page, format=format, quality=quality, extra_options=extra_options, zoom=zoom)
if os.path.exists(output_filepath):
return output_filepath
'''
@@ -129,6 +129,8 @@ def convert(input_filepath, size, quality=QUALITY_DEFAULT, cache=True, page=0, f
try:
input_arg = u'%s[%s]' % (input_filepath, page)
extra_options += u' -resize %s' % size
if zoom != 100:
extra_options += ' -resize %d%% ' % zoom
backend.execute_convert(input_filepath=input_arg, arguments=extra_options, output_filepath=u'%s:%s' % (format, output_filepath), quality=quality)
finally:
if cleanup_files:

View File

@@ -65,21 +65,20 @@ document_page_transformation_page_transformation_list = {'text': _('page transfo
document_page_view = {'text': _('page image'), 'view': 'document_page_view', 'args': 'object.id', 'famfam': 'page_white', 'permissions': {'namespace': 'documents', 'permissions': [PERMISSION_DOCUMENT_VIEW]}}
document_page_text = {'text': _('page text'), 'view': 'document_page_text', 'args': 'object.id', 'famfam': 'page_white', 'permissions': {'namespace': 'documents', 'permissions': [PERMISSION_DOCUMENT_VIEW]}}
document_page_edit = {'text': _('edit page'), 'view': 'document_page_edit', 'args': 'object.id', 'famfam': 'page_white', 'permissions': {'namespace': 'documents', 'permissions': [PERMISSION_DOCUMENT_EDIT]}}
document_page_edit = {'text': _('edit page text'), 'view': 'document_page_edit', 'args': 'object.id', 'famfam': 'page_white', 'permissions': {'namespace': 'documents', 'permissions': [PERMISSION_DOCUMENT_EDIT]}}
document_page_navigation_next = {'text': _('next page'), 'view': 'document_page_navigation_next', 'args': 'object.id', 'famfam': 'resultset_next', 'permissions': {'namespace': 'documents', 'permissions': [PERMISSION_DOCUMENT_VIEW]}}
document_page_navigation_previous = {'text': _('previous page'), 'view': 'document_page_navigation_previous', 'args': 'object.id', 'famfam': 'resultset_previous', 'permissions': {'namespace': 'documents', 'permissions': [PERMISSION_DOCUMENT_VIEW]}}
document_page_navigation_first = {'text': _('first page'), 'view': 'document_page_navigation_first', 'args': 'object.id', 'famfam': 'resultset_first', 'permissions': {'namespace': 'documents', 'permissions': [PERMISSION_DOCUMENT_VIEW]}}
document_page_navigation_last = {'text': _('last page'), 'view': 'document_page_navigation_last', 'args': 'object.id', 'famfam': 'resultset_last', 'permissions': {'namespace': 'documents', 'permissions': [PERMISSION_DOCUMENT_VIEW]}}
document_page_zoom_in = {'text': _('zoom in'), 'view': 'document_page_zoom_in', 'args': 'object.id', 'famfam': 'zoom_in', 'permissions': {'namespace': 'documents', 'permissions': [PERMISSION_DOCUMENT_VIEW]}}
document_page_zoom_out = {'text': _('zoom out'), 'view': 'document_page_zoom_out', 'args': 'object.id', 'famfam': 'zoom_out', 'permissions': {'namespace': 'documents', 'permissions': [PERMISSION_DOCUMENT_VIEW]}}
document_missing_list = {'text': _('Find missing document files'), 'view': 'document_missing_list', 'famfam': 'folder_page', 'permissions': {'namespace': 'documents', 'permissions': [PERMISSION_DOCUMENT_VIEW]}}
staging_file_preview = {'text': _('preview'), 'class': 'fancybox-noscaling', 'view': 'staging_file_preview', 'args': 'object.id', 'famfam': 'drive_magnify'}
staging_file_delete = {'text': _('delete'), 'view': 'staging_file_delete', 'args': 'object.id', 'famfam': 'drive_delete'}
#register_links(Document, [document_view_simple, document_view, document_edit, document_edit_metadata, document_delete, document_download, document_find_duplicates, document_clear_transformations], menu_name='sidebar')
#register_links(Document, [document_list_recent, document_list, document_create, document_create_multiple, document_create_sibling], menu_name='sidebar')
register_links(Document, [document_view_simple, document_view, document_edit, document_edit_metadata, document_delete, document_download, document_find_duplicates, document_clear_transformations])
#register_links(Document, [document_list_recent, document_list, document_create, document_create_multiple, document_create_sibling], menu_name='sidebar')
register_links(Document, [document_create_sibling], menu_name='sidebar')
register_multi_item_links(['document_list', 'document_list_recent'], [document_multiple_clear_transformations, document_multiple_edit_metadata, document_multiple_delete])
@@ -89,7 +88,15 @@ if ENABLE_SINGLE_DOCUMENT_UPLOAD:
else:
register_links(['document_list_recent', 'document_list', 'document_create', 'document_create_multiple', 'upload_document_with_type', 'upload_multiple_documents_with_type'], [document_list_recent, document_list, document_create_multiple], menu_name='sidebar')
register_links(DocumentPage, [document_page_transformation_list, document_page_view, document_page_text, document_page_edit, document_page_navigation_first, document_page_navigation_previous, document_page_navigation_next, document_page_navigation_last])
register_links(DocumentPage, [
document_page_transformation_list, document_page_view,
document_page_text, document_page_edit,
document_page_navigation_first, document_page_navigation_previous,
document_page_navigation_next, document_page_navigation_last
])
register_links(['document_page_view'], [document_page_zoom_in, document_page_zoom_out], menu_name='sidebar')
register_links(DocumentPageTransformation, [document_page_transformation_edit, document_page_transformation_delete])
register_links(DocumentPageTransformation, [document_page_transformation_page_edit, document_page_transformation_page_view], menu_name='sidebar')

View File

@@ -30,11 +30,14 @@ class DocumentPageTransformationForm(forms.ModelForm):
class DocumentPageImageWidget(forms.widgets.Widget):
def render(self, name, value, attrs=None):
final_attrs = self.build_attrs(attrs)
zoom = final_attrs.get('zoom', 100)
if value:
output = []
output.append('<div class="full-height scrollable" style="overflow: auto;"><img src="%(img)s?page=%(page)s" /></div>' % {
output.append('<div class="full-height scrollable" style="overflow: auto;"><img src="%(img)s?page=%(page)d&zoom=%(zoom)d" /></div>' % {
'img': reverse('document_display', args=[value.document.id]),
'page': value.page_number,
'zoom': zoom,
})
return mark_safe(u''.join(output))
else:
@@ -47,10 +50,12 @@ class DocumentPageForm(DetailForm):
exclude = ('document', 'document_type', 'page_label', 'content')
def __init__(self, *args, **kwargs):
zoom = kwargs.pop('zoom', 100)
super(DocumentPageForm, self).__init__(*args, **kwargs)
self.fields['page_image'].initial = self.instance
self.fields['page_image'].widget.attrs.update({'zoom': zoom})
page_image = forms.CharField(widget=DocumentPageImageWidget(attrs={'height': '100px'}))
page_image = forms.CharField(widget=DocumentPageImageWidget())
class DocumentPageForm_text(DetailForm):
@@ -93,8 +98,8 @@ class ImageWidget(forms.widgets.Widget):
output.append(
u'''<div style="display: inline-block; border: 1px solid black; margin: 10px;">
<div class="tc">%(page_string)s %(page)s</div>
<a rel="page_gallery" class="fancybox-noscaling" href="%(view_url)s?page=%(page)s">
<img src="%(img)s?page=%(page)s" />
<a rel="page_gallery" class="fancybox-noscaling" href="%(view_url)s?page=%(page)d">
<img src="%(img)s?page=%(page)d" />
</a>
<div class="tc">
<a class="fancybox-iframe" href="%(url)s"><span class="famfam active famfam-page_white_go"></span>%(details_string)s</a>
@@ -164,7 +169,8 @@ class DocumentContentForm(forms.Form):
contents = forms.CharField(
label=_(u'Contents'),
widget=forms.widgets.Textarea(attrs={'rows': 14, 'cols': 80, 'readonly': 'readonly'}))
widget=forms.widgets.Textarea(attrs={'rows': 14, 'cols': 80, 'readonly': 'readonly'})
)
class DocumentForm_view(DetailForm):

View File

@@ -48,6 +48,8 @@ urlpatterns = patterns('documents.views',
url(r'^document/page/(?P<document_page_id>\d+)/navigation/previous/$', 'document_page_navigation_previous', (), 'document_page_navigation_previous'),
url(r'^document/page/(?P<document_page_id>\d+)/navigation/first/$', 'document_page_navigation_first', (), 'document_page_navigation_first'),
url(r'^document/page/(?P<document_page_id>\d+)/navigation/last/$', 'document_page_navigation_last', (), 'document_page_navigation_last'),
url(r'^document/page/(?P<document_page_id>\d+)/zoom/in/$', 'document_page_zoom_in', (), 'document_page_zoom_in'),
url(r'^document/page/(?P<document_page_id>\d+)/zoom/out/$', 'document_page_zoom_out', (), 'document_page_zoom_out'),
url(r'^document/page/(?P<document_page_id>\d+)/transformation/list/$', 'document_page_transformation_list', (), 'document_page_transformation_list'),
url(r'^document/page/(?P<document_page_id>\d+)/transformation/create/$', 'document_page_transformation_create', (), 'document_page_transformation_create'),

View File

@@ -545,13 +545,18 @@ def get_document_image(request, document_id, size=PREVIEW_SIZE, quality=QUALITY_
pass
tranformation_string = ' '.join(transformation_list)
zoom = int(request.GET.get('zoom', 100))
if zoom > 200:
zoom = 200
try:
filepath = in_image_cache(document.checksum, size=size, quality=quality, extra_options=tranformation_string, page=page - 1)
filepath = in_image_cache(document.checksum, size=size, quality=quality, extra_options=tranformation_string, page=page - 1, zoom=zoom)
if filepath:
return sendfile.sendfile(request, filename=filepath)
#Save to a temporary location
filepath = document_save_to_temp_dir(document, filename=document.checksum)
output_file = convert(filepath, size=size, format='jpg', quality=quality, extra_options=tranformation_string, page=page - 1)
output_file = convert(filepath, size=size, format='jpg', quality=quality, extra_options=tranformation_string, page=page - 1, zoom=zoom)
return sendfile.sendfile(request, filename=output_file)
except UnkownConvertError, e:
if request.user.is_staff or request.user.is_superuser:
@@ -893,8 +898,10 @@ def document_page_view(request, document_page_id):
check_permissions(request.user, 'documents', [PERMISSION_DOCUMENT_VIEW])
document_page = get_object_or_404(DocumentPage, pk=document_page_id)
document_page_form = DocumentPageForm(instance=document_page)
zoom = int(request.GET.get('zoom', 100))
document_page_form = DocumentPageForm(instance=document_page, zoom=zoom)
form_list = [
{
'form': document_page_form,
@@ -1004,3 +1011,39 @@ def document_list_recent(request):
'multi_select_as_buttons': True,
'hide_links': True
}, context_instance=RequestContext(request))
def document_page_zoom_in(request, document_page_id):
check_permissions(request.user, 'documents', [PERMISSION_DOCUMENT_VIEW])
view = resolve_to_name(urlparse.urlparse(request.META.get('HTTP_REFERER', '/')).path)
document_page = get_object_or_404(DocumentPage, pk=document_page_id)
#TODO: Improve this hack
query = urlparse.urlparse(request.META.get('HTTP_REFERER', '/')).query.split(u'=')
try:
zoom = int(query[1])
except:
zoom = 100
zoom += 50
if zoom > 200:
zoom = 200
return HttpResponseRedirect(reverse(view, args=[document_page.pk]) + u'?zoom=%s' % zoom)
def document_page_zoom_out(request, document_page_id):
check_permissions(request.user, 'documents', [PERMISSION_DOCUMENT_VIEW])
view = resolve_to_name(urlparse.urlparse(request.META.get('HTTP_REFERER', '/')).path)
document_page = get_object_or_404(DocumentPage, pk=document_page_id)
#TODO: Improve this hack
query = urlparse.urlparse(request.META.get('HTTP_REFERER', '/')).query.split(u'=')
try:
zoom = int(query[1])
except:
zoom = 100
zoom -= 50
if zoom <50:
zoom = 50
return HttpResponseRedirect(reverse(view, args=[document_page.pk]) + u'?zoom=%s' % zoom)