Improve sources app model sub classes and inheritance handling

This commit is contained in:
Roberto Rosario
2014-10-03 14:37:01 -04:00
parent 3b03af9295
commit 060c7a4175
11 changed files with 404 additions and 283 deletions

View File

@@ -10,14 +10,16 @@ from rest_api.classes import APIEndPoint
from .classes import StagingFile from .classes import StagingFile
from .links import (document_create_multiple, document_create_siblings, from .links import (document_create_multiple, document_create_siblings,
staging_file_delete, setup_sources, setup_web_form_list, setup_sources, setup_web_form_list, setup_source_create,
setup_staging_folder_list, setup_watch_folder_list, setup_source_delete, setup_source_edit,
setup_source_edit, setup_source_delete, setup_source_create, setup_source_transformation_create,
setup_source_transformation_list, setup_source_transformation_create, setup_source_transformation_delete,
setup_source_transformation_edit, setup_source_transformation_delete, setup_source_transformation_edit,
upload_version) setup_source_transformation_list,
from .models import (WebForm, StagingFolder, SourceTransformation, setup_staging_folder_list, setup_watch_folder_list,
WatchFolder) staging_file_delete, upload_version)
from .models import (SourceTransformation, StagingFolderSource,
WatchFolderSource, WebFormSource)
from .urls import api_urls from .urls import api_urls
from .widgets import staging_file_thumbnail 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(['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(WebFormSource, [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_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(['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(StagingFolderSource, [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_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(WatchFolderSource, [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_source_transformation_list, setup_source_edit, setup_source_delete])
# Document version # Document version
register_links(['documents:document_version_list', 'documents:upload_version', 'documents:document_version_revert'], [upload_version], menu_name='sidebar') register_links(['documents:document_version_list', 'documents:upload_version', 'documents:document_version_revert'], [upload_version], menu_name='sidebar')

View File

@@ -2,8 +2,8 @@ from __future__ import absolute_import
from django.contrib import admin 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(SourceTransformation)
admin.site.register(WebForm) admin.site.register(WebFormSource)

View File

@@ -11,7 +11,7 @@ from rest_framework.response import Response
from documents.settings import (DISPLAY_SIZE, ZOOM_MAX_LEVEL, from documents.settings import (DISPLAY_SIZE, ZOOM_MAX_LEVEL,
ZOOM_MIN_LEVEL) ZOOM_MIN_LEVEL)
from .models import StagingFolder from .models import StagingFolderSource
from .serializers import (StagingFolderFileSerializer, StagingFolderSerializer, from .serializers import (StagingFolderFileSerializer, StagingFolderSerializer,
StagingSourceFileImageSerializer) StagingSourceFileImageSerializer)
@@ -23,7 +23,7 @@ class APIStagingSourceFileView(generics.GenericAPIView):
serializer_class = StagingFolderFileSerializer serializer_class = StagingFolderFileSerializer
def get(self, request, staging_folder_pk, encoded_filename): 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) 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 serializer_class = StagingFolderSerializer
queryset = StagingFolder.objects.all() queryset = StagingFolderSource.objects.all()
class APIStagingSourceView(generics.RetrieveAPIView): class APIStagingSourceView(generics.RetrieveAPIView):
@@ -41,7 +41,7 @@ class APIStagingSourceView(generics.RetrieveAPIView):
Details of the selected staging folders and the files it contains. Details of the selected staging folders and the files it contains.
""" """
serializer_class = StagingFolderSerializer serializer_class = StagingFolderSerializer
queryset = StagingFolder.objects.all() queryset = StagingFolderSource.objects.all()
class APIStagingSourceFileImageView(generics.GenericAPIView): class APIStagingSourceFileImageView(generics.GenericAPIView):
@@ -55,7 +55,7 @@ class APIStagingSourceFileImageView(generics.GenericAPIView):
serializer_class = StagingSourceFileImageSerializer serializer_class = StagingSourceFileImageSerializer
def get(self, request, staging_folder_pk, encoded_filename): 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) staging_file = staging_folder.get_file(encoded_filename=encoded_filename)
size = request.GET.get('size', DISPLAY_SIZE) size = request.GET.get('size', DISPLAY_SIZE)

View File

@@ -8,9 +8,9 @@ from django.utils.translation import ugettext_lazy as _
from documents.forms import DocumentForm 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 .utils import validate_whitelist_blacklist
from .widgets import FamFamRadioSelect
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -77,17 +77,17 @@ class WebFormForm(DocumentForm):
class WebFormSetupForm(forms.ModelForm): class WebFormSetupForm(forms.ModelForm):
class Meta: class Meta:
model = WebForm model = WebFormSource
class StagingFolderSetupForm(forms.ModelForm): class StagingFolderSetupForm(forms.ModelForm):
class Meta: class Meta:
model = StagingFolder model = StagingFolderSource
class WatchFolderSetupForm(forms.ModelForm): class WatchFolderSetupForm(forms.ModelForm):
class Meta: class Meta:
model = WatchFolder model = WatchFolderSource
class SourceTransformationForm(forms.ModelForm): class SourceTransformationForm(forms.ModelForm):

View File

@@ -5,7 +5,7 @@ from django.utils.translation import ugettext_lazy as _
from documents.permissions import (PERMISSION_DOCUMENT_CREATE, from documents.permissions import (PERMISSION_DOCUMENT_CREATE,
PERMISSION_DOCUMENT_NEW_VERSION) PERMISSION_DOCUMENT_NEW_VERSION)
from .models import (StagingFolder, WatchFolder, WebForm) from .models import StagingFolderSource, WatchFolderSource, WebFormSource
from .permissions import (PERMISSION_SOURCES_SETUP_CREATE, from .permissions import (PERMISSION_SOURCES_SETUP_CREATE,
PERMISSION_SOURCES_SETUP_DELETE, PERMISSION_SOURCES_SETUP_DELETE,
PERMISSION_SOURCES_SETUP_EDIT, 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]} 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_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': [WebForm], 'permissions': [PERMISSION_SOURCES_SETUP_VIEW]} 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': [StagingFolder], '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': [WatchFolder], '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_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.source_type', 'source.pk'], 'famfam': 'application_form_delete', 'permissions': [PERMISSION_SOURCES_SETUP_DELETE]} 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_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_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.source_type', 'source.pk'], 'famfam': 'shape_square_add', '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_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]} 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]}

