diff --git a/apps/documents/conf/settings.py b/apps/documents/conf/settings.py index 6a4907d985..7a253f52de 100644 --- a/apps/documents/conf/settings.py +++ b/apps/documents/conf/settings.py @@ -33,7 +33,6 @@ register_settings( {'name': u'STORAGE_BACKEND', 'global_name': u'DOCUMENTS_STORAGE_BACKEND', 'default': FileBasedStorage}, # Transformations {'name': u'AVAILABLE_TRANSFORMATIONS', 'global_name': u'DOCUMENTS_AVAILABLE_TRANSFORMATIONS', 'default': available_transformations}, - {'name': u'DEFAULT_TRANSFORMATIONS', 'global_name': u'DOCUMENTS_DEFAULT_TRANSFORMATIONS', 'default': []}, # Usage {'name': u'PREVIEW_SIZE', 'global_name': u'DOCUMENTS_PREVIEW_SIZE', 'default': u'640x480'}, {'name': u'PRINT_SIZE', 'global_name': u'DOCUMENTS_PRINT_SIZE', 'default': u'1400'}, diff --git a/apps/documents/models.py b/apps/documents/models.py index 39306893c0..96d988bfdb 100644 --- a/apps/documents/models.py +++ b/apps/documents/models.py @@ -18,7 +18,6 @@ from documents.conf.settings import CHECKSUM_FUNCTION from documents.conf.settings import UUID_FUNCTION from documents.conf.settings import STORAGE_BACKEND from documents.conf.settings import AVAILABLE_TRANSFORMATIONS -from documents.conf.settings import DEFAULT_TRANSFORMATIONS from documents.managers import RecentDocumentManager available_transformations = ([(name, data['label']) for name, data in AVAILABLE_TRANSFORMATIONS.items()]) diff --git a/apps/sources/admin.py b/apps/sources/admin.py index 3cbf7078fb..e0522e62ab 100644 --- a/apps/sources/admin.py +++ b/apps/sources/admin.py @@ -1,6 +1,8 @@ from django.contrib import admin -from sources.models import StagingFolder, WebForm +from sources.models import StagingFolder, WebForm, SourceTransformation + admin.site.register(StagingFolder) admin.site.register(WebForm) +admin.site.register(SourceTransformation) diff --git a/apps/sources/forms.py b/apps/sources/forms.py index f12ef25c96..6da2d7853f 100644 --- a/apps/sources/forms.py +++ b/apps/sources/forms.py @@ -4,7 +4,7 @@ from django.utils.translation import ugettext from documents.forms import DocumentForm -from sources.models import WebForm, StagingFolder +from sources.models import WebForm, StagingFolder, SourceTransformation from sources.widgets import FamFamRadioSelect from sources.utils import validate_whitelist_blacklist @@ -85,3 +85,12 @@ class StagingFolderSetupForm(forms.ModelForm): class Meta: model = StagingFolder + + +class SourceTransformationForm(forms.ModelForm): + class Meta: + model = SourceTransformation + + #def __init__(self, *args, **kwargs): + # super(SourceTransformationForm, self).__init__(*args, **kwargs) + # self.fields['document_page'].widget = forms.HiddenInput() diff --git a/apps/sources/managers.py b/apps/sources/managers.py new file mode 100644 index 0000000000..aee45cf4c1 --- /dev/null +++ b/apps/sources/managers.py @@ -0,0 +1,8 @@ +from django.db import models +from django.contrib.contenttypes.models import ContentType + + +class SourceTransformationManager(models.Manager): + def get_for_object(self, obj): + ct = ContentType.objects.get_for_model(obj) + return self.model.objects.filter(content_type=ct).filter(object_id=obj.pk) diff --git a/apps/sources/models.py b/apps/sources/models.py index f36692d9ec..82598a290b 100644 --- a/apps/sources/models.py +++ b/apps/sources/models.py @@ -1,9 +1,16 @@ from django.db import models from django.utils.translation import ugettext_lazy as _ +from django.contrib.contenttypes.models import ContentType +from django.contrib.contenttypes import generic from documents.models import DocumentType +from documents.conf.settings import AVAILABLE_TRANSFORMATIONS +from documents.managers import RecentDocumentManager from metadata.models import MetadataType +from sources.managers import SourceTransformationManager + +available_transformations = ([(name, data['label']) for name, data in AVAILABLE_TRANSFORMATIONS.items()]) SOURCE_UNCOMPRESS_CHOICE_Y = 'y' SOURCE_UNCOMPRESS_CHOICE_N = 'n' @@ -103,19 +110,21 @@ class StagingFolder(InteractiveBaseModel): verbose_name = _(u'staging folder') verbose_name_plural = _(u'staging folder') +''' +class SourceMetadata(models.Model): + content_type = models.ForeignKey(ContentType) + object_id = models.PositiveIntegerField() + content_object = generic.GenericForeignKey('content_type', 'object_id') + metadata_type = models.ForeignKey(MetadataType, verbose_name=_(u'metadata type')) + value = models.CharField(max_length=256, blank=True, verbose_name=_(u'value')) -#class StagingFolderMetadataValue(models.Model): -# source = models.ForeignKey(BaseModel, verbose_name=_(u'document source')) -# metadata_type = models.ForeignKey(MetadataType, verbose_name=_(u'metadata type')) -# value = models.CharField(max_length=256, blank=True, verbose_name=_(u'value')) -# -# def __unicode__(self): -# return self.source -# -# class Meta: -# verbose_name = _(u'source metadata') -# verbose_name_plural = _(u'sources metadata') + def __unicode__(self): + return self.source + class Meta: + verbose_name = _(u'source metadata') + verbose_name_plural = _(u'sources metadata') +''' class WebForm(InteractiveBaseModel): is_interactive = True @@ -128,3 +137,27 @@ class WebForm(InteractiveBaseModel): class Meta(InteractiveBaseModel.Meta): verbose_name = _(u'web form') verbose_name_plural = _(u'web forms') + + +class SourceTransformation(models.Model): + """ + Model that stores the transformation and transformation arguments + for a given document source + """ + content_type = models.ForeignKey(ContentType) + object_id = models.PositiveIntegerField() + content_object = generic.GenericForeignKey('content_type', 'object_id') + order = models.PositiveIntegerField(default=0, blank=True, null=True, verbose_name=_(u'order'), db_index=True) + transformation = models.CharField(choices=available_transformations, max_length=128, verbose_name=_(u'transformation')) + arguments = models.TextField(blank=True, null=True, verbose_name=_(u'arguments'), help_text=_(u'Use dictionaries to indentify arguments, example: {\'degrees\':90}')) + + objects = SourceTransformationManager() + + def __unicode__(self): + #return u'"%s" for %s' % (self.get_transformation_display(), unicode(self.content_object)) + return self.get_transformation_display() + + class Meta: + ordering = ('order',) + verbose_name = _(u'document source transformation') + verbose_name_plural = _(u'document source transformations') diff --git a/apps/sources/urls.py b/apps/sources/urls.py index c4f2fcd0d7..f8a9794684 100644 --- a/apps/sources/urls.py +++ b/apps/sources/urls.py @@ -15,6 +15,7 @@ urlpatterns = patterns('sources.views', url(r'^setup/interactive/webforms/(?P\w+)/edit/$', 'setup_source_edit', {'source_type': SOURCE_CHOICE_WEB_FORM}, 'setup_web_form_edit'), url(r'^setup/interactive/webforms/(?P\w+)/delete/$', 'setup_source_delete', {'source_type': SOURCE_CHOICE_WEB_FORM}, 'setup_web_form_delete'), url(r'^setup/interactive/webforms/create/$', 'setup_source_create', {'source_type': SOURCE_CHOICE_WEB_FORM}, 'setup_web_form_create'), + url(r'^setup/interactive/webforms/(?P\w+)/transformation/list/$', 'setup_source_transformation_list', {'source_type': SOURCE_CHOICE_WEB_FORM}, 'setup_web_form_transformation_list'), url(r'^setup/interactive/staging_folder/list/$', 'setup_source_list', {'source_type': SOURCE_CHOICE_STAGING}, 'setup_staging_folder_list'), url(r'^setup/interactive/staging_folder/(?P\w+)/edit/$', 'setup_source_edit', {'source_type': SOURCE_CHOICE_STAGING}, 'setup_staging_folder_edit'), diff --git a/apps/sources/views.py b/apps/sources/views.py index accd288c7e..a2cf68b0d6 100644 --- a/apps/sources/views.py +++ b/apps/sources/views.py @@ -23,13 +23,14 @@ from metadata.api import save_metadata_list, \ from permissions.api import check_permissions import sendfile -from sources.models import WebForm, StagingFolder +from sources.models import WebForm, StagingFolder, SourceTransformation from sources.models import SOURCE_CHOICE_WEB_FORM, SOURCE_CHOICE_STAGING from sources.models import SOURCE_UNCOMPRESS_CHOICE_Y, \ SOURCE_UNCOMPRESS_CHOICE_ASK from sources.staging import create_staging_file_class, StagingFile from sources.forms import StagingDocumentForm, WebFormForm from sources.forms import WebFormSetupForm, StagingFolderSetupForm +from sources.forms import SourceTransformationForm def return_function(obj): @@ -461,3 +462,98 @@ def setup_source_create(request, source_type): #'object_name': _(u'source'), }, context_instance=RequestContext(request)) + + +def setup_source_transformation_list(request, source_type, source_id): + #check_permissions(request.user, [PERMISSION_SOURCES_SETUP_VIEW]) + + if source_type == SOURCE_CHOICE_WEB_FORM: + cls = WebForm + #title = _(u'web form sources') + elif source_type == SOURCE_CHOICE_STAGING: + cls = StagingFolder + #title = _(u'staging folder sources') + + source = get_object_or_404(cls, pk=source_id) + + context = { + 'object_list': SourceTransformation.objects.get_for_object(source), + 'title': _(u'default transformations for: %s') % source, + 'object': source, + 'extra_columns': [ + {'name': _(u'order'), 'attribute': 'order'}, + {'name': _(u'transformation'), 'attribute': lambda x: x.get_transformation_display()}, + {'name': _(u'arguments'), 'attribute': 'arguments'} + ], + 'hide_link': True, + 'hide_object': True, + } + + return render_to_response('generic_list.html', context, + context_instance=RequestContext(request)) + + +def setup_source_transformation_edit(request, source_transformation_id): + #check_permissions(request.user, [PERMISSION_DOCUMENT_TRANSFORM]) + + source_transformation = get_object_or_404(SourceTransformation, pk=source_transformation_id) + return update_object(request, template_name='generic_form.html', + form_class=DocumentPageTransformationForm, + object_id=document_page_transformation_id, + post_save_redirect=reverse('document_page_view', args=[document_page_transformation.document_page_id]), + extra_context={ + 'object_name': _(u'transformation'), + 'title': _(u'Edit transformation "%(transformation)s" for: %(document_page)s') % { + 'transformation': document_page_transformation.get_transformation_display(), + 'document_page': document_page_transformation.document_page}, + 'web_theme_hide_menus': True, + } + ) +''' +def document_page_transformation_create(request, document_page_id): + check_permissions(request.user, [PERMISSION_DOCUMENT_TRANSFORM]) + + document_page = get_object_or_404(DocumentPage, pk=document_page_id) + + if request.method == 'POST': + form = DocumentPageTransformationForm(request.POST, initial={'document_page': document_page}) + if form.is_valid(): + form.save() + return HttpResponseRedirect(reverse('document_page_view', args=[document_page_id])) + else: + form = DocumentPageTransformationForm(initial={'document_page': document_page}) + + return render_to_response('generic_form.html', { + 'form': form, + 'object': document_page, + 'title': _(u'Create new transformation for page: %(page)s of document: %(document)s') % { + 'page': document_page.page_number, 'document': document_page.document}, + 'web_theme_hide_menus': True, + }, context_instance=RequestContext(request)) + + + + + +def document_page_transformation_delete(request, document_page_transformation_id): + check_permissions(request.user, [PERMISSION_DOCUMENT_TRANSFORM]) + + previous = request.POST.get('previous', request.GET.get('previous', request.META.get('HTTP_REFERER', None))) + + document_page_transformation = get_object_or_404(DocumentPageTransformation, pk=document_page_transformation_id) + + return delete_object(request, model=DocumentPageTransformation, object_id=document_page_transformation_id, + template_name='generic_confirm.html', + post_delete_redirect=reverse('document_page_view', args=[document_page_transformation.document_page_id]), + extra_context={ + 'delete_view': True, + 'object': document_page_transformation, + 'object_name': _(u'document transformation'), + 'title': _(u'Are you sure you wish to delete transformation "%(transformation)s" for: %(document_page)s') % { + 'transformation': document_page_transformation.get_transformation_display(), + 'document_page': document_page_transformation.document_page}, + 'previous': previous, + 'web_theme_hide_menus': True, + 'form_icon': u'pencil_delete.png', + }) +'''