Further converter refactor and initial move from document-centric to page-centric image generation. Issue #93.
This commit is contained in:
@@ -36,7 +36,7 @@ from .serializers import (
|
||||
RecentDocumentSerializer
|
||||
)
|
||||
from .settings import DISPLAY_SIZE, ZOOM_MAX_LEVEL, ZOOM_MIN_LEVEL
|
||||
from .tasks import task_get_document_image, task_new_document
|
||||
from .tasks import task_get_document_page_image, task_new_document
|
||||
|
||||
|
||||
class APIDocumentListView(generics.ListAPIView):
|
||||
@@ -202,8 +202,10 @@ class APIDocumentImageView(generics.GenericAPIView):
|
||||
|
||||
rotation = int(request.GET.get('rotation', DEFAULT_ROTATION)) % 360
|
||||
|
||||
document_page = document.pages.get(page_number=page)
|
||||
|
||||
try:
|
||||
task = task_get_document_image.apply_async(kwargs=dict(document_id=document.pk, size=size, page=page, zoom=zoom, rotation=rotation, as_base64=True, version=version), queue='converter')
|
||||
task = task_get_document_page_image.apply_async(kwargs=dict(document_page_id=document_page.pk, size=size, zoom=zoom, rotation=rotation, as_base64=True, version=version), queue='converter')
|
||||
return Response({
|
||||
'status': 'success',
|
||||
'data': task.get(timeout=DOCUMENT_IMAGE_TASK_TIMEOUT)
|
||||
|
||||
@@ -17,6 +17,7 @@ from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
from acls.utils import apply_default_acls
|
||||
from common.settings import TEMPORARY_DIRECTORY
|
||||
from common.utils import fs_cleanup
|
||||
from converter.classes import Converter
|
||||
from converter.exceptions import UnknownFileFormat
|
||||
from converter.literals import (
|
||||
@@ -526,7 +527,15 @@ class DocumentPage(models.Model):
|
||||
def document(self):
|
||||
return self.document_version.document
|
||||
|
||||
def get_image(self, *args, **kargs):
|
||||
def get_uuid(self):
|
||||
return 'page-cache-{}'.format(self.pk)
|
||||
|
||||
def get_cache_filename(self):
|
||||
return os.path.join(CACHE_PATH, self.get_uuid())
|
||||
|
||||
def get_image(self, *args, **kwargs):
|
||||
transformations = kwargs.pop('transformations', [])
|
||||
|
||||
#size=DISPLAY_SIZE, page=DEFAULT_PAGE_NUMBER, zoom=DEFAULT_ZOOM_LEVEL, rotation=DEFAULT_ROTATION, as_base64=False, version=None):
|
||||
#if zoom < ZOOM_MIN_LEVEL:
|
||||
# zoom = ZOOM_MIN_LEVEL
|
||||
@@ -538,20 +547,34 @@ class DocumentPage(models.Model):
|
||||
|
||||
#file_path = self.get_valid_image(size=size, page=page, zoom=zoom, rotation=rotation, version=version)
|
||||
#logger.debug('file_path: %s', file_path)
|
||||
as_base64 = kwargs.pop('as_base64', False)
|
||||
|
||||
converter = Converter(file_object=self.document_version.open())
|
||||
data = converter.convert(page=self.page_number)
|
||||
#print "data!!!!", data.getvalue()
|
||||
##, *args, **kwargs):
|
||||
return 'data:%s;base64,%s' % ('PNG', base64.b64encode(data.getvalue()))
|
||||
cache_filename = self.get_cache_filename()
|
||||
|
||||
#if as_base64:
|
||||
# with open(file_path, 'r') as file_object:
|
||||
# #mimetype = get_mimetype(file_object=file_object, mimetype_only=True)[0]
|
||||
# base64_data = base64.b64encode(file_object.read())
|
||||
# return 'data:%s;base64,%s' % (mimetype, base64_data)
|
||||
#else:
|
||||
# return file_path
|
||||
if os.path.exists(cache_filename) and 0:
|
||||
with open(cache_filename) as file_object:
|
||||
data = file_object.read()
|
||||
|
||||
if as_base64:
|
||||
return 'data:%s;base64,%s' % ('image/png', base64.b64encode(data))
|
||||
else:
|
||||
return data
|
||||
else:
|
||||
try:
|
||||
converter = Converter(file_object=self.document_version.open())
|
||||
image_buffer = converter.convert(page=self.page_number, output_format='PNG')
|
||||
with open(cache_filename, 'wb+') as file_object:
|
||||
file_object.write(image_buffer.getvalue())
|
||||
except:
|
||||
fs_cleanup(cache_filename)
|
||||
raise
|
||||
else:
|
||||
data = image_buffer.getvalue()
|
||||
image_buffer.close()
|
||||
if as_base64:
|
||||
return 'data:%s;base64,%s' % ('image/png', base64.b64encode(data))
|
||||
else:
|
||||
return data
|
||||
|
||||
|
||||
def argument_validator(value):
|
||||
|
||||
@@ -9,16 +9,15 @@ from mayan.celery import app
|
||||
|
||||
from common.models import SharedUploadedFile
|
||||
|
||||
from .models import Document, DocumentType, DocumentVersion
|
||||
from .models import Document, DocumentPage, DocumentType, DocumentVersion
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
@app.task(compression='zlib')
|
||||
def task_get_document_image(document_id, *args, **kwargs):
|
||||
document = Document.objects.get(pk=document_id)
|
||||
first_page = document.latest_version.pages.first()
|
||||
return first_page.get_image(*args, **kwargs)
|
||||
def task_get_document_page_image(document_page_id, *args, **kwargs):
|
||||
document_page = DocumentPage.objects.get(pk=document_page_id)
|
||||
return document_page.get_image(*args, **kwargs)
|
||||
|
||||
|
||||
@app.task(ignore_result=True)
|
||||
|
||||
@@ -57,7 +57,8 @@ from .settings import (
|
||||
ZOOM_MAX_LEVEL, ZOOM_MIN_LEVEL
|
||||
)
|
||||
from .tasks import (
|
||||
task_clear_image_cache, task_get_document_image, task_update_page_count
|
||||
task_clear_image_cache, task_get_document_page_image,
|
||||
task_update_page_count
|
||||
)
|
||||
from .utils import parse_range
|
||||
|
||||
@@ -366,17 +367,15 @@ def get_document_image(request, document_id, size=PREVIEW_SIZE):
|
||||
|
||||
rotation = int(request.GET.get('rotation', DEFAULT_ROTATION)) % 360
|
||||
|
||||
task = task_get_document_image.apply_async(kwargs=dict(document_id=document.pk, size=size, page=page, zoom=zoom, rotation=rotation, as_base64=False, version=version), queue='converter')
|
||||
document_page = document.pages.get(page_number=page)
|
||||
|
||||
task = task_get_document_page_image.apply_async(kwargs=dict(document_page_id=document_page.pk, size=size, zoom=zoom, rotation=rotation, as_base64=False, version=version), queue='converter')
|
||||
data = task.get(timeout=DOCUMENT_IMAGE_TASK_TIMEOUT)
|
||||
|
||||
response = HttpResponse(data, content_type='data/PNG')
|
||||
#response['Content-Disposition'] = 'attachment; filename="somefilename.pdf"'
|
||||
|
||||
response = HttpResponse(data, content_type='image')
|
||||
return response
|
||||
|
||||
#print 'data!!!!!!!!!!!', task.get(timeout=DOCUMENT_IMAGE_TASK_TIMEOUT)
|
||||
#re
|
||||
|
||||
# TODO: remove sendfile
|
||||
#return sendfile.sendfile(request, task.get(timeout=DOCUMENT_IMAGE_TASK_TIMEOUT), mimetype=DEFAULT_FILE_FORMAT_MIMETYPE)
|
||||
|
||||
|
||||
|
||||
@@ -24,7 +24,7 @@ class DocumentPageImageWidget(forms.widgets.Widget):
|
||||
if value:
|
||||
output = []
|
||||
output.append('<div class="full-height scrollable mayan-page-wrapper-interactive" data-height-difference=230>')
|
||||
output.append(document_html_widget(value.document, page=value.page_number, zoom=zoom, rotation=rotation, image_class='lazy-load-interactive', nolazyload=False, size=DISPLAY_SIZE))
|
||||
output.append(document_html_widget(value, zoom=zoom, rotation=rotation, image_class='lazy-load-interactive', nolazyload=False, size=DISPLAY_SIZE))
|
||||
output.append('</div>')
|
||||
return mark_safe(''.join(output))
|
||||
else:
|
||||
@@ -46,21 +46,16 @@ class DocumentPagesCarouselWidget(forms.widgets.Widget):
|
||||
document_pages = []
|
||||
total_pages = 0
|
||||
|
||||
# Reuse expensive values
|
||||
latest_version_pk = value.latest_version.pk
|
||||
|
||||
for page in document_pages:
|
||||
output.append('<div class="carousel-item">')
|
||||
output.append(
|
||||
document_html_widget(
|
||||
page.document,
|
||||
page,
|
||||
click_view='documents:document_page_view',
|
||||
click_view_arguments=[page.pk],
|
||||
page=page.page_number,
|
||||
fancybox_class='',
|
||||
image_class='lazy-load-carousel',
|
||||
size=DISPLAY_SIZE,
|
||||
version=latest_version_pk,
|
||||
post_load_class='lazy-load-carousel-loaded',
|
||||
)
|
||||
)
|
||||
@@ -73,29 +68,25 @@ class DocumentPagesCarouselWidget(forms.widgets.Widget):
|
||||
|
||||
|
||||
def document_thumbnail(document, **kwargs):
|
||||
return document_html_widget(document, click_view='documents:document_display', **kwargs)
|
||||
return document_html_widget(document.latest_version.pages.first(), click_view='documents:document_display', **kwargs)
|
||||
|
||||
|
||||
def document_link(document):
|
||||
return mark_safe('<a href="%s">%s</a>' % (document.get_absolute_url(), document))
|
||||
|
||||
|
||||
def document_html_widget(document, click_view=None, click_view_arguments=None, page=DEFAULT_PAGE_NUMBER, zoom=DEFAULT_ZOOM_LEVEL, rotation=DEFAULT_ROTATION, gallery_name=None, fancybox_class='fancybox', version=None, image_class='lazy-load', title=None, size=THUMBNAIL_SIZE, nolazyload=False, post_load_class=None):
|
||||
def document_html_widget(document_page, click_view=None, click_view_arguments=None, zoom=DEFAULT_ZOOM_LEVEL, rotation=DEFAULT_ROTATION, gallery_name=None, fancybox_class='fancybox', image_class='lazy-load', title=None, size=THUMBNAIL_SIZE, nolazyload=False, post_load_class=None):
|
||||
result = []
|
||||
|
||||
alt_text = _('Document page image')
|
||||
|
||||
if not version:
|
||||
try:
|
||||
version = document.latest_version.pk
|
||||
except AttributeError:
|
||||
version = None
|
||||
document = document_page.document
|
||||
page = document_page.page_number
|
||||
|
||||
query_dict = {
|
||||
'page': page,
|
||||
'zoom': zoom,
|
||||
'rotation': rotation,
|
||||
'version': version,
|
||||
'size': size,
|
||||
}
|
||||
|
||||
@@ -116,7 +107,12 @@ def document_html_widget(document, click_view=None, click_view_arguments=None, p
|
||||
title_template = ''
|
||||
|
||||
if click_view:
|
||||
result.append('<a %s class="%s" href="%s" %s>' % (gallery_template, fancybox_class, '%s?%s' % (reverse(click_view, args=click_view_arguments or [document.pk]), query_string), title_template))
|
||||
result.append('<a {gallery_template} class="{fancybox_class}" href="{image_data}" {title_template}>'.format(
|
||||
gallery_template=gallery_template,
|
||||
fancybox_class=fancybox_class,
|
||||
image_data='%s?%s' % (reverse(click_view, args=click_view_arguments or [document.pk]), query_string),
|
||||
title_template=title_template
|
||||
))
|
||||
|
||||
if nolazyload:
|
||||
result.append('<img class="img-nolazyload" src="%s" alt="%s" />' % (preview_view, alt_text))
|
||||
|
||||
Reference in New Issue
Block a user