Convert documents app to new transformation system
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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')))
|
||||
|
||||
@@ -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 = ()
|
||||
|
||||
@@ -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')
|
||||
|
||||
@@ -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():
|
||||
|
||||
@@ -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={
|
||||
|
||||
22
mayan/apps/documents/migrations/0002_auto_20150608_1902.py
Normal file
22
mayan/apps/documents/migrations/0002_auto_20150608_1902.py
Normal 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',
|
||||
),
|
||||
]
|
||||
28
mayan/apps/documents/migrations/0003_auto_20150608_1915.py
Normal file
28
mayan/apps/documents/migrations/0003_auto_20150608_1915.py
Normal 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,
|
||||
),
|
||||
]
|
||||
@@ -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):
|
||||
"""
|
||||
|
||||
@@ -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'))
|
||||
|
||||
@@ -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'),
|
||||
|
||||
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user