Convert documents app to new transformation system

This commit is contained in:
Roberto Rosario
2015-06-08 15:56:57 -04:00
parent 506d53c58a
commit 9db47a843f
12 changed files with 112 additions and 294 deletions

View File

@@ -3,8 +3,8 @@ from __future__ import unicode_literals
from django.contrib import admin
from .models import (
Document, DocumentPage, DocumentPageTransformation, DocumentType,
DocumentTypeFilename, DocumentVersion, RecentDocument
Document, DocumentPage, DocumentType, DocumentTypeFilename,
DocumentVersion, RecentDocument
)
@@ -35,10 +35,6 @@ class DocumentTypeAdmin(admin.ModelAdmin):
]
class DocumentPageTransformationAdmin(admin.ModelAdmin):
model = DocumentPageTransformation
class DocumentAdmin(admin.ModelAdmin):
inlines = [
DocumentVersionInline
@@ -55,7 +51,5 @@ class RecentDocumentAdmin(admin.ModelAdmin):
admin.site.register(Document, DocumentAdmin)
admin.site.register(DocumentPageTransformation,
DocumentPageTransformationAdmin)
admin.site.register(DocumentType, DocumentTypeAdmin)
admin.site.register(RecentDocument, RecentDocumentAdmin)

View File

@@ -16,6 +16,11 @@ from common import (
from common.api import register_maintenance_links
from common.classes import ModelAttribute
from common.utils import encapsulate, validate_path
from converter.permissions import (
PERMISSION_TRANSFORMATION_CREATE,
PERMISSION_TRANSFORMATION_DELETE, PERMISSION_TRANSFORMATION_EDIT,
PERMISSION_TRANSFORMATION_VIEW,
)
from dynamic_search.classes import SearchModel
from events.permissions import PERMISSION_EVENTS_VIEW
from navigation.api import register_model_list_columns
@@ -37,10 +42,7 @@ from .links import (
link_document_page_navigation_next,
link_document_page_navigation_previous, link_document_page_return,
link_document_page_rotate_left, link_document_page_rotate_right,
link_document_page_transformation_list,
link_document_page_transformation_create,
link_document_page_transformation_edit,
link_document_page_transformation_delete, link_document_page_view,
link_document_page_transformation_list, link_document_page_view,
link_document_page_view_reset, link_document_page_zoom_in,
link_document_page_zoom_out, link_document_preview, link_document_print,
link_document_properties, link_document_type_create,
@@ -52,15 +54,14 @@ from .links import (
link_document_version_list, link_document_version_revert
)
from .models import (
Document, DocumentPage, DocumentPageTransformation, DocumentType,
DocumentTypeFilename, DocumentVersion
Document, DocumentPage, DocumentType, DocumentTypeFilename,
DocumentVersion
)
from .permissions import (
PERMISSION_DOCUMENT_DELETE, PERMISSION_DOCUMENT_DOWNLOAD,
PERMISSION_DOCUMENT_EDIT, PERMISSION_DOCUMENT_NEW_VERSION,
PERMISSION_DOCUMENT_PRINT, PERMISSION_DOCUMENT_PROPERTIES_EDIT,
PERMISSION_DOCUMENT_TRANSFORM, PERMISSION_DOCUMENT_VERSION_REVERT,
PERMISSION_DOCUMENT_VIEW
PERMISSION_DOCUMENT_VERSION_REVERT, PERMISSION_DOCUMENT_VIEW
)
from .settings import THUMBNAIL_SIZE
from .statistics import DocumentStatistics, DocumentUsageStatistics
@@ -77,7 +78,7 @@ class DocumentsApp(apps.AppConfig):
APIEndPoint('documents')
DocumentPage.add_to_class('get_transformation_list', lambda document_page: DocumentPageTransformation.objects.get_for_document_page_as_list(document_page))
DocumentPage.add_to_class('get_transformation_list', lambda document_page: Transformation.objects.get_for_object(document_page))
MissingItem(label=_('Create a document type'), description=_('Every uploaded document must be assigned a document type, it is the basic way Mayan EDMS categorizes documents.'), condition=lambda: not DocumentType.objects.exists(), view='documents:document_type_list')
@@ -91,8 +92,10 @@ class DocumentsApp(apps.AppConfig):
PERMISSION_DOCUMENT_DOWNLOAD, PERMISSION_DOCUMENT_EDIT,
PERMISSION_DOCUMENT_NEW_VERSION, PERMISSION_DOCUMENT_PRINT,
PERMISSION_DOCUMENT_PROPERTIES_EDIT,
PERMISSION_DOCUMENT_TRANSFORM, PERMISSION_DOCUMENT_VERSION_REVERT,
PERMISSION_DOCUMENT_VIEW, PERMISSION_EVENTS_VIEW
PERMISSION_DOCUMENT_VERSION_REVERT, PERMISSION_DOCUMENT_VIEW,
PERMISSION_EVENTS_VIEW, PERMISSION_TRANSFORMATION_CREATE,
PERMISSION_TRANSFORMATION_DELETE, PERMISSION_TRANSFORMATION_EDIT,
PERMISSION_TRANSFORMATION_VIEW,
])
document_search = SearchModel('documents', 'Document', permission=PERMISSION_DOCUMENT_VIEW, serializer_string='documents.serializers.DocumentSerializer')
@@ -135,8 +138,6 @@ class DocumentsApp(apps.AppConfig):
menu_facet.bind_links(links=[link_document_page_rotate_left, link_document_page_rotate_right, link_document_page_zoom_in, link_document_page_zoom_out, link_document_page_view_reset], sources=['documents:document_page_view'])
menu_facet.bind_links(links=[link_document_page_return, link_document_page_view], sources=[DocumentPage])
menu_facet.bind_links(links=[link_document_page_navigation_first, link_document_page_navigation_previous, link_document_page_navigation_next, link_document_page_navigation_last, link_document_page_transformation_list], sources=[DocumentPage])
menu_object.bind_links(links=[link_document_page_transformation_edit, link_document_page_transformation_delete], sources=[DocumentPageTransformation])
menu_sidebar.bind_links(links=[link_document_page_transformation_create], sources=[DocumentPage, 'documents:document_page_transformation_create'])
namespace = StatisticNamespace(name='documents', label=_('Documents'))
namespace.add_statistic(DocumentStatistics(name='document_stats', label=_('Document tendencies')))

View File

@@ -10,24 +10,13 @@ from common.forms import DetailForm
from common.widgets import TextAreaDiv
from .models import (
Document, DocumentType, DocumentPage, DocumentPageTransformation,
DocumentTypeFilename
Document, DocumentType, DocumentPage, DocumentTypeFilename
)
from .literals import DEFAULT_ZIP_FILENAME
from .widgets import DocumentPagesCarouselWidget, DocumentPageImageWidget
# Document page forms
class DocumentPageTransformationForm(forms.ModelForm):
class Meta:
fields = ('document_page', 'order', 'transformation', 'arguments')
model = DocumentPageTransformation
def __init__(self, *args, **kwargs):
super(DocumentPageTransformationForm, self).__init__(*args, **kwargs)
self.fields['document_page'].widget = forms.HiddenInput()
class DocumentPageForm(DetailForm):
class Meta:
fields = ()

View File

@@ -3,17 +3,19 @@ from __future__ import absolute_import, unicode_literals
from django.utils.translation import ugettext_lazy as _
from acls.permissions import ACLS_VIEW_ACL
from converter.permissions import (
PERMISSION_TRANSFORMATION_DELETE, PERMISSION_TRANSFORMATION_VIEW
)
from events.permissions import PERMISSION_EVENTS_VIEW
from navigation import Link
from .permissions import (
PERMISSION_DOCUMENT_DELETE, PERMISSION_DOCUMENT_DOWNLOAD,
PERMISSION_DOCUMENT_EDIT, PERMISSION_DOCUMENT_PROPERTIES_EDIT,
PERMISSION_DOCUMENT_PRINT, PERMISSION_DOCUMENT_TRANSFORM,
PERMISSION_DOCUMENT_TOOLS, PERMISSION_DOCUMENT_VERSION_REVERT,
PERMISSION_DOCUMENT_VIEW, PERMISSION_DOCUMENT_TYPE_CREATE,
PERMISSION_DOCUMENT_TYPE_DELETE, PERMISSION_DOCUMENT_TYPE_EDIT,
PERMISSION_DOCUMENT_TYPE_VIEW
PERMISSION_DOCUMENT_PRINT, PERMISSION_DOCUMENT_TOOLS,
PERMISSION_DOCUMENT_VERSION_REVERT, PERMISSION_DOCUMENT_VIEW,
PERMISSION_DOCUMENT_TYPE_CREATE, PERMISSION_DOCUMENT_TYPE_DELETE,
PERMISSION_DOCUMENT_TYPE_EDIT, PERMISSION_DOCUMENT_TYPE_VIEW
)
from .settings import ZOOM_MAX_LEVEL, ZOOM_MIN_LEVEL
@@ -23,11 +25,11 @@ def is_not_current_version(context):
def is_first_page(context):
return context['page'].page_number <= 1
return context['resolved_object'].page_number <= 1
def is_last_page(context):
return context['page'].page_number >= context['page'].document_version.pages.count()
return context['resolved_object'].page_number >= context['resolved_object'].document_version.pages.count()
def is_max_zoom(context):
@@ -47,7 +49,7 @@ link_document_properties = Link(permissions=[PERMISSION_DOCUMENT_VIEW], text=_('
link_document_version_list = Link(permissions=[PERMISSION_DOCUMENT_VIEW], text=_('Versions'), view='documents:document_version_list', args='object.pk')
# Actions
link_document_clear_transformations = Link(permissions=[PERMISSION_DOCUMENT_TRANSFORM], text=_('Clear transformations'), view='documents:document_clear_transformations', args='object.id')
link_document_clear_transformations = Link(permissions=[PERMISSION_TRANSFORMATION_DELETE], text=_('Clear transformations'), view='documents:document_clear_transformations', args='object.id')
link_document_delete = Link(permissions=[PERMISSION_DOCUMENT_DELETE], tags='dangerous', text=_('Delete'), view='documents:document_delete', args='object.id')
link_document_edit = Link(permissions=[PERMISSION_DOCUMENT_PROPERTIES_EDIT], text=_('Edit properties'), view='documents:document_edit', args='object.id')
link_document_document_type_edit = Link(permissions=[PERMISSION_DOCUMENT_PROPERTIES_EDIT], text=_('Change type'), view='documents:document_document_type_edit', args='object.id')
@@ -58,11 +60,11 @@ link_document_update_page_count = Link(permissions=[PERMISSION_DOCUMENT_TOOLS],
# Views
link_document_list = Link(icon='fa fa-file', text=_('All documents'), view='documents:document_list')
link_document_list_recent = Link(icon='fa fa-clock-o', text=_('Recent documents'), view='documents:document_list_recent')
link_document_multiple_clear_transformations = Link(permissions=[PERMISSION_DOCUMENT_TRANSFORM], text=_('Clear transformations'), view='documents:document_multiple_clear_transformations')
link_document_multiple_clear_transformations = Link(permissions=[PERMISSION_TRANSFORMATION_DELETE], text=_('Clear transformations'), view='documents:document_multiple_clear_transformations')
link_document_multiple_delete = Link(permissions=[PERMISSION_DOCUMENT_DELETE], tags='dangerous', text=_('Delete'), view='documents:document_multiple_delete')
link_document_multiple_document_type_edit = Link(permissions=[PERMISSION_DOCUMENT_PROPERTIES_EDIT], text=_('Change type'), view='documents:document_multiple_document_type_edit')
link_document_multiple_download = Link(permissions=[PERMISSION_DOCUMENT_DOWNLOAD], text=_('Download'), view='documents:document_multiple_download')
link_document_multiple_update_page_count = Link(permissions=[PERMISSION_DOCUMENT_TOOLS], text=_('Reset page count'), view= 'documents:document_multiple_update_page_count')
link_document_multiple_update_page_count = Link(permissions=[PERMISSION_DOCUMENT_TOOLS], text=_('Reset page count'), view='documents:document_multiple_update_page_count')
link_document_version_download = Link(args='object.pk', permissions=[PERMISSION_DOCUMENT_DOWNLOAD], text=_('Download'), view='documents:document_version_download')
# Tools
@@ -73,21 +75,19 @@ link_clear_image_cache = Link(
)
# Document pages
link_document_page_transformation_create = Link(args='page.pk', permissions=[PERMISSION_DOCUMENT_TRANSFORM], text= _('Create new transformation'), view='documents:document_page_transformation_create')
link_document_page_transformation_delete = Link(args='transformation.pk', permissions=[PERMISSION_DOCUMENT_TRANSFORM], tags='dangerous', text=_('Delete'), view='documents:document_page_transformation_delete')
link_document_page_transformation_edit = Link(args='transformation.pk', permissions=[PERMISSION_DOCUMENT_TRANSFORM], text=_('Edit'), view='documents:document_page_transformation_edit')
link_document_page_transformation_list = Link(args='page.pk', permissions=[PERMISSION_DOCUMENT_TRANSFORM], text=_('Transformations'), view='documents:document_page_transformation_list')
link_document_page_navigation_first = Link(conditional_disable=is_first_page, icon='fa fa-step-backward', keep_query=True, permissions=[PERMISSION_DOCUMENT_VIEW], text=_('First page'), view='documents:document_page_navigation_first', args='page.pk')
link_document_page_navigation_last = Link(conditional_disable=is_last_page, icon='fa fa-step-forward', keep_query=True, text=_('Last page'), permissions=[PERMISSION_DOCUMENT_VIEW], view='documents:document_page_navigation_last', args='page.pk')
link_document_page_navigation_previous = Link(conditional_disable=is_first_page, icon='fa fa-arrow-left', keep_query=True, permissions=[PERMISSION_DOCUMENT_VIEW], text=_('Previous page'), view='documents:document_page_navigation_previous', args='page.pk')
link_document_page_navigation_next = Link(conditional_disable=is_last_page, icon='fa fa-arrow-right', keep_query=True, text=_('Next page'), permissions=[PERMISSION_DOCUMENT_VIEW], view='documents:document_page_navigation_next', args='page.pk')
link_document_page_return = Link(icon='fa fa-file', permissions=[PERMISSION_DOCUMENT_VIEW], text=_('Document'), view='documents:document_preview', args='page.document.pk')
link_document_page_rotate_left = Link(icon='fa fa-rotate-left', permissions=[PERMISSION_DOCUMENT_VIEW], text=_('Rotate left'), view='documents:document_page_rotate_left', args='page.pk')
link_document_page_rotate_right = Link(icon='fa fa-rotate-right', permissions=[PERMISSION_DOCUMENT_VIEW], text=_('Rotate right'), view='documents:document_page_rotate_right', args='page.pk')
link_document_page_view = Link(args='page.pk', permissions=[PERMISSION_DOCUMENT_VIEW], text=_('Page image'), view='documents:document_page_view')
link_document_page_view_reset = Link(permissions=[PERMISSION_DOCUMENT_VIEW], text=_('Reset view'), view='documents:document_page_view_reset', args='page.pk')
link_document_page_zoom_in = Link(conditional_disable=is_max_zoom, icon='fa fa-search-plus', permissions=[PERMISSION_DOCUMENT_VIEW], text=_('Zoom in'), view='documents:document_page_zoom_in', args='page.pk')
link_document_page_zoom_out = Link(conditional_disable=is_min_zoom, icon='fa fa-search-minus', permissions=[PERMISSION_DOCUMENT_VIEW], text=_('Zoom out'), view='documents:document_page_zoom_out', args='page.pk')
link_document_page_transformation_list = Link(kwargs={'app_label': '"documents"', 'model': '"documentpage"', 'object_id': 'resolved_object.pk'}, permissions=[PERMISSION_TRANSFORMATION_VIEW], text=_('Transformations'), view='converter:transformation_list')
link_document_page_navigation_first = Link(conditional_disable=is_first_page, icon='fa fa-step-backward', keep_query=True, permissions=[PERMISSION_DOCUMENT_VIEW], text=_('First page'), view='documents:document_page_navigation_first', args='resolved_object.pk')
link_document_page_navigation_last = Link(conditional_disable=is_last_page, icon='fa fa-step-forward', keep_query=True, text=_('Last page'), permissions=[PERMISSION_DOCUMENT_VIEW], view='documents:document_page_navigation_last', args='resolved_object.pk')
link_document_page_navigation_previous = Link(conditional_disable=is_first_page, icon='fa fa-arrow-left', keep_query=True, permissions=[PERMISSION_DOCUMENT_VIEW], text=_('Previous page'), view='documents:document_page_navigation_previous', args='resolved_object.pk')
link_document_page_navigation_next = Link(conditional_disable=is_last_page, icon='fa fa-arrow-right', keep_query=True, text=_('Next page'), permissions=[PERMISSION_DOCUMENT_VIEW], view='documents:document_page_navigation_next', args='resolved_object.pk')
link_document_page_return = Link(icon='fa fa-file', permissions=[PERMISSION_DOCUMENT_VIEW], text=_('Document'), view='documents:document_preview', args='resolved_object.document.pk')
link_document_page_rotate_left = Link(icon='fa fa-rotate-left', permissions=[PERMISSION_DOCUMENT_VIEW], text=_('Rotate left'), view='documents:document_page_rotate_left', args='resolved_object.pk')
link_document_page_rotate_right = Link(icon='fa fa-rotate-right', permissions=[PERMISSION_DOCUMENT_VIEW], text=_('Rotate right'), view='documents:document_page_rotate_right', args='resolved_object.pk')
link_document_page_view = Link(permissions=[PERMISSION_DOCUMENT_VIEW], text=_('Page image'), view='documents:document_page_view', args='resolved_object.pk')
link_document_page_view_reset = Link(permissions=[PERMISSION_DOCUMENT_VIEW], text=_('Reset view'), view='documents:document_page_view_reset', args='resolved_object.pk')
link_document_page_zoom_in = Link(conditional_disable=is_max_zoom, icon='fa fa-search-plus', permissions=[PERMISSION_DOCUMENT_VIEW], text=_('Zoom in'), view='documents:document_page_zoom_in', args='resolved_object.pk')
link_document_page_zoom_out = Link(conditional_disable=is_min_zoom, icon='fa fa-search-minus', permissions=[PERMISSION_DOCUMENT_VIEW], text=_('Zoom out'), view='documents:document_page_zoom_out', args='resolved_object.pk')
# Document versions
link_document_version_revert = Link(condition=is_not_current_version, permissions=[PERMISSION_DOCUMENT_VERSION_REVERT], tags='dangerous', text=_('Revert'), view='documents:document_version_revert', args='object.pk')

View File

@@ -1,6 +1,5 @@
from __future__ import unicode_literals
from ast import literal_eval
import logging
from django.db import models, transaction
@@ -12,27 +11,6 @@ from .settings import RECENT_COUNT, LANGUAGE
logger = logging.getLogger(__name__)
class DocumentPageTransformationManager(models.Manager):
def get_for_document_page(self, document_page):
return self.model.objects.filter(document_page=document_page)
def get_for_document_page_as_list(self, document_page):
warnings = []
transformations = []
for transformation in self.get_for_document_page(document_page).values('transformation', 'arguments'):
try:
transformations.append(
{
'transformation': transformation['transformation'],
'arguments': literal_eval(transformation['arguments'].strip())
}
)
except (ValueError, SyntaxError) as exception:
warnings.append(exception)
return transformations, warnings
class RecentDocumentManager(models.Manager):
def add_document_for_user(self, user, document):
if user.is_authenticated():

View File

@@ -52,7 +52,7 @@ class Migration(migrations.Migration):
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
('order', models.PositiveIntegerField(default=0, null=True, verbose_name='Order', db_index=True, blank=True)),
('transformation', models.CharField(max_length=128, verbose_name='Transformation', choices=[('resize', 'Resize'), ('rotate', 'Rotate'), ('zoom', 'Zoom')])),
('arguments', models.TextField(blank=True, help_text="Use dictionaries to indentify arguments, example: {'degrees':90}", null=True, verbose_name='Arguments', validators=[documents.models.argument_validator])),
('arguments', models.TextField(blank=True, help_text="Use dictionaries to indentify arguments, example: {'degrees':90}", null=True, verbose_name='Arguments', validators=[])),
('document_page', models.ForeignKey(verbose_name='Document page', to='documents.DocumentPage')),
],
options={

View File

@@ -0,0 +1,22 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
import storage.backends.filebasedstorage
class Migration(migrations.Migration):
dependencies = [
('documents', '0001_initial'),
]
operations = [
migrations.RemoveField(
model_name='documentpagetransformation',
name='document_page',
),
migrations.DeleteModel(
name='DocumentPageTransformation',
),
]

View File

@@ -0,0 +1,28 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
import documents.models
import storage.backends.filebasedstorage
class Migration(migrations.Migration):
dependencies = [
('documents', '0002_auto_20150608_1902'),
]
operations = [
migrations.AlterField(
model_name='document',
name='uuid',
field=models.CharField(default=documents.models.UUID_FUNCTION, max_length=48, editable=False),
preserve_default=True,
),
migrations.AlterField(
model_name='documentversion',
name='file',
field=models.FileField(upload_to=documents.models.UUID_FUNCTION, storage=storage.backends.filebasedstorage.FileBasedStorage(), verbose_name='File'),
preserve_default=True,
),
]

View File

@@ -25,13 +25,13 @@ from converter.exceptions import UnknownFileFormat
from converter.literals import (
DEFAULT_ZOOM_LEVEL, DEFAULT_ROTATION, DEFAULT_PAGE_NUMBER
)
from converter.models import Transformation
from mimetype.api import get_mimetype
from .events import event_document_create
from .exceptions import NewDocumentVersionNotAllowed
from .managers import (
DocumentManager, DocumentPageTransformationManager, DocumentTypeManager,
RecentDocumentManager
DocumentManager, DocumentTypeManager, RecentDocumentManager
)
from .runtime import storage_backend
from .settings import (
@@ -79,7 +79,7 @@ class Document(models.Model):
Defines a single document with it's fields and properties
"""
uuid = models.CharField(default=UUID_FUNCTION(), max_length=48, editable=False)
uuid = models.CharField(default=UUID_FUNCTION, max_length=48, editable=False)
document_type = models.ForeignKey(DocumentType, verbose_name=_('Document type'), related_name='documents')
label = models.CharField(max_length=255, default=_('Uninitialized document'), db_index=True, help_text=_('The name of the document'), verbose_name=_('Label'))
description = models.TextField(blank=True, null=True, verbose_name=_('Description'))
@@ -128,53 +128,6 @@ class Document(models.Model):
else:
event_document_create.commit(target=self)
"""
def get_cached_image_name(self, page, version):
document_version = DocumentVersion.objects.get(pk=version)
document_page = document_version.pages.get(page_number=page)
transformations, warnings = document_page.get_transformation_list()
hash_value = HASH_FUNCTION(''.join([document_version.checksum, unicode(page), unicode(transformations)]))
return os.path.join(CACHE_PATH, hash_value), transformations
def get_image_cache_name(self, page, version):
cache_file_path, transformations = self.get_cached_image_name(page, version)
if os.path.exists(cache_file_path):
return cache_file_path
else:
document_version = DocumentVersion.objects.get(pk=version)
document_file = document_version.document.document_save_to_temp_dir(document_version.checksum)
return convert(input_filepath=document_file, output_filepath=cache_file_path, page=page, transformations=transformations, mimetype=self.file_mimetype)
def get_valid_image(self, size=DISPLAY_SIZE, page=DEFAULT_PAGE_NUMBER, zoom=DEFAULT_ZOOM_LEVEL, rotation=DEFAULT_ROTATION, version=None):
if not version:
version = self.latest_version.pk
image_cache_name = self.get_image_cache_name(page=page, version=version)
logger.debug('image_cache_name: %s', image_cache_name)
return convert(input_filepath=image_cache_name, cleanup_files=False, size=size, zoom=zoom, rotation=rotation)
def get_image(self, 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
if zoom > ZOOM_MAX_LEVEL:
zoom = ZOOM_MAX_LEVEL
rotation = rotation % 360
file_path = self.get_valid_image(size=size, page=page, zoom=zoom, rotation=rotation, version=version)
logger.debug('file_path: %s', file_path)
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
"""
def invalidate_cached_image(self, page):
pass
#try:
@@ -298,7 +251,7 @@ class DocumentVersion(models.Model):
comment = models.TextField(blank=True, verbose_name=_('Comment'))
# File related fields
file = models.FileField(upload_to=UUID_FUNCTION(), storage=storage_backend, verbose_name=_('File'))
file = models.FileField(upload_to=UUID_FUNCTION, storage=storage_backend, verbose_name=_('File'))
mimetype = models.CharField(max_length=255, null=True, blank=True, editable=False)
encoding = models.CharField(max_length=64, null=True, blank=True, editable=False)
@@ -350,6 +303,7 @@ class DocumentVersion(models.Model):
self.save()
def update_page_count(self, save=True):
# TODO: finish converting this
#handle, filepath = tempfile.mkstemp()
# Just need the filepath, close the file description
#os.close(handle)
@@ -570,6 +524,11 @@ class DocumentPage(models.Model):
fs_cleanup(cache_filename)
raise
stored_transformations = Transformation.objects.get_for_model(self, as_classes=True)
for stored_transformation in stored_transformations:
converter.transform(transformation=stored_transformation)
if rotation:
converter.transform(transformation=TransformationRotate(degrees=rotation))
@@ -587,39 +546,6 @@ class DocumentPage(models.Model):
return page_image
def argument_validator(value):
"""
Validates that the input evaluates correctly.
"""
value = value.strip()
try:
literal_eval(value)
except (ValueError, SyntaxError):
raise ValidationError(_('Enter a valid value.'), code='invalid')
@python_2_unicode_compatible
class DocumentPageTransformation(models.Model):
"""
Model that stores the transformation and transformation arguments
for a given document page
"""
document_page = models.ForeignKey(DocumentPage, verbose_name=_('Document page'))
order = models.PositiveIntegerField(default=0, blank=True, null=True, verbose_name=_('Order'), db_index=True)
#transformation = models.CharField(choices=get_available_transformations_choices(), max_length=128, verbose_name=_('Transformation'))
transformation = models.CharField(max_length=128, verbose_name=_('Transformation'))
arguments = models.TextField(blank=True, null=True, verbose_name=_('Arguments'), help_text=_('Use dictionaries to indentify arguments, example: {\'degrees\':90}'), validators=[argument_validator])
objects = DocumentPageTransformationManager()
def __str__(self):
return self.get_transformation_display()
class Meta:
ordering = ('order',)
verbose_name = _('Document page transformation')
verbose_name_plural = _('Document page transformations')
@python_2_unicode_compatible
class RecentDocument(models.Model):
"""

View File

@@ -13,7 +13,6 @@ PERMISSION_DOCUMENT_EDIT = Permission.objects.register(document_namespace, 'docu
PERMISSION_DOCUMENT_NEW_VERSION = Permission.objects.register(document_namespace, 'document_new_version', _('Create new document versions'))
PERMISSION_DOCUMENT_PROPERTIES_EDIT = Permission.objects.register(document_namespace, 'document_properties_edit', _('Edit document properties'))
PERMISSION_DOCUMENT_PRINT = Permission.objects.register(document_namespace, 'document_print', _('Can print documents'))
PERMISSION_DOCUMENT_TRANSFORM = Permission.objects.register(document_namespace, 'document_transform', _('Transform documents'))
PERMISSION_DOCUMENT_TOOLS = Permission.objects.register(document_namespace, 'document_tools', _('Execute document modifying tools'))
PERMISSION_DOCUMENT_VERSION_REVERT = Permission.objects.register(document_namespace, 'document_version_revert', _('Revert documents to a previous version'))
PERMISSION_DOCUMENT_VIEW = Permission.objects.register(document_namespace, 'document_view', _('View documents'))

View File

@@ -58,12 +58,6 @@ urlpatterns = patterns(
url(r'^page/(?P<document_page_id>\d+)/rotate/left/$', 'document_page_rotate_left', (), 'document_page_rotate_left'),
url(r'^page/(?P<document_page_id>\d+)/reset/$', 'document_page_view_reset', (), 'document_page_view_reset'),
url(r'^page/(?P<document_page_id>\d+)/transformation/list/$', 'document_page_transformation_list', (), 'document_page_transformation_list'),
url(r'^page/(?P<document_page_id>\d+)/transformation/create/$', 'document_page_transformation_create', (), 'document_page_transformation_create'),
url(r'^page/transformation/(?P<document_page_transformation_id>\d+)/edit/$', 'document_page_transformation_edit', (), 'document_page_transformation_edit'),
url(r'^page/transformation/(?P<document_page_transformation_id>\d+)/delete/$', 'document_page_transformation_delete', (), 'document_page_transformation_delete'),
# Admin views
url(r'^type/list/$', 'document_type_list', (), 'document_type_list'),
url(r'^type/create/$', 'document_type_create', (), 'document_type_create'),

View File

@@ -23,6 +23,7 @@ from converter.literals import (
DEFAULT_FILE_FORMAT_MIMETYPE, DEFAULT_PAGE_NUMBER, DEFAULT_ROTATION,
DEFAULT_ZOOM_LEVEL
)
from converter.permissions import PERMISSION_TRANSFORMATION_DELETE
from filetransfers.api import serve_file
from permissions.models import Permission
@@ -31,23 +32,22 @@ from .events import (
)
from .forms import (
DocumentContentForm, DocumentDownloadForm, DocumentForm, DocumentPageForm,
DocumentPageTransformationForm, DocumentPreviewForm, DocumentPropertiesForm,
DocumentTypeForm, DocumentTypeFilenameForm, DocumentTypeFilenameForm_create,
DocumentPreviewForm, DocumentPropertiesForm, DocumentTypeForm,
DocumentTypeFilenameForm, DocumentTypeFilenameForm_create,
DocumentTypeSelectForm, PrintForm
)
from .literals import DOCUMENT_IMAGE_TASK_TIMEOUT
from .models import (
Document, DocumentType, DocumentPage, DocumentPageTransformation,
DocumentTypeFilename, DocumentVersion, RecentDocument
Document, DocumentType, DocumentPage, DocumentTypeFilename,
DocumentVersion, RecentDocument
)
from .permissions import (
PERMISSION_DOCUMENT_DELETE, PERMISSION_DOCUMENT_DOWNLOAD,
PERMISSION_DOCUMENT_EDIT, PERMISSION_DOCUMENT_PRINT,
PERMISSION_DOCUMENT_PROPERTIES_EDIT, PERMISSION_DOCUMENT_TRANSFORM,
PERMISSION_DOCUMENT_TOOLS, PERMISSION_DOCUMENT_TYPE_CREATE,
PERMISSION_DOCUMENT_TYPE_DELETE, PERMISSION_DOCUMENT_TYPE_EDIT,
PERMISSION_DOCUMENT_TYPE_VIEW, PERMISSION_DOCUMENT_VERSION_REVERT,
PERMISSION_DOCUMENT_VIEW,
PERMISSION_DOCUMENT_PROPERTIES_EDIT, PERMISSION_DOCUMENT_TOOLS,
PERMISSION_DOCUMENT_TYPE_CREATE, PERMISSION_DOCUMENT_TYPE_DELETE,
PERMISSION_DOCUMENT_TYPE_EDIT, PERMISSION_DOCUMENT_TYPE_VIEW,
PERMISSION_DOCUMENT_VERSION_REVERT, PERMISSION_DOCUMENT_VIEW,
)
from .settings import (
PREVIEW_SIZE, RECENT_COUNT, ROTATION_STEP, ZOOM_PERCENT_STEP,
@@ -1092,119 +1092,6 @@ def document_version_revert(request, document_version_pk):
}, context_instance=RequestContext(request))
# DEPRECATION: These document page transformation views are schedules to be deleted once the transformations app is merged
def document_page_transformation_list(request, document_page_id):
document_page = get_object_or_404(DocumentPage, pk=document_page_id)
try:
Permission.objects.check_permissions(request.user, [PERMISSION_DOCUMENT_TRANSFORM])
except PermissionDenied:
AccessEntry.objects.check_access(PERMISSION_DOCUMENT_TRANSFORM, request.user, document_page.document)
context = {
'object_list': document_page.documentpagetransformation_set.all(),
'page': document_page,
'navigation_object_list': ['page'],
'title': _('Transformations for: %s') % document_page,
'extra_columns': [
{'name': _('Order'), 'attribute': 'order'},
{'name': _('Transformation'), 'attribute': encapsulate(lambda x: x.get_transformation_display())},
{'name': _('Arguments'), 'attribute': 'arguments'}
],
'hide_link': True,
'hide_object': True,
}
return render_to_response(
'appearance/generic_list.html', context, context_instance=RequestContext(request)
)
def document_page_transformation_create(request, document_page_id):
document_page = get_object_or_404(DocumentPage, pk=document_page_id)
try:
Permission.objects.check_permissions(request.user, [PERMISSION_DOCUMENT_TRANSFORM])
except PermissionDenied:
AccessEntry.objects.check_access(PERMISSION_DOCUMENT_TRANSFORM, request.user, document_page.document)
if request.method == 'POST':
form = DocumentPageTransformationForm(request.POST, initial={'document_page': document_page})
if form.is_valid():
document_page.document.invalidate_cached_image(document_page.page_number)
form.save()
messages.success(request, _('Document page transformation created successfully.'))
return HttpResponseRedirect(reverse('documents:document_page_transformation_list', args=[document_page_id]))
else:
form = DocumentPageTransformationForm(initial={'document_page': document_page})
return render_to_response('appearance/generic_form.html', {
'form': form,
'page': document_page,
'navigation_object_list': ['page'],
'title': _('Create new transformation for page: %(page)s of document: %(document)s') % {
'page': document_page.page_number, 'document': document_page.document},
}, context_instance=RequestContext(request))
def document_page_transformation_edit(request, document_page_transformation_id):
document_page_transformation = get_object_or_404(DocumentPageTransformation, pk=document_page_transformation_id)
try:
Permission.objects.check_permissions(request.user, [PERMISSION_DOCUMENT_TRANSFORM])
except PermissionDenied:
AccessEntry.objects.check_access(PERMISSION_DOCUMENT_TRANSFORM, request.user, document_page_transformation.document_page.document)
if request.method == 'POST':
form = DocumentPageTransformationForm(request.POST, instance=document_page_transformation)
if form.is_valid():
document_page_transformation.document_page.document.invalidate_cached_image(document_page_transformation.document_page.page_number)
form.save()
messages.success(request, _('Document page transformation edited successfully.'))
return HttpResponseRedirect(reverse('documents:document_page_transformation_list', args=[document_page_transformation.document_page_id]))
else:
form = DocumentPageTransformationForm(instance=document_page_transformation)
return render_to_response('appearance/generic_form.html', {
'form': form,
'navigation_object_list': ['page', 'transformation'],
'page': document_page_transformation.document_page,
'title': _('Edit transformation "%(transformation)s" for: %(document_page)s') % {
'transformation': document_page_transformation.get_transformation_display(),
'document_page': document_page_transformation.document_page},
'transformation': document_page_transformation,
}, context_instance=RequestContext(request))
def document_page_transformation_delete(request, document_page_transformation_id):
document_page_transformation = get_object_or_404(DocumentPageTransformation, pk=document_page_transformation_id)
try:
Permission.objects.check_permissions(request.user, [PERMISSION_DOCUMENT_TRANSFORM])
except PermissionDenied:
AccessEntry.objects.check_access(PERMISSION_DOCUMENT_TRANSFORM, request.user, document_page_transformation.document_page.document)
redirect_view = reverse('documents:document_page_transformation_list', args=[document_page_transformation.document_page_id])
previous = request.POST.get('previous', request.GET.get('previous', request.META.get('HTTP_REFERER', redirect_view)))
if request.method == 'POST':
document_page_transformation.document_page.document.invalidate_cached_image(document_page_transformation.document_page.page_number)
document_page_transformation.delete()
messages.success(request, _('Document page transformation deleted successfully.'))
return HttpResponseRedirect(redirect_view)
return render_to_response('appearance/generic_confirm.html', {
'delete_view': True,
'navigation_object_list': ['page', 'transformation'],
'page': document_page_transformation.document_page,
'previous': previous,
'title': _('Are you sure you wish to delete transformation "%(transformation)s" for: %(document_page)s') % {
'transformation': document_page_transformation.get_transformation_display(),
'document_page': document_page_transformation.document_page},
'transformation': document_page_transformation,
}, context_instance=RequestContext(request))
def document_acl_list(request, document_id):
document = get_object_or_404(Document, pk=document_id)
return acl_list_for(