From 0b4df317260e1d489255dafb18f264c15759eb9c Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Wed, 6 Jul 2011 16:38:15 -0400 Subject: [PATCH] Finished document source setup views --- apps/main/__init__.py | 6 +- apps/sources/__init__.py | 25 +++++++ apps/sources/forms.py | 12 ++++ apps/sources/models.py | 8 +-- apps/sources/urls.py | 15 +++++ apps/sources/views.py | 136 ++++++++++++++++++++++++++++++++++++++- 6 files changed, 195 insertions(+), 7 deletions(-) diff --git a/apps/main/__init__.py b/apps/main/__init__.py index c25a86ec9e..7f9364129a 100644 --- a/apps/main/__init__.py +++ b/apps/main/__init__.py @@ -9,6 +9,7 @@ from converter import formats_list from documents import document_type_views from metadata import setup_metadata_type_list, metadata_type_setup_views from metadata import setup_metadata_set_list, metadata_set_setup_views +from sources import source_list, source_views from main.conf.settings import SIDE_BAR_SEARCH from main.conf.settings import DISABLE_HOME_VIEW @@ -45,18 +46,19 @@ if not SIDE_BAR_SEARCH: register_top_menu('tools', link=tools_menu, children_views=['statistics', 'history_list', 'formats_list']) #register_top_menu('setup_menu', link={'text': _(u'setup'), 'view': 'setting_list', 'famfam': 'cog'}, children=setup_views) -register_top_menu('setup_menu', link={'text': _(u'setup'), 'view': 'setting_list', 'famfam': 'cog'}, children_path_regex=[r'^settings/', r'^user_management/', r'^permissions', r'^documents/type', r'^metadata/setup']) +register_top_menu('setup_menu', link={'text': _(u'setup'), 'view': 'setting_list', 'famfam': 'cog'}, children_path_regex=[r'^settings/', r'^user_management/', r'^permissions', r'^documents/type', r'^metadata/setup', r'sources/setup']) register_top_menu('about', link={'text': _(u'about'), 'view': 'about', 'famfam': 'information'}) register_links(['tools_menu', 'statistics', 'history_list', 'history_view', 'formats_list'], [tools_menu, statistics, history_list, formats_list, sentry], menu_name='secondary_menu') -setup_links = [check_settings, role_list, user_list, group_list, document_types, setup_metadata_type_list, setup_metadata_set_list, admin_site] +setup_links = [check_settings, role_list, user_list, group_list, document_types, setup_metadata_type_list, setup_metadata_set_list, source_list, admin_site] register_links(['setting_list'], setup_links, menu_name='secondary_menu') register_links(permission_views, setup_links, menu_name='secondary_menu') register_links(user_management_views, setup_links, menu_name='secondary_menu') register_links(document_type_views, setup_links, menu_name='secondary_menu') register_links(metadata_type_setup_views, setup_links, menu_name='secondary_menu') register_links(metadata_set_setup_views, setup_links, menu_name='secondary_menu') +register_links(source_views, setup_links, menu_name='secondary_menu') def get_version(): diff --git a/apps/sources/__init__.py b/apps/sources/__init__.py index 78690ed3b9..000e52a0ec 100644 --- a/apps/sources/__init__.py +++ b/apps/sources/__init__.py @@ -5,8 +5,33 @@ from navigation.api import register_links, \ register_sidebar_template from sources.staging import StagingFile +from sources.models import WebForm, StagingFolder staging_file_preview = {'text': _(u'preview'), 'class': 'fancybox-noscaling', 'view': 'staging_file_preview', 'args': ['source.source_type', 'source.pk', 'object.id'], 'famfam': 'zoom'} staging_file_delete = {'text': _(u'delete'), 'view': 'staging_file_delete', 'args': ['source.source_type', 'source.pk', 'object.id'], 'famfam': 'delete'} +setup_web_form_list = {'text': _(u'web forms'), 'view': 'setup_web_form_list', 'famfam': 'application_form'} +setup_web_form_edit = {'text': _(u'edit'), 'view': 'setup_web_form_edit', 'args': 'object.pk', 'famfam': 'application_form_edit'} +setup_web_form_delete = {'text': _(u'delete'), 'view': 'setup_web_form_delete', 'args': 'object.pk', 'famfam': 'application_form_delete'} +setup_web_form_create = {'text': _(u'add new'), 'view': 'setup_web_form_create', 'famfam': 'application_form_add'} + +setup_staging_folder_list = {'text': _(u'staging folders'), 'view': 'setup_staging_folder_list', 'famfam': 'folder_magnify'} +setup_staging_folder_edit = {'text': _(u'edit'), 'view': 'setup_staging_folder_edit', 'args': 'object.pk', 'famfam': 'folder_edit'} +setup_staging_folder_delete = {'text': _(u'delete'), 'view': 'setup_staging_folder_delete', 'args': 'object.pk', 'famfam': 'folder_delete'} +setup_staging_folder_create = {'text': _(u'add new'), 'view': 'setup_staging_folder_create', 'famfam': 'folder_add'} + +source_list = {'text': _(u'Document sources'), 'view': 'setup_web_form_list', 'famfam': 'page_add'} + register_links(StagingFile, [staging_file_preview, staging_file_delete]) + +register_links(['setup_web_form_list', 'setup_web_form_create', 'setup_staging_folder_list', 'setup_staging_folder_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_web_form_edit, setup_web_form_delete]) +register_links(['setup_web_form_list', 'setup_web_form_edit', 'setup_web_form_delete', 'setup_web_form_create'], [setup_web_form_create], menu_name='sidebar') + +register_links(StagingFolder, [setup_web_form_list, setup_staging_folder_list], menu_name='form_header') +register_links(StagingFolder, [setup_staging_folder_edit, setup_staging_folder_delete]) +register_links(['setup_staging_folder_list', 'setup_staging_folder_edit', 'setup_staging_folder_delete', 'setup_staging_folder_create'], [setup_staging_folder_create], menu_name='sidebar') + +source_views = ['setup_web_form_list', 'setup_web_form_edit', 'setup_web_form_delete', 'setup_web_form_create', 'setup_staging_folder_list', 'setup_staging_folder_edit', 'setup_staging_folder_delete', 'setup_staging_folder_create'] diff --git a/apps/sources/forms.py b/apps/sources/forms.py index f239d4eaf9..b759c3259d 100644 --- a/apps/sources/forms.py +++ b/apps/sources/forms.py @@ -4,6 +4,8 @@ from django.utils.translation import ugettext from documents.forms import DocumentForm +from sources.models import WebForm, StagingFolder + class StagingDocumentForm(DocumentForm): """ @@ -48,3 +50,13 @@ class WebFormForm(DocumentForm): label=_(u'Expand compressed files'), required=False, help_text=ugettext(u'Upload a compressed file\'s contained files as individual documents') ) + + +class WebFormSetupForm(forms.ModelForm): + class Meta: + model = WebForm + + +class StagingFolderSetupForm(forms.ModelForm): + class Meta: + model = StagingFolder diff --git a/apps/sources/models.py b/apps/sources/models.py index e36c9e40e8..666ea7cc30 100644 --- a/apps/sources/models.py +++ b/apps/sources/models.py @@ -57,7 +57,7 @@ class BaseModel(models.Model): document_type = models.ForeignKey(DocumentType, blank=True, null=True, verbose_name=_(u'document type')) def __unicode__(self): - return u'%s (%s)' % (self.title, dict(SOURCE_CHOICES).get(self.source_type)) + return u'%s' % self.title class Meta: ordering = ('title',) @@ -72,7 +72,7 @@ class InteractiveBaseModel(BaseModel): self.icon = self.default_icon super(BaseModel, self).save(*args, **kwargs) - class Meta: + class Meta(BaseModel.Meta): abstract = True @@ -95,7 +95,7 @@ class StagingFolder(InteractiveBaseModel): return u'x'.join(dimensions) - class Meta: + class Meta(InteractiveBaseModel.Meta): verbose_name = _(u'staging folder') verbose_name_plural = _(u'staging folder') @@ -121,6 +121,6 @@ class WebForm(InteractiveBaseModel): uncompress = models.CharField(max_length=1, choices=SOURCE_INTERACTIVE_UNCOMPRESS_CHOICES, verbose_name=_(u'uncompress')) #Default path - class Meta: + class Meta(InteractiveBaseModel.Meta): verbose_name = _(u'web form') verbose_name_plural = _(u'web forms') diff --git a/apps/sources/urls.py b/apps/sources/urls.py index b3d6bd6fb4..c4f2fcd0d7 100644 --- a/apps/sources/urls.py +++ b/apps/sources/urls.py @@ -1,9 +1,24 @@ from django.conf.urls.defaults import patterns, url +from sources.models import SOURCE_CHOICE_WEB_FORM, SOURCE_CHOICE_STAGING + urlpatterns = patterns('sources.views', url(r'^staging_file/type/(?P\w+)/(?P\d+)/(?P\w+)/preview/$', 'staging_file_preview', (), 'staging_file_preview'), url(r'^staging_file/type/(?P\w+)/(?P\d+)/(?P\w+)/delete/$', 'staging_file_delete', (), 'staging_file_delete'), url(r'^upload/interactive/(?P\w+)/(?P\d+)/$', 'upload_interactive', (), 'upload_interactive'), url(r'^upload/interactive/$', 'upload_interactive', (), 'upload_interactive'), + + #Setup views + + url(r'^setup/interactive/webforms/list/$', 'setup_source_list', {'source_type': SOURCE_CHOICE_WEB_FORM}, 'setup_web_form_list'), + 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/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'), + url(r'^setup/interactive/staging_folder/(?P\w+)/delete/$', 'setup_source_delete', {'source_type': SOURCE_CHOICE_STAGING}, 'setup_staging_folder_delete'), + url(r'^setup/interactive/staging_folder/create/$', 'setup_source_create', {'source_type': SOURCE_CHOICE_STAGING}, 'setup_staging_folder_create'), + ) diff --git a/apps/sources/views.py b/apps/sources/views.py index 2449928c3a..90468349cf 100644 --- a/apps/sources/views.py +++ b/apps/sources/views.py @@ -29,6 +29,8 @@ from sources.models import SOURCE_UNCOMPRESS_CHOICE_Y, \ SOURCE_UNCOMPRESS_CHOICE_ASK from sources.staging import create_staging_file_class from sources.forms import StagingDocumentForm, WebFormForm +from sources.forms import WebFormSetupForm, StagingFolderSetupForm + def return_function(obj): return lambda context: context['source'].source_type == obj.source_type and context['source'].pk == obj.pk @@ -72,7 +74,7 @@ def upload_interactive(request, source_type=None, source_id=None): 'context': { 'title': _(u'Upload sources'), 'paragraphs': [ - _(u'Not document sources have been defined or there are no sources enabled.') + _(u'No interactive document sources have been defined or none have been enabled.') # TODO: Add link to setup ], } @@ -309,3 +311,135 @@ def staging_file_delete(request, source_type, source_id, staging_file_id): 'previous': previous, 'form_icon': u'delete.png', }, context_instance=RequestContext(request)) + + +def setup_source_list(request, source_type): + #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') + + context = { + 'object_list': cls.objects.all(), + 'title': title, + #'multi_select_as_buttons': True, + #'hide_links': True, + } + + return render_to_response('generic_list.html', context, + context_instance=RequestContext(request)) + + +def setup_source_edit(request, source_type, source_id): + #check_permissions(request.user, [PERMISSION_SOURCES_SETUP_EDIT]) + + if source_type == SOURCE_CHOICE_WEB_FORM: + cls = WebForm + form_class = WebFormSetupForm + title = _(u'edit web form source: %s') + elif source_type == SOURCE_CHOICE_STAGING: + cls = StagingFolder + form_class = StagingFolderSetupForm + title = _(u'edit staging folder source: %s') + + source = get_object_or_404(cls, pk=source_id) + next = request.POST.get('next', request.GET.get('next', request.META.get('HTTP_REFERER', '/'))) + + if request.method == 'POST': + form = form_class(instance=source, data=request.POST) + if form.is_valid(): + try: + form.save() + messages.success(request, _(u'Source edited successfully')) + return HttpResponseRedirect(next) + except Exception, e: + messages.error(request, _(u'Error editing source; %s') % e) + else: + form = form_class(instance=source) + + return render_to_response('generic_form.html', { + 'title': title % source, + 'form': form, + 'object': source, + 'next': next, + 'object_name': _(u'source'), + }, + context_instance=RequestContext(request)) + + +def setup_source_delete(request, source_type, source_id): + #check_permissions(request.user, [PERMISSION_SOURCES_SETUP_DELETE]) + if source_type == SOURCE_CHOICE_WEB_FORM: + cls = WebForm + title = _(u'Are you sure you wish to delete the web form source: %s?') + form_icon = u'application_form_delete.png' + redirect_view = 'setup_web_form_list' + elif source_type == SOURCE_CHOICE_STAGING: + cls = StagingFolder + title = _(u'Are you sure you wish to delete the staging folder source: %s?') + form_icon = u'folder_delete.png' + redirect_view = 'setup_staging_folder_list' + + source = get_object_or_404(cls, pk=source_id) + + if request.method == 'POST': + try: + source.delete() + messages.success(request, _(u'Source "%s" deleted successfully.') % source) + except Exception, e: + messages.error(request, _(u'Error deleting source "%(source)s": %(error)s') % { + 'source': source, 'error': e + }) + + return HttpResponseRedirect(reverse(redirect_view)) + + context = { + 'title': title % source, + 'object': source, + 'object_name': _(u'source'), + 'delete_view': True, + 'previous': next, + 'next': next, + 'form_icon': form_icon, + } + + return render_to_response('generic_confirm.html', context, + context_instance=RequestContext(request)) + + +def setup_source_create(request, source_type): + #check_permissions(request.user, [PERMISSION_SOURCES_SETUP_EDIT]) + + if source_type == SOURCE_CHOICE_WEB_FORM: + #cls = WebForm + form_class = WebFormSetupForm + title = _(u'Creating web form source') + elif source_type == SOURCE_CHOICE_STAGING: + #cls = StagingFolder + form_class = StagingFolderSetupForm + title = _(u'Creating staging folder source') + + #source = get_object_or_404(cls, pk=source_id) + + if request.method == 'POST': + form = form_class(data=request.POST) + if form.is_valid(): + try: + form.save() + messages.success(request, _(u'Source created successfully')) + return HttpResponseRedirect(reverse('setup_web_form_list')) + except Exception, e: + messages.error(request, _(u'Error creating source; %s') % e) + else: + form = form_class() + + return render_to_response('generic_form.html', { + 'title': title, + 'form': form, + #'object_name': _(u'source'), + }, + context_instance=RequestContext(request))