diff --git a/mayan/apps/sources/__init__.py b/mayan/apps/sources/__init__.py index c542f7d303..fbbba9ce0b 100644 --- a/mayan/apps/sources/__init__.py +++ b/mayan/apps/sources/__init__.py @@ -10,14 +10,16 @@ from rest_api.classes import APIEndPoint from .classes import StagingFile from .links import (document_create_multiple, document_create_siblings, - staging_file_delete, setup_sources, setup_web_form_list, - setup_staging_folder_list, setup_watch_folder_list, - setup_source_edit, setup_source_delete, setup_source_create, - setup_source_transformation_list, setup_source_transformation_create, - setup_source_transformation_edit, setup_source_transformation_delete, - upload_version) -from .models import (WebForm, StagingFolder, SourceTransformation, - WatchFolder) + setup_sources, setup_web_form_list, setup_source_create, + setup_source_delete, setup_source_edit, + setup_source_transformation_create, + setup_source_transformation_delete, + setup_source_transformation_edit, + setup_source_transformation_list, + setup_staging_folder_list, setup_watch_folder_list, + staging_file_delete, upload_version) +from .models import (SourceTransformation, StagingFolderSource, + WatchFolderSource, WebFormSource) from .urls import api_urls from .widgets import staging_file_thumbnail @@ -27,16 +29,16 @@ register_links(SourceTransformation, [setup_source_transformation_edit, setup_so register_links(['sources:setup_web_form_list', 'sources:setup_staging_folder_list', 'sources:setup_watch_folder_list', 'sources:setup_source_create'], [setup_web_form_list, setup_staging_folder_list], menu_name='form_header') -register_links(WebForm, [setup_web_form_list, setup_staging_folder_list], menu_name='form_header') -register_links(WebForm, [setup_source_transformation_list, setup_source_edit, setup_source_delete]) +register_links(WebFormSource, [setup_web_form_list, setup_staging_folder_list], menu_name='form_header') +register_links(WebFormSource, [setup_source_transformation_list, setup_source_edit, setup_source_delete]) register_links(['sources:setup_web_form_list', 'sources:setup_staging_folder_list', 'sources:setup_watch_folder_list', 'sources:setup_source_edit', 'sources:setup_source_delete', 'sources:setup_source_create'], [setup_sources, setup_source_create], menu_name='sidebar') -register_links(StagingFolder, [setup_web_form_list, setup_staging_folder_list], menu_name='form_header') -register_links(StagingFolder, [setup_source_transformation_list, setup_source_edit, setup_source_delete]) +register_links(StagingFolderSource, [setup_web_form_list, setup_staging_folder_list], menu_name='form_header') +register_links(StagingFolderSource, [setup_source_transformation_list, setup_source_edit, setup_source_delete]) -register_links(WatchFolder, [setup_web_form_list, setup_staging_folder_list, setup_watch_folder_list], menu_name='form_header') -register_links(WatchFolder, [setup_source_transformation_list, setup_source_edit, setup_source_delete]) +register_links(WatchFolderSource, [setup_web_form_list, setup_staging_folder_list, setup_watch_folder_list], menu_name='form_header') +register_links(WatchFolderSource, [setup_source_transformation_list, setup_source_edit, setup_source_delete]) # Document version register_links(['documents:document_version_list', 'documents:upload_version', 'documents:document_version_revert'], [upload_version], menu_name='sidebar') diff --git a/mayan/apps/sources/admin.py b/mayan/apps/sources/admin.py index c4d19eb763..cf1de0b3a1 100644 --- a/mayan/apps/sources/admin.py +++ b/mayan/apps/sources/admin.py @@ -2,8 +2,8 @@ from __future__ import absolute_import from django.contrib import admin -from .models import StagingFolder, SourceTransformation, WebForm +from .models import StagingFolderSource, SourceTransformation, WebFormSource -admin.site.register(StagingFolder) +admin.site.register(StagingFolderSource) admin.site.register(SourceTransformation) -admin.site.register(WebForm) +admin.site.register(WebFormSource) diff --git a/mayan/apps/sources/api_views.py b/mayan/apps/sources/api_views.py index 39413f77d2..6a6ceed19c 100644 --- a/mayan/apps/sources/api_views.py +++ b/mayan/apps/sources/api_views.py @@ -11,7 +11,7 @@ from rest_framework.response import Response from documents.settings import (DISPLAY_SIZE, ZOOM_MAX_LEVEL, ZOOM_MIN_LEVEL) -from .models import StagingFolder +from .models import StagingFolderSource from .serializers import (StagingFolderFileSerializer, StagingFolderSerializer, StagingSourceFileImageSerializer) @@ -23,7 +23,7 @@ class APIStagingSourceFileView(generics.GenericAPIView): serializer_class = StagingFolderFileSerializer def get(self, request, staging_folder_pk, encoded_filename): - staging_folder = get_object_or_404(StagingFolder, pk=staging_folder_pk) + staging_folder = get_object_or_404(StagingFolderSource, pk=staging_folder_pk) return Response(StagingFolderFileSerializer(staging_folder.get_file(encoded_filename=encoded_filename), context={'request': request}).data) @@ -33,7 +33,7 @@ class APIStagingSourceListView(generics.ListAPIView): """ serializer_class = StagingFolderSerializer - queryset = StagingFolder.objects.all() + queryset = StagingFolderSource.objects.all() class APIStagingSourceView(generics.RetrieveAPIView): @@ -41,7 +41,7 @@ class APIStagingSourceView(generics.RetrieveAPIView): Details of the selected staging folders and the files it contains. """ serializer_class = StagingFolderSerializer - queryset = StagingFolder.objects.all() + queryset = StagingFolderSource.objects.all() class APIStagingSourceFileImageView(generics.GenericAPIView): @@ -55,7 +55,7 @@ class APIStagingSourceFileImageView(generics.GenericAPIView): serializer_class = StagingSourceFileImageSerializer def get(self, request, staging_folder_pk, encoded_filename): - staging_folder = get_object_or_404(StagingFolder, pk=staging_folder_pk) + staging_folder = get_object_or_404(StagingFolderSource, pk=staging_folder_pk) staging_file = staging_folder.get_file(encoded_filename=encoded_filename) size = request.GET.get('size', DISPLAY_SIZE) diff --git a/mayan/apps/sources/forms.py b/mayan/apps/sources/forms.py index 83cb9f9ce9..938e168384 100644 --- a/mayan/apps/sources/forms.py +++ b/mayan/apps/sources/forms.py @@ -8,9 +8,9 @@ from django.utils.translation import ugettext_lazy as _ from documents.forms import DocumentForm -from .models import SourceTransformation, StagingFolder, WebForm, WatchFolder +from .models import (SourceTransformation, StagingFolderSource, WebFormSource, + WatchFolderSource) from .utils import validate_whitelist_blacklist -from .widgets import FamFamRadioSelect logger = logging.getLogger(__name__) @@ -77,17 +77,17 @@ class WebFormForm(DocumentForm): class WebFormSetupForm(forms.ModelForm): class Meta: - model = WebForm + model = WebFormSource class StagingFolderSetupForm(forms.ModelForm): class Meta: - model = StagingFolder + model = StagingFolderSource class WatchFolderSetupForm(forms.ModelForm): class Meta: - model = WatchFolder + model = WatchFolderSource class SourceTransformationForm(forms.ModelForm): diff --git a/mayan/apps/sources/links.py b/mayan/apps/sources/links.py index dfc8892bae..8327bc48e8 100644 --- a/mayan/apps/sources/links.py +++ b/mayan/apps/sources/links.py @@ -5,7 +5,7 @@ from django.utils.translation import ugettext_lazy as _ from documents.permissions import (PERMISSION_DOCUMENT_CREATE, PERMISSION_DOCUMENT_NEW_VERSION) -from .models import (StagingFolder, WatchFolder, WebForm) +from .models import StagingFolderSource, WatchFolderSource, WebFormSource from .permissions import (PERMISSION_SOURCES_SETUP_CREATE, PERMISSION_SOURCES_SETUP_DELETE, PERMISSION_SOURCES_SETUP_EDIT, @@ -16,17 +16,17 @@ document_create_siblings = {'text': _(u'Clone metadata'), 'view': 'sources:docum staging_file_delete = {'text': _(u'Delete'), 'view': 'sources:staging_file_delete', 'args': ['source.pk', 'object.encoded_filename'], 'famfam': 'delete', 'keep_query': True, 'permissions': [PERMISSION_DOCUMENT_NEW_VERSION, PERMISSION_DOCUMENT_CREATE]} -setup_sources = {'text': _(u'Sources'), 'view': 'sources:setup_web_form_list', 'famfam': 'application_form', 'icon': 'application_form.png', 'children_classes': [WebForm], 'permissions': [PERMISSION_SOURCES_SETUP_VIEW], 'children_view_regex': [r'setup_web_form', r'setup_staging_folder', r'setup_source_']} -setup_web_form_list = {'text': _(u'Web forms'), 'view': 'sources:setup_web_form_list', 'famfam': 'application_form', 'icon': 'application_form.png', 'children_classes': [WebForm], 'permissions': [PERMISSION_SOURCES_SETUP_VIEW]} -setup_staging_folder_list = {'text': _(u'Staging folders'), 'view': 'sources:setup_staging_folder_list', 'famfam': 'folder_camera', 'children_classes': [StagingFolder], 'permissions': [PERMISSION_SOURCES_SETUP_VIEW]} -setup_watch_folder_list = {'text': _(u'Watch folders'), 'view': 'sources:setup_watch_folder_list', 'famfam': 'folder_magnify', 'children_classes': [WatchFolder], 'permissions': [PERMISSION_SOURCES_SETUP_VIEW]} +setup_sources = {'text': _(u'Sources'), 'view': 'sources:setup_web_form_list', 'famfam': 'application_form', 'icon': 'application_form.png', 'children_classes': [WebFormSource], 'permissions': [PERMISSION_SOURCES_SETUP_VIEW], 'children_view_regex': [r'setup_web_form', r'setup_staging_folder', r'setup_source_']} +setup_web_form_list = {'text': _(u'Web forms'), 'view': 'sources:setup_web_form_list', 'famfam': 'application_form', 'icon': 'application_form.png', 'children_classes': [WebFormSource], 'permissions': [PERMISSION_SOURCES_SETUP_VIEW]} +setup_staging_folder_list = {'text': _(u'Staging folders'), 'view': 'sources:setup_staging_folder_list', 'famfam': 'folder_camera', 'children_classes': [StagingFolderSource], 'permissions': [PERMISSION_SOURCES_SETUP_VIEW]} +setup_watch_folder_list = {'text': _(u'Watch folders'), 'view': 'sources:setup_watch_folder_list', 'famfam': 'folder_magnify', 'children_classes': [WatchFolderSource], 'permissions': [PERMISSION_SOURCES_SETUP_VIEW]} -setup_source_edit = {'text': _(u'Edit'), 'view': 'sources:setup_source_edit', 'args': ['source.source_type', 'source.pk'], 'famfam': 'application_form_edit', 'permissions': [PERMISSION_SOURCES_SETUP_EDIT]} -setup_source_delete = {'text': _(u'Delete'), 'view': 'sources:setup_source_delete', 'args': ['source.source_type', 'source.pk'], 'famfam': 'application_form_delete', 'permissions': [PERMISSION_SOURCES_SETUP_DELETE]} +setup_source_edit = {'text': _(u'Edit'), 'view': 'sources:setup_source_edit', 'args': ['source.pk'], 'famfam': 'application_form_edit', 'permissions': [PERMISSION_SOURCES_SETUP_EDIT]} +setup_source_delete = {'text': _(u'Delete'), 'view': 'sources:setup_source_delete', 'args': ['source.pk'], 'famfam': 'application_form_delete', 'permissions': [PERMISSION_SOURCES_SETUP_DELETE]} setup_source_create = {'text': _(u'Add new source'), 'view': 'sources:setup_source_create', 'args': 'source_type', 'famfam': 'application_form_add', 'permissions': [PERMISSION_SOURCES_SETUP_CREATE]} -setup_source_transformation_list = {'text': _(u'Transformations'), 'view': 'sources:setup_source_transformation_list', 'args': ['source.source_type', 'source.pk'], 'famfam': 'shape_move_front', 'permissions': [PERMISSION_SOURCES_SETUP_EDIT]} -setup_source_transformation_create = {'text': _(u'Add transformation'), 'view': 'sources:setup_source_transformation_create', 'args': ['source.source_type', 'source.pk'], 'famfam': 'shape_square_add', 'permissions': [PERMISSION_SOURCES_SETUP_EDIT]} +setup_source_transformation_list = {'text': _(u'Transformations'), 'view': 'sources:setup_source_transformation_list', 'args': ['source.pk'], 'famfam': 'shape_move_front', 'permissions': [PERMISSION_SOURCES_SETUP_EDIT]} +setup_source_transformation_create = {'text': _(u'Add transformation'), 'view': 'sources:setup_source_transformation_create', 'args': ['source.pk'], 'famfam': 'shape_square_add', 'permissions': [PERMISSION_SOURCES_SETUP_EDIT]} setup_source_transformation_edit = {'text': _(u'Edit'), 'view': 'sources:setup_source_transformation_edit', 'args': 'transformation.pk', 'famfam': 'shape_square_edit', 'permissions': [PERMISSION_SOURCES_SETUP_EDIT]} setup_source_transformation_delete = {'text': _(u'Delete'), 'view': 'sources:setup_source_transformation_delete', 'args': 'transformation.pk', 'famfam': 'shape_square_delete', 'permissions': [PERMISSION_SOURCES_SETUP_EDIT]} diff --git a/mayan/apps/sources/migrations/0004_auto__del_stagingfolder__del_webform__del_watchfolder__del_outofproces.py b/mayan/apps/sources/migrations/0004_auto__del_stagingfolder__del_webform__del_watchfolder__del_outofproces.py new file mode 100644 index 0000000000..911eae6265 --- /dev/null +++ b/mayan/apps/sources/migrations/0004_auto__del_stagingfolder__del_webform__del_watchfolder__del_outofproces.py @@ -0,0 +1,201 @@ +# -*- coding: utf-8 -*- +from south.utils import datetime_utils as datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + # Deleting model 'StagingFolder' + db.delete_table(u'sources_stagingfolder') + + # Deleting model 'WebForm' + db.delete_table(u'sources_webform') + + # Deleting model 'WatchFolder' + db.delete_table(u'sources_watchfolder') + + # Deleting model 'OutOfProcess' + db.delete_table(u'sources_outofprocess') + + # Adding model 'Source' + db.create_table(u'sources_source', ( + (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('title', self.gf('django.db.models.fields.CharField')(max_length=64)), + ('enabled', self.gf('django.db.models.fields.BooleanField')(default=True)), + ('whitelist', self.gf('django.db.models.fields.TextField')(blank=True)), + ('blacklist', self.gf('django.db.models.fields.TextField')(blank=True)), + )) + db.send_create_signal(u'sources', ['Source']) + + # Adding model 'InteractiveSource' + db.create_table(u'sources_interactivesource', ( + (u'source_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['sources.Source'], unique=True, primary_key=True)), + )) + db.send_create_signal(u'sources', ['InteractiveSource']) + + # Adding model 'WatchFolderSource' + db.create_table(u'sources_watchfoldersource', ( + (u'outofprocesssource_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['sources.OutOfProcessSource'], unique=True, primary_key=True)), + ('folder_path', self.gf('django.db.models.fields.CharField')(max_length=255)), + ('uncompress', self.gf('django.db.models.fields.CharField')(max_length=1)), + ('delete_after_upload', self.gf('django.db.models.fields.BooleanField')(default=True)), + ('interval', self.gf('django.db.models.fields.PositiveIntegerField')()), + )) + db.send_create_signal(u'sources', ['WatchFolderSource']) + + # Adding model 'WebFormSource' + db.create_table(u'sources_webformsource', ( + (u'interactivesource_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['sources.InteractiveSource'], unique=True, primary_key=True)), + ('uncompress', self.gf('django.db.models.fields.CharField')(max_length=1)), + )) + db.send_create_signal(u'sources', ['WebFormSource']) + + # Adding model 'OutOfProcessSource' + db.create_table(u'sources_outofprocesssource', ( + (u'source_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['sources.Source'], unique=True, primary_key=True)), + )) + db.send_create_signal(u'sources', ['OutOfProcessSource']) + + # Adding model 'StagingFolderSource' + db.create_table(u'sources_stagingfoldersource', ( + (u'interactivesource_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['sources.InteractiveSource'], unique=True, primary_key=True)), + ('folder_path', self.gf('django.db.models.fields.CharField')(max_length=255)), + ('preview_width', self.gf('django.db.models.fields.IntegerField')()), + ('preview_height', self.gf('django.db.models.fields.IntegerField')(null=True, blank=True)), + ('uncompress', self.gf('django.db.models.fields.CharField')(max_length=1)), + ('delete_after_upload', self.gf('django.db.models.fields.BooleanField')(default=True)), + )) + db.send_create_signal(u'sources', ['StagingFolderSource']) + + + def backwards(self, orm): + # Adding model 'StagingFolder' + db.create_table(u'sources_stagingfolder', ( + ('folder_path', self.gf('django.db.models.fields.CharField')(max_length=255)), + ('uncompress', self.gf('django.db.models.fields.CharField')(max_length=1)), + ('delete_after_upload', self.gf('django.db.models.fields.BooleanField')(default=True)), + ('whitelist', self.gf('django.db.models.fields.TextField')(blank=True)), + ('preview_height', self.gf('django.db.models.fields.IntegerField')(null=True, blank=True)), + ('blacklist', self.gf('django.db.models.fields.TextField')(blank=True)), + ('preview_width', self.gf('django.db.models.fields.IntegerField')()), + (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('title', self.gf('django.db.models.fields.CharField')(max_length=64)), + ('enabled', self.gf('django.db.models.fields.BooleanField')(default=True)), + )) + db.send_create_signal(u'sources', ['StagingFolder']) + + # Adding model 'WebForm' + db.create_table(u'sources_webform', ( + ('uncompress', self.gf('django.db.models.fields.CharField')(max_length=1)), + ('whitelist', self.gf('django.db.models.fields.TextField')(blank=True)), + ('title', self.gf('django.db.models.fields.CharField')(max_length=64)), + ('enabled', self.gf('django.db.models.fields.BooleanField')(default=True)), + ('blacklist', self.gf('django.db.models.fields.TextField')(blank=True)), + (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + )) + db.send_create_signal(u'sources', ['WebForm']) + + # Adding model 'WatchFolder' + db.create_table(u'sources_watchfolder', ( + ('blacklist', self.gf('django.db.models.fields.TextField')(blank=True)), + ('folder_path', self.gf('django.db.models.fields.CharField')(max_length=255)), + ('title', self.gf('django.db.models.fields.CharField')(max_length=64)), + ('delete_after_upload', self.gf('django.db.models.fields.BooleanField')(default=True)), + ('whitelist', self.gf('django.db.models.fields.TextField')(blank=True)), + ('interval', self.gf('django.db.models.fields.PositiveIntegerField')()), + ('enabled', self.gf('django.db.models.fields.BooleanField')(default=True)), + (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('uncompress', self.gf('django.db.models.fields.CharField')(max_length=1)), + )) + db.send_create_signal(u'sources', ['WatchFolder']) + + # Adding model 'OutOfProcess' + db.create_table(u'sources_outofprocess', ( + ('title', self.gf('django.db.models.fields.CharField')(max_length=64)), + ('whitelist', self.gf('django.db.models.fields.TextField')(blank=True)), + ('enabled', self.gf('django.db.models.fields.BooleanField')(default=True)), + ('blacklist', self.gf('django.db.models.fields.TextField')(blank=True)), + (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + )) + db.send_create_signal(u'sources', ['OutOfProcess']) + + # Deleting model 'Source' + db.delete_table(u'sources_source') + + # Deleting model 'InteractiveSource' + db.delete_table(u'sources_interactivesource') + + # Deleting model 'WatchFolderSource' + db.delete_table(u'sources_watchfoldersource') + + # Deleting model 'WebFormSource' + db.delete_table(u'sources_webformsource') + + # Deleting model 'OutOfProcessSource' + db.delete_table(u'sources_outofprocesssource') + + # Deleting model 'StagingFolderSource' + db.delete_table(u'sources_stagingfoldersource') + + + models = { + u'contenttypes.contenttype': { + 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, + 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + }, + u'sources.interactivesource': { + 'Meta': {'ordering': "('title',)", 'object_name': 'InteractiveSource', '_ormbases': [u'sources.Source']}, + u'source_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['sources.Source']", 'unique': 'True', 'primary_key': 'True'}) + }, + u'sources.outofprocesssource': { + 'Meta': {'ordering': "('title',)", 'object_name': 'OutOfProcessSource', '_ormbases': [u'sources.Source']}, + u'source_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['sources.Source']", 'unique': 'True', 'primary_key': 'True'}) + }, + u'sources.source': { + 'Meta': {'ordering': "('title',)", 'object_name': 'Source'}, + 'blacklist': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '64'}), + 'whitelist': ('django.db.models.fields.TextField', [], {'blank': 'True'}) + }, + u'sources.sourcetransformation': { + 'Meta': {'ordering': "('order',)", 'object_name': 'SourceTransformation'}, + 'arguments': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'order': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0', 'null': 'True', 'db_index': 'True', 'blank': 'True'}), + 'transformation': ('django.db.models.fields.CharField', [], {'max_length': '128'}) + }, + u'sources.stagingfoldersource': { + 'Meta': {'ordering': "('title',)", 'object_name': 'StagingFolderSource', '_ormbases': [u'sources.InteractiveSource']}, + 'delete_after_upload': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'folder_path': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + u'interactivesource_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['sources.InteractiveSource']", 'unique': 'True', 'primary_key': 'True'}), + 'preview_height': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'preview_width': ('django.db.models.fields.IntegerField', [], {}), + 'uncompress': ('django.db.models.fields.CharField', [], {'max_length': '1'}) + }, + u'sources.watchfoldersource': { + 'Meta': {'ordering': "('title',)", 'object_name': 'WatchFolderSource', '_ormbases': [u'sources.OutOfProcessSource']}, + 'delete_after_upload': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'folder_path': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'interval': ('django.db.models.fields.PositiveIntegerField', [], {}), + u'outofprocesssource_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['sources.OutOfProcessSource']", 'unique': 'True', 'primary_key': 'True'}), + 'uncompress': ('django.db.models.fields.CharField', [], {'max_length': '1'}) + }, + u'sources.webformsource': { + 'Meta': {'ordering': "('title',)", 'object_name': 'WebFormSource', '_ormbases': [u'sources.InteractiveSource']}, + u'interactivesource_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['sources.InteractiveSource']", 'unique': 'True', 'primary_key': 'True'}), + 'uncompress': ('django.db.models.fields.CharField', [], {'max_length': '1'}) + } + } + + complete_apps = ['sources'] \ No newline at end of file diff --git a/mayan/apps/sources/models.py b/mayan/apps/sources/models.py index 174f8a6f64..a99aae686f 100644 --- a/mayan/apps/sources/models.py +++ b/mayan/apps/sources/models.py @@ -10,6 +10,8 @@ from django.core.exceptions import ValidationError from django.db import models, transaction from django.utils.translation import ugettext_lazy as _ +from model_utils.managers import InheritanceManager + from acls.utils import apply_default_acls from common.compressed_files import CompressedFile, NotACompressedFile from converter.api import get_available_transformations_choices @@ -31,12 +33,14 @@ from .managers import SourceTransformationManager logger = logging.getLogger(__name__) -class BaseModel(models.Model): +class Source(models.Model): title = models.CharField(max_length=64, verbose_name=_(u'Title')) enabled = models.BooleanField(default=True, verbose_name=_(u'Enabled')) whitelist = models.TextField(blank=True, verbose_name=_(u'Whitelist'), editable=False) blacklist = models.TextField(blank=True, verbose_name=_(u'Blacklist'), editable=False) + objects = InheritanceManager() + @classmethod def class_fullname(cls): return unicode(dict(SOURCE_CHOICES).get(cls.source_type)) @@ -136,15 +140,17 @@ class BaseModel(models.Model): class Meta: ordering = ('title',) - abstract = True + verbose_name = _(u'Source') + verbose_name_plural = _(u'Sources') -class InteractiveBaseModel(BaseModel): - class Meta(BaseModel.Meta): - abstract = True +class InteractiveSource(Source): + class Meta: + verbose_name = _(u'Interactive source') + verbose_name_plural = _(u'Interactive sources') -class StagingFolder(InteractiveBaseModel): +class StagingFolderSource(InteractiveSource): is_interactive = True source_type = SOURCE_CHOICE_STAGING @@ -172,24 +178,32 @@ class StagingFolder(InteractiveBaseModel): except OSError as exception: raise Exception(_(u'Unable get list of staging files: %s') % exception) - class Meta(InteractiveBaseModel.Meta): + class Meta: verbose_name = _(u'Staging folder') verbose_name_plural = _(u'Staging folders') -class WebForm(InteractiveBaseModel): +class WebFormSource(InteractiveSource): is_interactive = True source_type = SOURCE_CHOICE_WEB_FORM uncompress = models.CharField(max_length=1, choices=SOURCE_INTERACTIVE_UNCOMPRESS_CHOICES, verbose_name=_(u'Uncompress'), help_text=_(u'Whether to expand or not compressed archives.')) # Default path - class Meta(InteractiveBaseModel.Meta): + class Meta: verbose_name = _(u'Web form') verbose_name_plural = _(u'Web forms') -class WatchFolder(BaseModel): +class OutOfProcessSource(Source): + is_interactive = False + + class Meta: + verbose_name = _(u'Out of process') + verbose_name_plural = _(u'Out of process') + + +class WatchFolderSource(OutOfProcessSource): is_interactive = False source_type = SOURCE_CHOICE_WATCH @@ -198,28 +212,14 @@ class WatchFolder(BaseModel): delete_after_upload = models.BooleanField(default=True, verbose_name=_(u'Delete after upload'), help_text=_(u'Delete the file after is has been successfully uploaded.')) interval = models.PositiveIntegerField(verbose_name=_(u'Interval'), help_text=_(u'Inverval in seconds where the watch folder path is checked for new documents.')) - def save(self, *args, **kwargs): - if self.pk: - remove_job(self.internal_name()) - super(WatchFolder, self).save(*args, **kwargs) - self.schedule() - - def schedule(self): - if self.enabled: - register_interval_job(self.internal_name(), - title=self.fullname(), func=self.execute, - kwargs={'source_id': self.pk}, seconds=self.interval - ) - def execute(self, source_id): - source = WatchFolder.objects.get(pk=source_id) - if source.uncompress == SOURCE_UNCOMPRESS_CHOICE_Y: + if self.uncompress == SOURCE_UNCOMPRESS_CHOICE_Y: expand = True else: expand = False print 'execute: %s' % self.internal_name() - class Meta(BaseModel.Meta): + class Meta: verbose_name = _(u'Watch folder') verbose_name_plural = _(u'Watch folders') @@ -267,11 +267,3 @@ class SourceTransformation(models.Model): ordering = ('order',) verbose_name = _(u'Document source transformation') verbose_name_plural = _(u'Document source transformations') - - -class OutOfProcess(BaseModel): - is_interactive = False - - class Meta(BaseModel.Meta): - verbose_name = _(u'Out of process') - verbose_name_plural = _(u'Out of process') diff --git a/mayan/apps/sources/serializers.py b/mayan/apps/sources/serializers.py index 625b1e7585..256baec8c6 100644 --- a/mayan/apps/sources/serializers.py +++ b/mayan/apps/sources/serializers.py @@ -5,7 +5,7 @@ import logging from rest_framework import serializers from rest_framework.reverse import reverse -from .models import StagingFolder +from .models import StagingFolderSource logger = logging.getLogger(__name__) @@ -33,7 +33,7 @@ class StagingFolderSerializer(serializers.HyperlinkedModelSerializer): return [] class Meta: - model = StagingFolder + model = StagingFolderSource class StagingSourceFileImageSerializer(serializers.Serializer): diff --git a/mayan/apps/sources/urls.py b/mayan/apps/sources/urls.py index d492eb30e6..9a3334ed42 100644 --- a/mayan/apps/sources/urls.py +++ b/mayan/apps/sources/urls.py @@ -11,7 +11,7 @@ from .wizards import DocumentCreateWizard urlpatterns = patterns('sources.views', url(r'^staging_file/(?P\d+)/(?P.+)/delete/$', 'staging_file_delete', name='staging_file_delete'), - url(r'^upload/document/new/interactive/(?P\w+)/(?P\d+)/$', 'upload_interactive', (), 'upload_interactive'), + url(r'^upload/document/new/interactive/(?P\d+)/$', 'upload_interactive', (), 'upload_interactive'), url(r'^upload/document/new/interactive/$', 'upload_interactive', (), 'upload_interactive'), url(r'^upload/document/(?P\d+)/version/interactive/(?P\w+)/(?P\d+)/$', 'upload_interactive', (), 'upload_version'), @@ -24,12 +24,12 @@ urlpatterns = patterns('sources.views', url(r'^setup/interactive/%s/list/$' % SOURCE_CHOICE_WATCH, 'setup_source_list', {'source_type': SOURCE_CHOICE_WATCH}, 'setup_watch_folder_list'), url(r'^setup/interactive/(?P\w+)/list/$', 'setup_source_list', (), 'setup_source_list'), - url(r'^setup/interactive/(?P\w+)/(?P\d+)/edit/$', 'setup_source_edit', (), 'setup_source_edit'), - url(r'^setup/interactive/(?P\w+)/(?P\d+)/delete/$', 'setup_source_delete', (), 'setup_source_delete'), + url(r'^setup/interactive/(?P\d+)/edit/$', 'setup_source_edit', (), 'setup_source_edit'), + url(r'^setup/interactive/(?P\d+)/delete/$', 'setup_source_delete', (), 'setup_source_delete'), url(r'^setup/interactive/(?P\w+)/create/$', 'setup_source_create', (), 'setup_source_create'), - url(r'^setup/interactive/(?P\w+)/(?P\d+)/transformation/list/$', 'setup_source_transformation_list', (), 'setup_source_transformation_list'), - url(r'^setup/interactive/(?P\w+)/(?P\d+)/transformation/create/$', 'setup_source_transformation_create', (), 'setup_source_transformation_create'), + url(r'^setup/interactive/(?P\d+)/transformation/list/$', 'setup_source_transformation_list', (), 'setup_source_transformation_list'), + url(r'^setup/interactive/(?P\d+)/transformation/create/$', 'setup_source_transformation_create', (), 'setup_source_transformation_create'), url(r'^setup/interactive/source/transformation/(?P\d+)/edit/$', 'setup_source_transformation_edit', (), 'setup_source_transformation_edit'), url(r'^setup/interactive/source/transformation/(?P\d+)/delete/$', 'setup_source_transformation_delete', (), 'setup_source_transformation_delete'), diff --git a/mayan/apps/sources/views.py b/mayan/apps/sources/views.py index e010916d45..8b5e636bd5 100644 --- a/mayan/apps/sources/views.py +++ b/mayan/apps/sources/views.py @@ -4,7 +4,6 @@ from django.conf import settings from django.contrib import messages from django.core.exceptions import PermissionDenied from django.core.urlresolvers import reverse -from django.conf import settings from django.http import HttpResponseRedirect from django.shortcuts import render_to_response, get_object_or_404 from django.template import RequestContext @@ -28,7 +27,8 @@ from .forms import (StagingDocumentForm, StagingFolderSetupForm, from .literals import (SOURCE_CHOICE_STAGING, SOURCE_CHOICE_WATCH, SOURCE_CHOICE_WEB_FORM, SOURCE_UNCOMPRESS_CHOICE_ASK, SOURCE_UNCOMPRESS_CHOICE_Y) -from .models import StagingFolder, SourceTransformation, WatchFolder, WebForm +from .models import (Source, StagingFolderSource, SourceTransformation, + WatchFolderSource, WebFormSource) from .permissions import (PERMISSION_SOURCES_SETUP_CREATE, PERMISSION_SOURCES_SETUP_DELETE, PERMISSION_SOURCES_SETUP_EDIT, @@ -57,11 +57,11 @@ def return_function(obj): def get_tab_link_for_source(source, document=None): if document: - view = u'upload_version' - args = [document.pk, u'"%s"' % source.source_type, source.pk] + view = u'sources:upload_version' + args = [document.pk, source.pk] else: view = u'sources:upload_interactive' - args = [u'"%s"' % source.source_type, source.pk] + args = [source.pk] return { 'text': source.title, @@ -75,11 +75,11 @@ def get_tab_link_for_source(source, document=None): def get_active_tab_links(document=None): tab_links = [] - web_forms = WebForm.objects.filter(enabled=True) + web_forms = WebFormSource.objects.filter(enabled=True) for web_form in web_forms: tab_links.append(get_tab_link_for_source(web_form, document)) - staging_folders = StagingFolder.objects.filter(enabled=True) + staging_folders = StagingFolderSource.objects.filter(enabled=True) for staging_folder in staging_folders: tab_links.append(get_tab_link_for_source(staging_folder, document)) @@ -90,7 +90,7 @@ def get_active_tab_links(document=None): } -def upload_interactive(request, source_type=None, source_id=None, document_pk=None): +def upload_interactive(request, source_id=None, document_pk=None): subtemplates_list = [] if document_pk: @@ -109,7 +109,7 @@ def upload_interactive(request, source_type=None, source_id=None, document_pk=No context = {} if results[SOURCE_CHOICE_WEB_FORM].count() == 0 and results[SOURCE_CHOICE_STAGING].count() == 0: - source_setup_link = mark_safe('%s' % (reverse('setup_web_form_list'), ugettext(u'Here'))) + source_setup_link = mark_safe('%s' % (reverse('sources:setup_web_form_list'), ugettext(u'Here'))) subtemplates_list.append( { 'name': 'main/generic_subtemplate.html', @@ -130,170 +130,115 @@ def upload_interactive(request, source_type=None, source_id=None, document_pk=No else: document_type = None - if source_type is None and source_id is None: + if source_id is None: if results[SOURCE_CHOICE_WEB_FORM].count(): - source_type = results[SOURCE_CHOICE_WEB_FORM][0].source_type source_id = results[SOURCE_CHOICE_WEB_FORM][0].pk elif results[SOURCE_CHOICE_STAGING].count(): - source_type = results[SOURCE_CHOICE_STAGING][0].source_type source_id = results[SOURCE_CHOICE_STAGING][0].pk - if source_type and source_id: - if source_type == SOURCE_CHOICE_WEB_FORM: - web_form = get_object_or_404(WebForm, pk=source_id) - context['source'] = web_form - if request.method == 'POST': - form = WebFormForm(request.POST, request.FILES, - document_type=document_type, - show_expand=(web_form.uncompress == SOURCE_UNCOMPRESS_CHOICE_ASK) and not document, - source=web_form, - instance=document - ) - if form.is_valid(): - try: - if document: - expand = False + if source_id: + source = get_object_or_404(Source.objects.select_subclasses(), pk=source_id) + if isinstance(source, WebFormSource): + form_class = WebFormForm + else: + form_class = StagingDocumentForm + + context['source'] = source + + if request.method == 'POST': + form = form_class(request.POST, request.FILES, + document_type=document_type, + show_expand=(source.uncompress == SOURCE_UNCOMPRESS_CHOICE_ASK) and not document, + source=source, + instance=document + ) + + if form.is_valid(): + try: + if document: + expand = False + else: + if source.uncompress == SOURCE_UNCOMPRESS_CHOICE_ASK: + expand = form.cleaned_data.get('expand') else: - if web_form.uncompress == SOURCE_UNCOMPRESS_CHOICE_ASK: - expand = form.cleaned_data.get('expand') + if source.uncompress == SOURCE_UNCOMPRESS_CHOICE_Y: + expand = True else: - if web_form.uncompress == SOURCE_UNCOMPRESS_CHOICE_Y: - expand = True - else: - expand = False + expand = False - new_filename = get_form_filename(form) + new_filename = get_form_filename(form) - result = web_form.upload_file( - request.FILES['file'], - new_filename, use_file_name=form.cleaned_data.get('use_file_name', False), - document_type=document_type, - expand=expand, - metadata_dict_list=decode_metadata_from_url(request.GET), - user=request.user, - document=document, - new_version_data=form.cleaned_data.get('new_version_data'), - description=form.cleaned_data.get('description') - ) - if document: - messages.success(request, _(u'New document version uploaded successfully.')) - return HttpResponseRedirect(reverse('document_version_list', args=[document.pk])) - else: - if result['is_compressed'] is None: - messages.success(request, _(u'File uploaded successfully.')) + if isinstance(source, WebFormSource): + file_object = request.FILES['file'] + else: + staging_file = source.get_file(encoded_filename=form.cleaned_data['staging_file_id']) + file_object = staging_file.as_file() - if result['is_compressed'] is True: - messages.success(request, _(u'File uncompressed successfully and uploaded as individual files.')) + result = source.upload_file( + file_object, + new_filename, use_file_name=form.cleaned_data.get('use_file_name', False), + document_type=document_type, + expand=expand, + metadata_dict_list=decode_metadata_from_url(request.GET), + user=request.user, + document=document, + new_version_data=form.cleaned_data.get('new_version_data'), + description=form.cleaned_data.get('description') + ) - if result['is_compressed'] is False: - messages.warning(request, _(u'File was not a compressed file, uploaded as it was.')) - - return HttpResponseRedirect(request.get_full_path()) - except NewDocumentVersionNotAllowed: - messages.error(request, _(u'New version uploads are not allowed for this document.')) - except Exception as exception: - if settings.DEBUG: - raise - messages.error(request, _(u'Unhandled exception: %s') % exception) - else: - form = WebFormForm( - show_expand=(web_form.uncompress == SOURCE_UNCOMPRESS_CHOICE_ASK) and not document, - document_type=document_type, - source=web_form, - instance=document - ) - if document: - title = _(u'Upload a new version from source: %s') % web_form.title - else: - title = _(u'Upload a local document from source: %s') % web_form.title - - subtemplates_list.append({ - 'name': 'main/generic_form_subtemplate.html', - 'context': { - 'form': form, - 'title': title, - }, - }) - elif source_type == SOURCE_CHOICE_STAGING: - staging_folder = get_object_or_404(StagingFolder, pk=source_id) - context['source'] = staging_folder - - if request.method == 'POST': - form = StagingDocumentForm(request.POST, request.FILES, - document_type=document_type, - show_expand=(staging_folder.uncompress == SOURCE_UNCOMPRESS_CHOICE_ASK) and not document, - source=staging_folder, - instance=document - ) - if form.is_valid(): - try: - staging_file = staging_folder.get_file(encoded_filename=form.cleaned_data['staging_file_id']) - if document: - expand = False - else: - if staging_folder.uncompress == SOURCE_UNCOMPRESS_CHOICE_ASK: - expand = form.cleaned_data.get('expand') - else: - if staging_folder.uncompress == SOURCE_UNCOMPRESS_CHOICE_Y: - expand = True - else: - expand = False - - new_filename = get_form_filename(form) - - result = staging_folder.upload_file( - staging_file.as_file(), - new_filename, use_file_name=form.cleaned_data.get('use_file_name', False), - document_type=document_type, - expand=expand, - metadata_dict_list=decode_metadata_from_url(request.GET), - user=request.user, - document=document, - new_version_data=form.cleaned_data.get('new_version_data'), - description=form.cleaned_data.get('description') - ) - if document: - messages.success(request, _(u'Document version from staging file: %s, uploaded successfully.') % staging_file.filename) - else: - if result['is_compressed'] is None: - messages.success(request, _(u'Staging file: %s, uploaded successfully.') % staging_file.filename) - - if result['is_compressed'] is True: - messages.success(request, _(u'Staging file: %s, uncompressed successfully and uploaded as individual files.') % staging_file.filename) - - if result['is_compressed'] is False: - messages.warning(request, _(u'Staging file: %s, was not compressed, uploaded as a single file.') % staging_file.filename) - - if staging_folder.delete_after_upload: + if isinstance(source, StagingFolderSource): + if source.delete_after_upload: staging_file.delete() messages.success(request, _(u'Staging file: %s, deleted successfully.') % staging_file.filename) - if document: - return HttpResponseRedirect(reverse('documents:document_view_simple', args=[document.pk])) - else: - return HttpResponseRedirect(request.get_full_path()) - except NewDocumentVersionNotAllowed: - messages.error(request, _(u'New version uploads are not allowed for this document.')) - except Exception as exception: - if settings.DEBUG: - raise - messages.error(request, _(u'Unhandled exception: %s') % exception) - else: - form = StagingDocumentForm(document_type=document_type, - show_expand=(staging_folder.uncompress == SOURCE_UNCOMPRESS_CHOICE_ASK) and not document, - source=staging_folder, - instance=document - ) + + if document: + messages.success(request, _(u'New document version uploaded successfully.')) + return HttpResponseRedirect(reverse('documents:document_version_list', args=[document.pk])) + else: + if result['is_compressed'] is None: + messages.success(request, _(u'File uploaded successfully.')) + + if result['is_compressed'] is True: + messages.success(request, _(u'File uncompressed successfully and uploaded as individual files.')) + + if result['is_compressed'] is False: + messages.warning(request, _(u'File was not a compressed file, uploaded as it was.')) + + return HttpResponseRedirect(request.get_full_path()) + except NewDocumentVersionNotAllowed: + messages.error(request, _(u'New version uploads are not allowed for this document.')) + except Exception as exception: + if settings.DEBUG: + raise + messages.error(request, _(u'Unhandled exception: %s') % exception) + else: + form = form_class( + show_expand=(source.uncompress == SOURCE_UNCOMPRESS_CHOICE_ASK) and not document, + document_type=document_type, + source=source, + instance=document + ) + + if document: + title = _(u'Upload a new version from source: %s') % source.title + else: + title = _(u'Upload a local document from source: %s') % source.title + + subtemplates_list.append({ + 'name': 'main/generic_form_subtemplate.html', + 'context': { + 'form': form, + 'title': title, + }, + }) + + if isinstance(source, StagingFolderSource): try: - staging_filelist = list(staging_folder.get_files()) + staging_filelist = list(source.get_files()) except Exception as exception: messages.error(request, exception) staging_filelist = [] finally: - if document: - title = _(u'Upload a new version from staging source: %s') % staging_folder.title - else: - title = _(u'Upload a document from staging source: %s') % staging_folder.title - subtemplates_list = [ { 'name': 'main/generic_form_subtemplate.html', @@ -373,7 +318,7 @@ def get_form_filename(form): def staging_file_delete(request, staging_folder_pk, encoded_filename): Permission.objects.check_permissions(request.user, [PERMISSION_DOCUMENT_CREATE, PERMISSION_DOCUMENT_NEW_VERSION]) - staging_folder = get_object_or_404(StagingFolder, pk=staging_folder_pk) + staging_folder = get_object_or_404(StagingFolderSource, pk=staging_folder_pk) staging_file = staging_folder.get_file(encoded_filename=encoded_filename) next = request.POST.get('next', request.GET.get('next', request.META.get('HTTP_REFERER', reverse(settings.LOGIN_REDIRECT_URL)))) @@ -405,11 +350,11 @@ def setup_source_list(request, source_type): Permission.objects.check_permissions(request.user, [PERMISSION_SOURCES_SETUP_VIEW]) if source_type == SOURCE_CHOICE_WEB_FORM: - cls = WebForm + cls = WebFormSource elif source_type == SOURCE_CHOICE_STAGING: - cls = StagingFolder + cls = StagingFolderSource elif source_type == SOURCE_CHOICE_WATCH: - cls = WatchFolder + cls = WatchFolderSource context = { 'object_list': cls.objects.all(), @@ -423,20 +368,17 @@ def setup_source_list(request, source_type): context_instance=RequestContext(request)) -def setup_source_edit(request, source_type, source_id): +def setup_source_edit(request, source_id): Permission.objects.check_permissions(request.user, [PERMISSION_SOURCES_SETUP_EDIT]) - if source_type == SOURCE_CHOICE_WEB_FORM: - cls = WebForm + source = get_object_or_404(Source.objects.select_subclasses(), pk=source_id) + if isinstance(source, WebFormSource): form_class = WebFormSetupForm - elif source_type == SOURCE_CHOICE_STAGING: - cls = StagingFolder + elif isinstance(source, StagingFolderSource): form_class = StagingFolderSetupForm - elif source_type == SOURCE_CHOICE_WATCH: - cls = WatchFolder + elif isinstance(source, WatchFolderSource): form_class = WatchFolderSetupForm - source = get_object_or_404(cls, pk=source_id) next = request.POST.get('next', request.GET.get('next', request.META.get('HTTP_REFERER', reverse(settings.LOGIN_REDIRECT_URL)))) if request.method == 'POST': @@ -458,31 +400,28 @@ def setup_source_edit(request, source_type, source_id): 'navigation_object_name': 'source', 'next': next, 'object_name': _(u'Source'), - 'source_type': source_type, + 'source_type': source.source_type, }, context_instance=RequestContext(request)) -def setup_source_delete(request, source_type, source_id): +def setup_source_delete(request, source_id): Permission.objects.check_permissions(request.user, [PERMISSION_SOURCES_SETUP_DELETE]) - if source_type == SOURCE_CHOICE_WEB_FORM: - cls = WebForm + source = get_object_or_404(Source.objects.select_subclasses(), pk=source_id) + redirect_view = reverse('sources:setup_source_list', args=[source.source_type]) + + if isinstance(source, WebFormSource): form_icon = u'application_form_delete.png' - redirect_view = 'setup_web_form_list' - elif source_type == SOURCE_CHOICE_STAGING: - cls = StagingFolder + redirect_view = 'sources:setup_web_form_list' + elif isinstance(source, StagingFolderSource): form_icon = u'folder_delete.png' - redirect_view = 'setup_staging_folder_list' - elif source_type == SOURCE_CHOICE_WATCH: - cls = WatchFolder + redirect_view = 'sources:setup_staging_folder_list' + elif isinstance(source, WatchFolderSource): form_icon = u'folder_delete.png' - redirect_view = 'setup_watch_folder_list' + redirect_view = 'sources:setup_watch_folder_list' - redirect_view = reverse('sources:setup_source_list', args=[source_type]) previous = request.POST.get('previous', request.GET.get('previous', request.META.get('HTTP_REFERER', redirect_view))) - source = get_object_or_404(cls, pk=source_id) - if request.method == 'POST': try: source.delete() @@ -502,7 +441,7 @@ def setup_source_delete(request, source_type, source_id): 'delete_view': True, 'previous': previous, 'form_icon': form_icon, - 'source_type': source_type, + 'source_type': source.source_type, } return render_to_response('main/generic_confirm.html', context, @@ -513,13 +452,13 @@ def setup_source_create(request, source_type): Permission.objects.check_permissions(request.user, [PERMISSION_SOURCES_SETUP_CREATE]) if source_type == SOURCE_CHOICE_WEB_FORM: - cls = WebForm + cls = WebFormSource form_class = WebFormSetupForm elif source_type == SOURCE_CHOICE_STAGING: - cls = StagingFolder + cls = WebFormSource form_class = StagingFolderSetupForm elif source_type == SOURCE_CHOICE_WATCH: - cls = WatchFolder + cls = WebFormSource form_class = WatchFolderSetupForm if request.method == 'POST': @@ -543,17 +482,10 @@ def setup_source_create(request, source_type): context_instance=RequestContext(request)) -def setup_source_transformation_list(request, source_type, source_id): +def setup_source_transformation_list(request, source_id): Permission.objects.check_permissions(request.user, [PERMISSION_SOURCES_SETUP_EDIT]) - if source_type == SOURCE_CHOICE_WEB_FORM: - cls = WebForm - elif source_type == SOURCE_CHOICE_STAGING: - cls = StagingFolder - elif source_type == SOURCE_CHOICE_WATCH: - cls = WatchFolder - - source = get_object_or_404(cls, pk=source_id) + source = get_object_or_404(Source.objects.select_subclasses(), pk=source_id) context = { 'object_list': SourceTransformation.transformations.get_for_object(source), @@ -579,7 +511,7 @@ 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.source_type, source_transformation.content_object.pk]) + 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': @@ -612,7 +544,7 @@ 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.source_type, source_transformation.content_object.pk]) + 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': @@ -642,19 +574,12 @@ def setup_source_transformation_delete(request, transformation_id): context_instance=RequestContext(request)) -def setup_source_transformation_create(request, source_type, source_id): +def setup_source_transformation_create(request, source_id): Permission.objects.check_permissions(request.user, [PERMISSION_SOURCES_SETUP_EDIT]) - if source_type == SOURCE_CHOICE_WEB_FORM: - cls = WebForm - elif source_type == SOURCE_CHOICE_STAGING: - cls = StagingFolder - elif source_type == SOURCE_CHOICE_WATCH: - cls = WatchFolder + source = get_object_or_404(Source.objects.select_subclasses(), pk=source_id) - source = get_object_or_404(cls, pk=source_id) - - redirect_view = reverse('sources:setup_source_transformation_list', args=[source.source_type, source.pk]) + redirect_view = reverse('sources:setup_source_transformation_list', args=[source.pk]) if request.method == 'POST': form = SourceTransformationForm_create(request.POST) diff --git a/requirements/common.txt b/requirements/common.txt index 71cc753bb7..aa4527d0f5 100644 --- a/requirements/common.txt +++ b/requirements/common.txt @@ -10,6 +10,7 @@ django-pagination==1.0.7 django-compressor==1.4 django-cors-headers==0.13 django-taggit==0.12 +django-model-utils==2.2 django-mptt==0.6.1 django-rest-swagger==0.1.14 django-sendfile==0.3.6