View File

@@ -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']

View File

@@ -10,6 +10,8 @@ from django.core.exceptions import ValidationError
from django.db import models, transaction from django.db import models, transaction
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from model_utils.managers import InheritanceManager
from acls.utils import apply_default_acls from acls.utils import apply_default_acls
from common.compressed_files import CompressedFile, NotACompressedFile from common.compressed_files import CompressedFile, NotACompressedFile
from converter.api import get_available_transformations_choices from converter.api import get_available_transformations_choices
@@ -31,12 +33,14 @@ from .managers import SourceTransformationManager
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
class BaseModel(models.Model): class Source(models.Model):
title = models.CharField(max_length=64, verbose_name=_(u'Title')) title = models.CharField(max_length=64, verbose_name=_(u'Title'))
enabled = models.BooleanField(default=True, verbose_name=_(u'Enabled')) enabled = models.BooleanField(default=True, verbose_name=_(u'Enabled'))
whitelist = models.TextField(blank=True, verbose_name=_(u'Whitelist'), editable=False) whitelist = models.TextField(blank=True, verbose_name=_(u'Whitelist'), editable=False)
blacklist = models.TextField(blank=True, verbose_name=_(u'Blacklist'), editable=False) blacklist = models.TextField(blank=True, verbose_name=_(u'Blacklist'), editable=False)
objects = InheritanceManager()
@classmethod @classmethod
def class_fullname(cls): def class_fullname(cls):
return unicode(dict(SOURCE_CHOICES).get(cls.source_type)) return unicode(dict(SOURCE_CHOICES).get(cls.source_type))
@@ -136,15 +140,17 @@ class BaseModel(models.Model):
class Meta: class Meta:
ordering = ('title',) ordering = ('title',)
abstract = True verbose_name = _(u'Source')
verbose_name_plural = _(u'Sources')
class InteractiveBaseModel(BaseModel): class InteractiveSource(Source):
class Meta(BaseModel.Meta): class Meta:
abstract = True verbose_name = _(u'Interactive source')
verbose_name_plural = _(u'Interactive sources')
class StagingFolder(InteractiveBaseModel): class StagingFolderSource(InteractiveSource):
is_interactive = True is_interactive = True
source_type = SOURCE_CHOICE_STAGING source_type = SOURCE_CHOICE_STAGING
@@ -172,24 +178,32 @@ class StagingFolder(InteractiveBaseModel):
except OSError as exception: except OSError as exception:
raise Exception(_(u'Unable get list of staging files: %s') % 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 = _(u'Staging folder')
verbose_name_plural = _(u'Staging folders') verbose_name_plural = _(u'Staging folders')
class WebForm(InteractiveBaseModel): class WebFormSource(InteractiveSource):
is_interactive = True is_interactive = True
source_type = SOURCE_CHOICE_WEB_FORM 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.')) 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 # Default path
class Meta(InteractiveBaseModel.Meta): class Meta:
verbose_name = _(u'Web form') verbose_name = _(u'Web form')
verbose_name_plural = _(u'Web forms') 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 is_interactive = False
source_type = SOURCE_CHOICE_WATCH 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.')) 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.')) 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): def execute(self, source_id):
source = WatchFolder.objects.get(pk=source_id) if self.uncompress == SOURCE_UNCOMPRESS_CHOICE_Y:
if source.uncompress == SOURCE_UNCOMPRESS_CHOICE_Y:
expand = True expand = True
else: else:
expand = False expand = False
print 'execute: %s' % self.internal_name() print 'execute: %s' % self.internal_name()
class Meta(BaseModel.Meta): class Meta:
verbose_name = _(u'Watch folder') verbose_name = _(u'Watch folder')
verbose_name_plural = _(u'Watch folders') verbose_name_plural = _(u'Watch folders')
@@ -267,11 +267,3 @@ class SourceTransformation(models.Model):
ordering = ('order',) ordering = ('order',)
verbose_name = _(u'Document source transformation') verbose_name = _(u'Document source transformation')
verbose_name_plural = _(u'Document source transformations') 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')

