Convert sources app to use new transformation system
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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, [
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
|
||||
@@ -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')
|
||||
|
||||
@@ -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')
|
||||
|
||||
@@ -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={
|
||||
|
||||
21
mayan/apps/sources/migrations/0002_auto_20150608_1902.py
Normal file
21
mayan/apps/sources/migrations/0002_auto_20150608_1902.py
Normal file
@@ -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',
|
||||
),
|
||||
]
|
||||
@@ -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')
|
||||
|
||||
@@ -26,11 +26,6 @@ urlpatterns = patterns(
|
||||
url(r'^setup/(?P<source_id>\d+)/delete/$', 'setup_source_delete', (), 'setup_source_delete'),
|
||||
url(r'^setup/(?P<source_type>\w+)/create/$', 'setup_source_create', (), 'setup_source_create'),
|
||||
|
||||
url(r'^setup/(?P<source_id>\d+)/transformation/list/$', 'setup_source_transformation_list', (), 'setup_source_transformation_list'),
|
||||
url(r'^setup/(?P<source_id>\d+)/transformation/create/$', 'setup_source_transformation_create', (), 'setup_source_transformation_create'),
|
||||
url(r'^setup/source/transformation/(?P<transformation_id>\d+)/edit/$', 'setup_source_transformation_edit', (), 'setup_source_transformation_edit'),
|
||||
url(r'^setup/source/transformation/(?P<transformation_id>\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'),
|
||||
|
||||
@@ -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))
|
||||
|
||||
Reference in New Issue
Block a user