From 506d53c58a439c2fa41faba5743ea0245a6b4cc8 Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Mon, 8 Jun 2015 15:56:16 -0400 Subject: [PATCH] Convert sources app to use new transformation system --- mayan/apps/sources/admin.py | 4 +- mayan/apps/sources/apps.py | 13 +- mayan/apps/sources/classes.py | 2 +- mayan/apps/sources/forms.py | 21 +--- mayan/apps/sources/links.py | 6 +- mayan/apps/sources/migrations/0001_initial.py | 2 +- .../migrations/0002_auto_20150608_1902.py | 21 ++++ mayan/apps/sources/models.py | 44 +------ mayan/apps/sources/urls.py | 5 - mayan/apps/sources/views.py | 116 +----------------- 10 files changed, 35 insertions(+), 199 deletions(-) create mode 100644 mayan/apps/sources/migrations/0002_auto_20150608_1902.py diff --git a/mayan/apps/sources/admin.py b/mayan/apps/sources/admin.py index 6eb36dc684..7b5cd3a37c 100644 --- a/mayan/apps/sources/admin.py +++ b/mayan/apps/sources/admin.py @@ -1,11 +1,9 @@ from django.contrib import admin from .models import ( - SourceTransformation, StagingFolderSource, WatchFolderSource, - WebFormSource + StagingFolderSource, WatchFolderSource, WebFormSource ) -admin.site.register(SourceTransformation) admin.site.register(StagingFolderSource) admin.site.register(WatchFolderSource) admin.site.register(WebFormSource) diff --git a/mayan/apps/sources/apps.py b/mayan/apps/sources/apps.py index c41643ec2d..67b943e6a2 100644 --- a/mayan/apps/sources/apps.py +++ b/mayan/apps/sources/apps.py @@ -8,6 +8,7 @@ from common import ( menu_setup ) from common.utils import encapsulate +from converter.links import link_transformation_list from documents.models import Document from navigation.api import register_model_list_columns from rest_api.classes import APIEndPoint @@ -19,13 +20,9 @@ from .links import ( link_setup_source_create_pop3_email, link_setup_source_create_watch_folder, link_setup_source_create_webform, link_setup_source_create_staging_folder, link_setup_source_delete, - link_setup_source_edit, link_setup_source_transformation_create, - link_setup_source_transformation_delete, - link_setup_source_transformation_edit, - link_setup_source_transformation_list, link_staging_file_delete, - link_upload_version + link_setup_source_edit, link_staging_file_delete, link_upload_version ) -from .models import Source, SourceTransformation +from .models import Source from .widgets import staging_file_thumbnail @@ -39,12 +36,10 @@ class SourcesApp(apps.AppConfig): menu_front_page.bind_links(links=[link_document_create_multiple]) menu_object.bind_links(links=[link_document_create_siblings], sources=[Document]) - menu_object.bind_links(links=[link_setup_source_edit, link_setup_source_transformation_list, link_setup_source_delete], sources=[Source]) - menu_object.bind_links(links=[link_setup_source_transformation_edit, link_setup_source_transformation_delete], sources=[SourceTransformation]) + menu_object.bind_links(links=[link_setup_source_edit, link_setup_source_delete, link_transformation_list], sources=[Source]) menu_object.bind_links(links=[link_staging_file_delete], sources=[StagingFile]) menu_secondary.bind_links(links=[link_setup_sources, link_setup_source_create_webform, link_setup_source_create_staging_folder, link_setup_source_create_pop3_email, link_setup_source_create_imap_email, link_setup_source_create_watch_folder], sources=[Source, 'sources:setup_source_list', 'sources:setup_source_create']) menu_setup.bind_links(links=[link_setup_sources]) - menu_sidebar.bind_links(links=[link_setup_source_transformation_create], sources=[SourceTransformation, 'sources:setup_source_transformation_create', 'sources:setup_source_transformation_list']) menu_sidebar.bind_links(links=[link_upload_version], sources=['documents:document_version_list', 'documents:upload_version', 'documents:document_version_revert']) register_model_list_columns(StagingFile, [ diff --git a/mayan/apps/sources/classes.py b/mayan/apps/sources/classes.py index 9e334cc5a4..c3bab64fd4 100644 --- a/mayan/apps/sources/classes.py +++ b/mayan/apps/sources/classes.py @@ -11,7 +11,7 @@ except ImportError: from django.core.files import File -from converter.api import convert +from converter import converter_class from mimetype.api import get_mimetype diff --git a/mayan/apps/sources/forms.py b/mayan/apps/sources/forms.py index 44de420412..ad003c150a 100644 --- a/mayan/apps/sources/forms.py +++ b/mayan/apps/sources/forms.py @@ -9,8 +9,8 @@ from django.utils.translation import ugettext_lazy as _ from documents.forms import DocumentForm from .models import ( - IMAPEmail, POP3Email, SourceTransformation, StagingFolderSource, - WebFormSource, WatchFolderSource + IMAPEmail, POP3Email, StagingFolderSource, WebFormSource, + WatchFolderSource ) logger = logging.getLogger(__name__) @@ -109,20 +109,3 @@ class WatchFolderSetupForm(forms.ModelForm): class Meta: fields = ('title', 'enabled', 'interval', 'document_type', 'uncompress', 'folder_path') model = WatchFolderSource - - -class SourceTransformationForm(forms.ModelForm): - class Meta: - fields = ('order', 'transformation', 'arguments') - model = SourceTransformation - - def __init__(self, *args, **kwargs): - super(SourceTransformationForm, self).__init__(*args, **kwargs) - self.fields['content_type'].widget = forms.HiddenInput() - self.fields['object_id'].widget = forms.HiddenInput() - - -class SourceTransformationForm_create(forms.ModelForm): - class Meta: - model = SourceTransformation - exclude = ('content_type', 'object_id') diff --git a/mayan/apps/sources/links.py b/mayan/apps/sources/links.py index ad266f9dba..40ba430de7 100644 --- a/mayan/apps/sources/links.py +++ b/mayan/apps/sources/links.py @@ -2,6 +2,7 @@ from __future__ import absolute_import, unicode_literals from django.utils.translation import ugettext_lazy as _ +from converter.permissions import PERMISSION_TRANSFORMATION_VIEW from documents.permissions import ( PERMISSION_DOCUMENT_CREATE, PERMISSION_DOCUMENT_NEW_VERSION ) @@ -16,6 +17,7 @@ from .permissions import ( PERMISSION_SOURCES_SETUP_EDIT, PERMISSION_SOURCES_SETUP_VIEW ) + link_document_create_multiple = Link(icon='fa fa-upload', permissions=[PERMISSION_DOCUMENT_CREATE], text=_('New document'), view='sources:document_create_multiple') link_document_create_siblings = Link(permissions=[PERMISSION_DOCUMENT_CREATE], text=_('Clone'), view='sources:document_create_siblings', args='object.id') link_setup_sources = Link(icon='fa fa-upload', permissions=[PERMISSION_SOURCES_SETUP_VIEW], text=_('Sources'), view='sources:setup_source_list') @@ -26,10 +28,6 @@ link_setup_source_create_watch_folder = Link(permissions=[PERMISSION_SOURCES_SET link_setup_source_create_webform = Link(permissions=[PERMISSION_SOURCES_SETUP_CREATE], text=_('Add new webform source'), view='sources:setup_source_create', args='"%s"' % SOURCE_CHOICE_WEB_FORM) link_setup_source_delete = Link(permissions=[PERMISSION_SOURCES_SETUP_DELETE], tags='dangerous', text=_('Delete'), view='sources:setup_source_delete', args=['resolved_object.pk']) link_setup_source_edit = Link(text=_('Edit'), view='sources:setup_source_edit', args=['resolved_object.pk'], permissions=[PERMISSION_SOURCES_SETUP_EDIT]) -link_setup_source_transformation_create = Link(permissions=[PERMISSION_SOURCES_SETUP_EDIT], text=_('Add transformation'), view='sources:setup_source_transformation_create', args=['resolved_object.pk']) -link_setup_source_transformation_edit = Link(permissions=[PERMISSION_SOURCES_SETUP_EDIT], text=_('Edit'), view='sources:setup_source_transformation_edit', args='resolved_object.pk') -link_setup_source_transformation_delete = Link(permissions=[PERMISSION_SOURCES_SETUP_EDIT], tags='dangerous', text=_('Delete'), view='sources:setup_source_transformation_delete', args='resolved_object.pk') -link_setup_source_transformation_list = Link(permissions=[PERMISSION_SOURCES_SETUP_EDIT], text=_('Transformations'), view='sources:setup_source_transformation_list', args=['resolved_object.pk']) link_source_list = Link(permissions=[PERMISSION_SOURCES_SETUP_VIEW], text=_('Document sources'), view='sources:setup_web_form_list') link_staging_file_delete = Link(keep_query=True, permissions=[PERMISSION_DOCUMENT_NEW_VERSION, PERMISSION_DOCUMENT_CREATE], tags='dangerous', text=_('Delete'), view='sources:staging_file_delete', args=['source.pk', 'object.encoded_filename']) link_upload_version = Link(permissions=[PERMISSION_DOCUMENT_NEW_VERSION], text=_('Upload new version'), view='sources:upload_version', args='object.pk') diff --git a/mayan/apps/sources/migrations/0001_initial.py b/mayan/apps/sources/migrations/0001_initial.py index 410b0e24c2..4094e579cc 100644 --- a/mayan/apps/sources/migrations/0001_initial.py +++ b/mayan/apps/sources/migrations/0001_initial.py @@ -109,7 +109,7 @@ class Migration(migrations.Migration): ('object_id', models.PositiveIntegerField()), ('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=[sources.models.argument_validator])), + ('arguments', models.TextField(blank=True, help_text="Use dictionaries to indentify arguments, example: {'degrees':90}", null=True, verbose_name='Arguments', validators=[])), ('content_type', models.ForeignKey(to='contenttypes.ContentType')), ], options={ diff --git a/mayan/apps/sources/migrations/0002_auto_20150608_1902.py b/mayan/apps/sources/migrations/0002_auto_20150608_1902.py new file mode 100644 index 0000000000..b5a91b30ab --- /dev/null +++ b/mayan/apps/sources/migrations/0002_auto_20150608_1902.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('sources', '0001_initial'), + ] + + operations = [ + migrations.RemoveField( + model_name='sourcetransformation', + name='content_type', + ), + migrations.DeleteModel( + name='SourceTransformation', + ), + ] diff --git a/mayan/apps/sources/models.py b/mayan/apps/sources/models.py index 8591ffad43..f5a5f484c0 100644 --- a/mayan/apps/sources/models.py +++ b/mayan/apps/sources/models.py @@ -1,6 +1,5 @@ from __future__ import unicode_literals -from ast import literal_eval from email.Utils import collapse_rfc2231_value from email import message_from_string import json @@ -9,8 +8,6 @@ import logging import os import poplib -from django.contrib.contenttypes import generic -from django.contrib.contenttypes.models import ContentType from django.core.exceptions import ValidationError from django.core.files import File from django.db import models @@ -19,7 +16,6 @@ from django.utils.translation import ugettext_lazy as _ from model_utils.managers import InheritanceManager -#from converter.api import get_available_transformations_choices from converter.literals import DIMENSION_SEPARATOR from djcelery.models import PeriodicTask, IntervalSchedule from documents.models import Document, DocumentType @@ -33,7 +29,6 @@ from .literals import ( SOURCE_UNCOMPRESS_CHOICES, SOURCE_UNCOMPRESS_CHOICE_Y, SOURCE_CHOICE_EMAIL_IMAP, SOURCE_CHOICE_EMAIL_POP3 ) -from .managers import SourceTransformationManager logger = logging.getLogger(__name__) @@ -56,7 +51,7 @@ class Source(models.Model): return ' '.join([self.class_fullname(), '"%s"' % self.title]) def get_transformation_list(self): - return SourceTransformation.transformations.get_for_object_as_list(self) + return SourceTransformation.objects.get_for_object_as_list(self) def upload_document(self, file_object, label, description=None, document_type=None, expand=False, language=None, metadata_dict_list=None, user=None): new_versions = Document.objects.new_document( @@ -353,40 +348,3 @@ class WatchFolderSource(IntervalBaseModel): class Meta: verbose_name = _('Watch folder') verbose_name_plural = _('Watch folders') - - -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 SourceTransformation(models.Model): - """ - Model that stores the transformation and transformation arguments - for a given document source - """ - content_type = models.ForeignKey(ContentType) - object_id = models.PositiveIntegerField() - content_object = generic.GenericForeignKey('content_type', 'object_id') - 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 = models.Manager() - transformations = SourceTransformationManager() - - def __str__(self): - return self.get_transformation_display() - - class Meta: - ordering = ('order',) - verbose_name = _('Document source transformation') - verbose_name_plural = _('Document source transformations') diff --git a/mayan/apps/sources/urls.py b/mayan/apps/sources/urls.py index de92adc095..bdfb1604e6 100644 --- a/mayan/apps/sources/urls.py +++ b/mayan/apps/sources/urls.py @@ -26,11 +26,6 @@ urlpatterns = patterns( url(r'^setup/(?P\d+)/delete/$', 'setup_source_delete', (), 'setup_source_delete'), url(r'^setup/(?P\w+)/create/$', 'setup_source_create', (), 'setup_source_create'), - url(r'^setup/(?P\d+)/transformation/list/$', 'setup_source_transformation_list', (), 'setup_source_transformation_list'), - url(r'^setup/(?P\d+)/transformation/create/$', 'setup_source_transformation_create', (), 'setup_source_transformation_create'), - url(r'^setup/source/transformation/(?P\d+)/edit/$', 'setup_source_transformation_edit', (), 'setup_source_transformation_edit'), - url(r'^setup/source/transformation/(?P\d+)/delete/$', 'setup_source_transformation_delete', (), 'setup_source_transformation_delete'), - # Document create views url(r'^create/from/local/multiple/$', DocumentCreateWizard.as_view(), name='document_create_multiple'), diff --git a/mayan/apps/sources/views.py b/mayan/apps/sources/views.py index 2481cff508..d203064701 100644 --- a/mayan/apps/sources/views.py +++ b/mayan/apps/sources/views.py @@ -25,16 +25,14 @@ from navigation import Link from permissions.models import Permission from .forms import ( - NewDocumentForm, NewVersionForm, SourceTransformationForm, - SourceTransformationForm_create + NewDocumentForm, NewVersionForm ) from .literals import ( SOURCE_CHOICE_STAGING, SOURCE_CHOICE_WEB_FORM, SOURCE_UNCOMPRESS_CHOICE_ASK, SOURCE_UNCOMPRESS_CHOICE_Y ) from .models import ( - InteractiveSource, Source, StagingFolderSource, SourceTransformation, - WebFormSource + InteractiveSource, Source, StagingFolderSource, WebFormSource ) from .permissions import ( PERMISSION_SOURCES_SETUP_CREATE, PERMISSION_SOURCES_SETUP_DELETE, @@ -443,113 +441,3 @@ def setup_source_create(request, source_type): 'source_type': source_type, 'title': _('Create new source of type: %s') % cls.class_fullname(), }, context_instance=RequestContext(request)) - - -def setup_source_transformation_list(request, source_id): - Permission.objects.check_permissions(request.user, [PERMISSION_SOURCES_SETUP_EDIT]) - - source = get_object_or_404(Source.objects.select_subclasses(), pk=source_id) - - context = { - '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, - 'navigation_object_list': ['source'], - 'object_list': SourceTransformation.transformations.get_for_object(source), - 'source': source, - 'title': _('Transformations for: %s') % source.fullname(), - } - - return render_to_response('appearance/generic_list.html', context, - context_instance=RequestContext(request)) - - -def setup_source_transformation_edit(request, transformation_id): - Permission.objects.check_permissions(request.user, [PERMISSION_SOURCES_SETUP_EDIT]) - - source_transformation = get_object_or_404(SourceTransformation, pk=transformation_id) - redirect_view = reverse('sources:setup_source_transformation_list', args=[source_transformation.content_object.pk]) - next = request.POST.get('next', request.GET.get('next', request.META.get('HTTP_REFERER', redirect_view))) - - if request.method == 'POST': - form = SourceTransformationForm(instance=source_transformation, data=request.POST) - if form.is_valid(): - try: - form.save() - messages.success(request, _('Source transformation edited successfully')) - return HttpResponseRedirect(next) - except Exception as exception: - messages.error(request, _('Error editing source transformation; %s') % exception) - else: - form = SourceTransformationForm(instance=source_transformation) - - return render_to_response('appearance/generic_form.html', { - 'form': form, - 'navigation_object_list': ['source', 'transformation'], - 'next': next, - 'source': source_transformation.content_object, - 'transformation': source_transformation, - 'title': _('Edit transformation: %s') % source_transformation, - }, context_instance=RequestContext(request)) - - -def setup_source_transformation_delete(request, transformation_id): - Permission.objects.check_permissions(request.user, [PERMISSION_SOURCES_SETUP_EDIT]) - - source_transformation = get_object_or_404(SourceTransformation, pk=transformation_id) - redirect_view = reverse('sources:setup_source_transformation_list', args=[source_transformation.content_object.pk]) - previous = request.POST.get('previous', request.GET.get('previous', request.META.get('HTTP_REFERER', redirect_view))) - - if request.method == 'POST': - try: - source_transformation.delete() - messages.success(request, _('Source transformation deleted successfully.')) - except Exception as exception: - messages.error(request, _('Error deleting source transformation; %(error)s') % { - 'error': exception} - ) - return HttpResponseRedirect(redirect_view) - - return render_to_response('appearance/generic_confirm.html', { - 'delete_view': True, - 'navigation_object_list': ['source', 'transformation'], - 'previous': previous, - 'source': source_transformation.content_object, - 'title': _('Are you sure you wish to delete source transformation "%(transformation)s"') % { - 'transformation': source_transformation.get_transformation_display(), - }, - 'transformation': source_transformation, - }, context_instance=RequestContext(request)) - - -def setup_source_transformation_create(request, source_id): - Permission.objects.check_permissions(request.user, [PERMISSION_SOURCES_SETUP_EDIT]) - - source = get_object_or_404(Source.objects.select_subclasses(), pk=source_id) - - redirect_view = reverse('sources:setup_source_transformation_list', args=[source.pk]) - - if request.method == 'POST': - form = SourceTransformationForm_create(request.POST) - if form.is_valid(): - try: - source_tranformation = form.save(commit=False) - source_tranformation.content_object = source - source_tranformation.save() - messages.success(request, _('Source transformation created successfully')) - return HttpResponseRedirect(redirect_view) - except Exception as exception: - messages.error(request, _('Error creating source transformation; %s') % exception) - else: - form = SourceTransformationForm_create() - - return render_to_response('appearance/generic_form.html', { - 'form': form, - 'source': source, - 'navigation_object_list': ['source'], - 'title': _('Create new transformation for source: %s') % source, - }, context_instance=RequestContext(request))