View File

@@ -5,7 +5,7 @@ import logging
from rest_framework import serializers from rest_framework import serializers
from rest_framework.reverse import reverse from rest_framework.reverse import reverse
from .models import StagingFolder from .models import StagingFolderSource
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -33,7 +33,7 @@ class StagingFolderSerializer(serializers.HyperlinkedModelSerializer):
return [] return []
class Meta: class Meta:
model = StagingFolder model = StagingFolderSource
class StagingSourceFileImageSerializer(serializers.Serializer): class StagingSourceFileImageSerializer(serializers.Serializer):

View File

@@ -11,7 +11,7 @@ from .wizards import DocumentCreateWizard
urlpatterns = patterns('sources.views', urlpatterns = patterns('sources.views',
url(r'^staging_file/(?P<staging_folder_pk>\d+)/(?P<encoded_filename>.+)/delete/$', 'staging_file_delete', name='staging_file_delete'), url(r'^staging_file/(?P<staging_folder_pk>\d+)/(?P<encoded_filename>.+)/delete/$', 'staging_file_delete', name='staging_file_delete'),
url(r'^upload/document/new/interactive/(?P<source_type>\w+)/(?P<source_id>\d+)/$', 'upload_interactive', (), 'upload_interactive'), url(r'^upload/document/new/interactive/(?P<source_id>\d+)/$', 'upload_interactive', (), 'upload_interactive'),
url(r'^upload/document/new/interactive/$', 'upload_interactive', (), 'upload_interactive'), url(r'^upload/document/new/interactive/$', 'upload_interactive', (), 'upload_interactive'),
url(r'^upload/document/(?P<document_pk>\d+)/version/interactive/(?P<source_type>\w+)/(?P<source_id>\d+)/$', 'upload_interactive', (), 'upload_version'), url(r'^upload/document/(?P<document_pk>\d+)/version/interactive/(?P<source_type>\w+)/(?P<source_id>\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/%s/list/$' % SOURCE_CHOICE_WATCH, 'setup_source_list', {'source_type': SOURCE_CHOICE_WATCH}, 'setup_watch_folder_list'),
url(r'^setup/interactive/(?P<source_type>\w+)/list/$', 'setup_source_list', (), 'setup_source_list'), url(r'^setup/interactive/(?P<source_type>\w+)/list/$', 'setup_source_list', (), 'setup_source_list'),
url(r'^setup/interactive/(?P<source_type>\w+)/(?P<source_id>\d+)/edit/$', 'setup_source_edit', (), 'setup_source_edit'), url(r'^setup/interactive/(?P<source_id>\d+)/edit/$', 'setup_source_edit', (), 'setup_source_edit'),
url(r'^setup/interactive/(?P<source_type>\w+)/(?P<source_id>\d+)/delete/$', 'setup_source_delete', (), 'setup_source_delete'), url(r'^setup/interactive/(?P<source_id>\d+)/delete/$', 'setup_source_delete', (), 'setup_source_delete'),
url(r'^setup/interactive/(?P<source_type>\w+)/create/$', 'setup_source_create', (), 'setup_source_create'), url(r'^setup/interactive/(?P<source_type>\w+)/create/$', 'setup_source_create', (), 'setup_source_create'),
url(r'^setup/interactive/(?P<source_type>\w+)/(?P<source_id>\d+)/transformation/list/$', 'setup_source_transformation_list', (), 'setup_source_transformation_list'), url(r'^setup/interactive/(?P<source_id>\d+)/transformation/list/$', 'setup_source_transformation_list', (), 'setup_source_transformation_list'),
url(r'^setup/interactive/(?P<source_type>\w+)/(?P<source_id>\d+)/transformation/create/$', 'setup_source_transformation_create', (), 'setup_source_transformation_create'), url(r'^setup/interactive/(?P<source_id>\d+)/transformation/create/$', 'setup_source_transformation_create', (), 'setup_source_transformation_create'),
url(r'^setup/interactive/source/transformation/(?P<transformation_id>\d+)/edit/$', 'setup_source_transformation_edit', (), 'setup_source_transformation_edit'), url(r'^setup/interactive/source/transformation/(?P<transformation_id>\d+)/edit/$', 'setup_source_transformation_edit', (), 'setup_source_transformation_edit'),
url(r'^setup/interactive/source/transformation/(?P<transformation_id>\d+)/delete/$', 'setup_source_transformation_delete', (), 'setup_source_transformation_delete'), url(r'^setup/interactive/source/transformation/(?P<transformation_id>\d+)/delete/$', 'setup_source_transformation_delete', (), 'setup_source_transformation_delete'),

View File

@@ -4,7 +4,6 @@ from django.conf import settings
from django.contrib import messages from django.contrib import messages
from django.core.exceptions import PermissionDenied from django.core.exceptions import PermissionDenied
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.conf import settings
from django.http import HttpResponseRedirect from django.http import HttpResponseRedirect
from django.shortcuts import render_to_response, get_object_or_404 from django.shortcuts import render_to_response, get_object_or_404
from django.template import RequestContext from django.template import RequestContext
@@ -28,7 +27,8 @@ from .forms import (StagingDocumentForm, StagingFolderSetupForm,
from .literals import (SOURCE_CHOICE_STAGING, SOURCE_CHOICE_WATCH, from .literals import (SOURCE_CHOICE_STAGING, SOURCE_CHOICE_WATCH,
SOURCE_CHOICE_WEB_FORM, SOURCE_UNCOMPRESS_CHOICE_ASK, SOURCE_CHOICE_WEB_FORM, SOURCE_UNCOMPRESS_CHOICE_ASK,
SOURCE_UNCOMPRESS_CHOICE_Y) 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, from .permissions import (PERMISSION_SOURCES_SETUP_CREATE,
PERMISSION_SOURCES_SETUP_DELETE, PERMISSION_SOURCES_SETUP_DELETE,
PERMISSION_SOURCES_SETUP_EDIT, PERMISSION_SOURCES_SETUP_EDIT,
@@ -57,11 +57,11 @@ def return_function(obj):
def get_tab_link_for_source(source, document=None): def get_tab_link_for_source(source, document=None):
if document: if document:
view = u'upload_version' view = u'sources:upload_version'
args = [document.pk, u'"%s"' % source.source_type, source.pk] args = [document.pk, source.pk]
else: else:
view = u'sources:upload_interactive' view = u'sources:upload_interactive'
args = [u'"%s"' % source.source_type, source.pk] args = [source.pk]
return { return {
'text': source.title, 'text': source.title,
@@ -75,11 +75,11 @@ def get_tab_link_for_source(source, document=None):
def get_active_tab_links(document=None): def get_active_tab_links(document=None):
tab_links = [] tab_links = []
web_forms = WebForm.objects.filter(enabled=True) web_forms = WebFormSource.objects.filter(enabled=True)
for web_form in web_forms: for web_form in web_forms:
tab_links.append(get_tab_link_for_source(web_form, document)) 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: for staging_folder in staging_folders:
tab_links.append(get_tab_link_for_source(staging_folder, document)) 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 = [] subtemplates_list = []
if document_pk: if document_pk:
@@ -109,7 +109,7 @@ def upload_interactive(request, source_type=None, source_id=None, document_pk=No
context = {} context = {}
if results[SOURCE_CHOICE_WEB_FORM].count() == 0 and results[SOURCE_CHOICE_STAGING].count() == 0: if results[SOURCE_CHOICE_WEB_FORM].count() == 0 and results[SOURCE_CHOICE_STAGING].count() == 0:
source_setup_link = mark_safe('<a href="%s">%s</a>' % (reverse('setup_web_form_list'), ugettext(u'Here'))) source_setup_link = mark_safe('<a href="%s">%s</a>' % (reverse('sources:setup_web_form_list'), ugettext(u'Here')))
subtemplates_list.append( subtemplates_list.append(
{ {
'name': 'main/generic_subtemplate.html', 'name': 'main/generic_subtemplate.html',
@@ -130,170 +130,115 @@ def upload_interactive(request, source_type=None, source_id=None, document_pk=No
else: else:
document_type = None 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(): 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 source_id = results[SOURCE_CHOICE_WEB_FORM][0].pk
elif results[SOURCE_CHOICE_STAGING].count(): elif results[SOURCE_CHOICE_STAGING].count():
source_type = results[SOURCE_CHOICE_STAGING][0].source_type
source_id = results[SOURCE_CHOICE_STAGING][0].pk source_id = results[SOURCE_CHOICE_STAGING][0].pk
if source_type and source_id: if source_id:
if source_type == SOURCE_CHOICE_WEB_FORM: source = get_object_or_404(Source.objects.select_subclasses(), pk=source_id)
web_form = get_object_or_404(WebForm, pk=source_id) if isinstance(source, WebFormSource):
context['source'] = web_form form_class = WebFormForm
if request.method == 'POST': else:
form = WebFormForm(request.POST, request.FILES, form_class = StagingDocumentForm
document_type=document_type,
show_expand=(web_form.uncompress == SOURCE_UNCOMPRESS_CHOICE_ASK) and not document, context['source'] = source
source=web_form,
instance=document if request.method == 'POST':
) form = form_class(request.POST, request.FILES,
if form.is_valid(): document_type=document_type,
try: show_expand=(source.uncompress == SOURCE_UNCOMPRESS_CHOICE_ASK) and not document,
if document: source=source,
expand = False 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: else:
if web_form.uncompress == SOURCE_UNCOMPRESS_CHOICE_ASK: if source.uncompress == SOURCE_UNCOMPRESS_CHOICE_Y:
expand = form.cleaned_data.get('expand') expand = True
else: else:
if web_form.uncompress == SOURCE_UNCOMPRESS_CHOICE_Y: expand = False
expand = True
else:
expand = False
new_filename = get_form_filename(form) new_filename = get_form_filename(form)
result = web_form.upload_file( if isinstance(source, WebFormSource):
request.FILES['file'], file_object = request.FILES['file']
new_filename, use_file_name=form.cleaned_data.get('use_file_name', False), else:
document_type=document_type, staging_file = source.get_file(encoded_filename=form.cleaned_data['staging_file_id'])
expand=expand, file_object = staging_file.as_file()
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 result['is_compressed'] is True: result = source.upload_file(
messages.success(request, _(u'File uncompressed successfully and uploaded as individual files.')) 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: if isinstance(source, StagingFolderSource):
messages.warning(request, _(u'File was not a compressed file, uploaded as it was.')) if source.delete_after_upload:
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:
staging_file.delete() staging_file.delete()
messages.success(request, _(u'Staging file: %s, deleted successfully.') % staging_file.filename) messages.success(request, _(u'Staging file: %s, deleted successfully.') % staging_file.filename)
if document:
return HttpResponseRedirect(reverse('documents:document_view_simple', args=[document.pk])) if document:
else: messages.success(request, _(u'New document version uploaded successfully.'))
return HttpResponseRedirect(request.get_full_path()) return HttpResponseRedirect(reverse('documents:document_version_list', args=[document.pk]))
except NewDocumentVersionNotAllowed: else:
messages.error(request, _(u'New version uploads are not allowed for this document.')) if result['is_compressed'] is None:
except Exception as exception: messages.success(request, _(u'File uploaded successfully.'))
if settings.DEBUG:
raise if result['is_compressed'] is True:
messages.error(request, _(u'Unhandled exception: %s') % exception) messages.success(request, _(u'File uncompressed successfully and uploaded as individual files.'))
else:
form = StagingDocumentForm(document_type=document_type, if result['is_compressed'] is False:
show_expand=(staging_folder.uncompress == SOURCE_UNCOMPRESS_CHOICE_ASK) and not document, messages.warning(request, _(u'File was not a compressed file, uploaded as it was.'))
source=staging_folder,
instance=document 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: try:
staging_filelist = list(staging_folder.get_files()) staging_filelist = list(source.get_files())
except Exception as exception: except Exception as exception:
messages.error(request, exception) messages.error(request, exception)
staging_filelist = [] staging_filelist = []
finally: 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 = [ subtemplates_list = [
{ {
'name': 'main/generic_form_subtemplate.html', '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): def staging_file_delete(request, staging_folder_pk, encoded_filename):
Permission.objects.check_permissions(request.user, [PERMISSION_DOCUMENT_CREATE, PERMISSION_DOCUMENT_NEW_VERSION]) 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) 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)))) 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]) Permission.objects.check_permissions(request.user, [PERMISSION_SOURCES_SETUP_VIEW])
if source_type == SOURCE_CHOICE_WEB_FORM: if source_type == SOURCE_CHOICE_WEB_FORM:
cls = WebForm cls = WebFormSource
elif source_type == SOURCE_CHOICE_STAGING: elif source_type == SOURCE_CHOICE_STAGING:
cls = StagingFolder cls = StagingFolderSource
elif source_type == SOURCE_CHOICE_WATCH: elif source_type == SOURCE_CHOICE_WATCH:
cls = WatchFolder cls = WatchFolderSource
context = { context = {
'object_list': cls.objects.all(), 'object_list': cls.objects.all(),
@@ -423,20 +368,17 @@ def setup_source_list(request, source_type):
context_instance=RequestContext(request)) 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]) Permission.objects.check_permissions(request.user, [PERMISSION_SOURCES_SETUP_EDIT])
if source_type == SOURCE_CHOICE_WEB_FORM: source = get_object_or_404(Source.objects.select_subclasses(), pk=source_id)
cls = WebForm if isinstance(source, WebFormSource):
form_class = WebFormSetupForm form_class = WebFormSetupForm
elif source_type == SOURCE_CHOICE_STAGING: elif isinstance(source, StagingFolderSource):
cls = StagingFolder
form_class = StagingFolderSetupForm form_class = StagingFolderSetupForm
elif source_type == SOURCE_CHOICE_WATCH: elif isinstance(source, WatchFolderSource):
cls = WatchFolder
form_class = WatchFolderSetupForm 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)))) next = request.POST.get('next', request.GET.get('next', request.META.get('HTTP_REFERER', reverse(settings.LOGIN_REDIRECT_URL))))
if request.method == 'POST': if request.method == 'POST':
@@ -458,31 +400,28 @@ def setup_source_edit(request, source_type, source_id):
'navigation_object_name': 'source', 'navigation_object_name': 'source',
'next': next, 'next': next,
'object_name': _(u'Source'), 'object_name': _(u'Source'),
'source_type': source_type, 'source_type': source.source_type,
}, },
context_instance=RequestContext(request)) 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]) Permission.objects.check_permissions(request.user, [PERMISSION_SOURCES_SETUP_DELETE])
if source_type == SOURCE_CHOICE_WEB_FORM: source = get_object_or_404(Source.objects.select_subclasses(), pk=source_id)
cls = WebForm redirect_view = reverse('sources:setup_source_list', args=[source.source_type])
if isinstance(source, WebFormSource):
form_icon = u'application_form_delete.png' form_icon = u'application_form_delete.png'
redirect_view = 'setup_web_form_list' redirect_view = 'sources:setup_web_form_list'
elif source_type == SOURCE_CHOICE_STAGING: elif isinstance(source, StagingFolderSource):
cls = StagingFolder
form_icon = u'folder_delete.png' form_icon = u'folder_delete.png'
redirect_view = 'setup_staging_folder_list' redirect_view = 'sources:setup_staging_folder_list'
elif source_type == SOURCE_CHOICE_WATCH: elif isinstance(source, WatchFolderSource):
cls = WatchFolder
form_icon = u'folder_delete.png' 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))) 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': if request.method == 'POST':
try: try:
source.delete() source.delete()
@@ -502,7 +441,7 @@ def setup_source_delete(request, source_type, source_id):
'delete_view': True, 'delete_view': True,
'previous': previous, 'previous': previous,
'form_icon': form_icon, 'form_icon': form_icon,
'source_type': source_type, 'source_type': source.source_type,
} }
return render_to_response('main/generic_confirm.html', context, 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]) Permission.objects.check_permissions(request.user, [PERMISSION_SOURCES_SETUP_CREATE])
if source_type == SOURCE_CHOICE_WEB_FORM: if source_type == SOURCE_CHOICE_WEB_FORM:
cls = WebForm cls = WebFormSource
form_class = WebFormSetupForm form_class = WebFormSetupForm
elif source_type == SOURCE_CHOICE_STAGING: elif source_type == SOURCE_CHOICE_STAGING:
cls = StagingFolder cls = WebFormSource
form_class = StagingFolderSetupForm form_class = StagingFolderSetupForm
elif source_type == SOURCE_CHOICE_WATCH: elif source_type == SOURCE_CHOICE_WATCH:
cls = WatchFolder cls = WebFormSource
form_class = WatchFolderSetupForm form_class = WatchFolderSetupForm
if request.method == 'POST': if request.method == 'POST':
@@ -543,17 +482,10 @@ def setup_source_create(request, source_type):
context_instance=RequestContext(request)) 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]) Permission.objects.check_permissions(request.user, [PERMISSION_SOURCES_SETUP_EDIT])
if source_type == SOURCE_CHOICE_WEB_FORM: source = get_object_or_404(Source.objects.select_subclasses(), pk=source_id)
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)
context = { context = {
'object_list': SourceTransformation.transformations.get_for_object(source), '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]) Permission.objects.check_permissions(request.user, [PERMISSION_SOURCES_SETUP_EDIT])
source_transformation = get_object_or_404(SourceTransformation, pk=transformation_id) 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))) next = request.POST.get('next', request.GET.get('next', request.META.get('HTTP_REFERER', redirect_view)))
if request.method == 'POST': 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]) Permission.objects.check_permissions(request.user, [PERMISSION_SOURCES_SETUP_EDIT])
source_transformation = get_object_or_404(SourceTransformation, pk=transformation_id) 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))) previous = request.POST.get('previous', request.GET.get('previous', request.META.get('HTTP_REFERER', redirect_view)))
if request.method == 'POST': if request.method == 'POST':
@@ -642,19 +574,12 @@ def setup_source_transformation_delete(request, transformation_id):
context_instance=RequestContext(request)) 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]) Permission.objects.check_permissions(request.user, [PERMISSION_SOURCES_SETUP_EDIT])
if source_type == SOURCE_CHOICE_WEB_FORM: source = get_object_or_404(Source.objects.select_subclasses(), pk=source_id)
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) redirect_view = reverse('sources:setup_source_transformation_list', args=[source.pk])
redirect_view = reverse('sources:setup_source_transformation_list', args=[source.source_type, source.pk])
if request.method == 'POST': if request.method == 'POST':
form = SourceTransformationForm_create(request.POST) form = SourceTransformationForm_create(request.POST)

View File

@@ -10,6 +10,7 @@ django-pagination==1.0.7
django-compressor==1.4 django-compressor==1.4
django-cors-headers==0.13 django-cors-headers==0.13
django-taggit==0.12 django-taggit==0.12
django-model-utils==2.2
django-mptt==0.6.1 django-mptt==0.6.1
django-rest-swagger==0.1.14 django-rest-swagger==0.1.14
django-sendfile==0.3.6 django-sendfile==0.3.6