From 9db47a843ff721621d9c52c89a7b5431db46d949 Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Mon, 8 Jun 2015 15:56:57 -0400 Subject: [PATCH] Convert documents app to new transformation system --- mayan/apps/documents/admin.py | 10 +- mayan/apps/documents/apps.py | 27 ++-- mayan/apps/documents/forms.py | 13 +- mayan/apps/documents/links.py | 50 +++---- mayan/apps/documents/managers.py | 22 --- .../apps/documents/migrations/0001_initial.py | 2 +- .../migrations/0002_auto_20150608_1902.py | 22 +++ .../migrations/0003_auto_20150608_1915.py | 28 ++++ mayan/apps/documents/models.py | 94 ++----------- mayan/apps/documents/permissions.py | 1 - mayan/apps/documents/urls.py | 6 - mayan/apps/documents/views.py | 131 ++---------------- 12 files changed, 112 insertions(+), 294 deletions(-) create mode 100644 mayan/apps/documents/migrations/0002_auto_20150608_1902.py create mode 100644 mayan/apps/documents/migrations/0003_auto_20150608_1915.py diff --git a/mayan/apps/documents/admin.py b/mayan/apps/documents/admin.py index 0ade17f575..cbb5bd0ac3 100644 --- a/mayan/apps/documents/admin.py +++ b/mayan/apps/documents/admin.py @@ -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) diff --git a/mayan/apps/documents/apps.py b/mayan/apps/documents/apps.py index 043ea27f12..7ce5749a36 100644 --- a/mayan/apps/documents/apps.py +++ b/mayan/apps/documents/apps.py @@ -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'))) diff --git a/mayan/apps/documents/forms.py b/mayan/apps/documents/forms.py index 66d382f96b..6a99b7d73b 100644 --- a/mayan/apps/documents/forms.py +++ b/mayan/apps/documents/forms.py @@ -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 = () diff --git a/mayan/apps/documents/links.py b/mayan/apps/documents/links.py index 9e77fa8b67..b160208eb3 100644 --- a/mayan/apps/documents/links.py +++ b/mayan/apps/documents/links.py @@ -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') diff --git a/mayan/apps/documents/managers.py b/mayan/apps/documents/managers.py index 351ef583d0..660509a463 100644 --- a/mayan/apps/documents/managers.py +++ b/mayan/apps/documents/managers.py @@ -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(): diff --git a/mayan/apps/documents/migrations/0001_initial.py b/mayan/apps/documents/migrations/0001_initial.py index 07878c6fc1..789b521d73 100644 --- a/mayan/apps/documents/migrations/0001_initial.py +++ b/mayan/apps/documents/migrations/0001_initial.py @@ -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={ diff --git a/mayan/apps/documents/migrations/0002_auto_20150608_1902.py b/mayan/apps/documents/migrations/0002_auto_20150608_1902.py new file mode 100644 index 0000000000..dc9a9e98c6 --- /dev/null +++ b/mayan/apps/documents/migrations/0002_auto_20150608_1902.py @@ -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', + ), + ] diff --git a/mayan/apps/documents/migrations/0003_auto_20150608_1915.py b/mayan/apps/documents/migrations/0003_auto_20150608_1915.py new file mode 100644 index 0000000000..4c34c0ccad --- /dev/null +++ b/mayan/apps/documents/migrations/0003_auto_20150608_1915.py @@ -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, + ), + ] diff --git a/mayan/apps/documents/models.py b/mayan/apps/documents/models.py index a39bc61989..40c0533d17 100644 --- a/mayan/apps/documents/models.py +++ b/mayan/apps/documents/models.py @@ -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): """ diff --git a/mayan/apps/documents/permissions.py b/mayan/apps/documents/permissions.py index 374a07e9f4..d3a48f981c 100644 --- a/mayan/apps/documents/permissions.py +++ b/mayan/apps/documents/permissions.py @@ -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')) diff --git a/mayan/apps/documents/urls.py b/mayan/apps/documents/urls.py index 17bb6b6d03..79d2d18552 100644 --- a/mayan/apps/documents/urls.py +++ b/mayan/apps/documents/urls.py @@ -58,12 +58,6 @@ urlpatterns = patterns( url(r'^page/(?P\d+)/rotate/left/$', 'document_page_rotate_left', (), 'document_page_rotate_left'), url(r'^page/(?P\d+)/reset/$', 'document_page_view_reset', (), 'document_page_view_reset'), - url(r'^page/(?P\d+)/transformation/list/$', 'document_page_transformation_list', (), 'document_page_transformation_list'), - url(r'^page/(?P\d+)/transformation/create/$', 'document_page_transformation_create', (), 'document_page_transformation_create'), - - url(r'^page/transformation/(?P\d+)/edit/$', 'document_page_transformation_edit', (), 'document_page_transformation_edit'), - url(r'^page/transformation/(?P\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'), diff --git a/mayan/apps/documents/views.py b/mayan/apps/documents/views.py index a6da8e6cb6..008c615d03 100644 --- a/mayan/apps/documents/views.py +++ b/mayan/apps/documents/views.py @@ -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(