diff --git a/apps/documents/__init__.py b/apps/documents/__init__.py index 44b5272b64..c5a1ac5eec 100644 --- a/apps/documents/__init__.py +++ b/apps/documents/__init__.py @@ -9,7 +9,8 @@ from permissions.api import register_permission, set_namespace_title from tags.widgets import get_tags_inline_widget_simple from history.api import register_history_type -from documents.models import Document, DocumentPage, DocumentPageTransformation +from documents.models import Document, DocumentPage, \ + DocumentPageTransformation, DocumentType from documents.staging import StagingFile from documents.conf.settings import USE_STAGING_DIRECTORY from documents.conf.settings import PER_USER_STAGING_DIRECTORY @@ -18,6 +19,8 @@ from documents.literals import PERMISSION_DOCUMENT_CREATE, \ PERMISSION_DOCUMENT_DELETE, PERMISSION_DOCUMENT_DOWNLOAD, \ PERMISSION_DOCUMENT_TRANSFORM, PERMISSION_DOCUMENT_TOOLS, \ PERMISSION_DOCUMENT_EDIT +from documents.literals import PERMISSION_DOCUMENT_TYPE_EDIT, \ + PERMISSION_DOCUMENT_TYPE_DELETE, PERMISSION_DOCUMENT_TYPE_CREATE from documents.literals import HISTORY_DOCUMENT_CREATED, \ HISTORY_DOCUMENT_EDITED, HISTORY_DOCUMENT_DELETED @@ -32,6 +35,11 @@ register_permission(PERMISSION_DOCUMENT_DOWNLOAD) register_permission(PERMISSION_DOCUMENT_TRANSFORM) register_permission(PERMISSION_DOCUMENT_TOOLS) +# Document type permissions +register_permission(PERMISSION_DOCUMENT_TYPE_EDIT) +register_permission(PERMISSION_DOCUMENT_TYPE_DELETE) +register_permission(PERMISSION_DOCUMENT_TYPE_CREATE) + # History setup register_history_type(HISTORY_DOCUMENT_CREATED) register_history_type(HISTORY_DOCUMENT_EDITED) @@ -84,10 +92,21 @@ upload_document_from_user_staging = {'text': _(u'user staging'), 'view': 'upload staging_file_preview = {'text': _(u'preview'), 'class': 'fancybox-noscaling', 'view': 'staging_file_preview', 'args': ['source', 'object.id'], 'famfam': 'drive_magnify'} staging_file_delete = {'text': _(u'delete'), 'view': 'staging_file_delete', 'args': ['source', 'object.id'], 'famfam': 'drive_delete'} +# Document type related links +document_type_list = {'text': _(u'document type list'), 'view': 'document_type_list', 'famfam': 'layout', 'permissions': [PERMISSION_DOCUMENT_VIEW]} +document_type_document_list = {'text': _(u'document list for type'), 'view': 'document_type_document_list', 'args': 'object.id', 'famfam': 'page_go', 'permissions': [PERMISSION_DOCUMENT_VIEW]} +document_type_edit = {'text': _(u'edit'), 'view': 'document_type_edit', 'args': 'object.id', 'famfam': 'layout_edit', 'permissions': [PERMISSION_DOCUMENT_TYPE_EDIT]} +document_type_delete = {'text': _(u'delete'), 'view': 'document_type_delete', 'args': 'object.id', 'famfam': 'layout_delete', 'permissions': [PERMISSION_DOCUMENT_TYPE_DELETE]} +document_type_create = {'text': _(u'Create document type'), 'view': 'document_type_create', 'famfam': 'layout_add', 'permissions': [PERMISSION_DOCUMENT_TYPE_CREATE]} + +# Register links +register_links(DocumentType, [document_type_document_list, document_type_edit, document_type_delete]) +register_links(['document_type_list', 'document_type_document_list', 'document_type_edit', 'document_type_delete'], [document_type_list, document_type_create], menu_name='sidebar') + register_links(Document, [document_view_simple, document_view_advanced, document_edit, document_print, document_delete, document_download, document_find_duplicates, document_clear_transformations, document_history_view]) register_links(Document, [document_create_siblings], menu_name='sidebar') -register_multi_item_links(['search', 'results', 'document_group_view', 'document_list', 'document_list_recent'], [document_multiple_clear_transformations, document_multiple_delete]) +register_multi_item_links(['document_type_document_list', 'search', 'results', 'document_group_view', 'document_list', 'document_list_recent'], [document_multiple_clear_transformations, document_multiple_delete]) register_links(['document_list_recent', 'document_list', 'document_create', 'document_create_multiple', 'upload_document', 'upload_document_from_local', 'upload_document_from_staging', 'upload_document_from_user_staging', 'document_find_duplicates'], [document_list_recent, document_list, document_create_multiple], menu_name='secondary_menu') diff --git a/apps/documents/forms.py b/apps/documents/forms.py index 1a1cc918ff..839e669fb3 100644 --- a/apps/documents/forms.py +++ b/apps/documents/forms.py @@ -271,3 +271,11 @@ class StagingDocumentForm(DocumentForm): class Meta(DocumentForm.Meta): exclude = ('description', 'file', 'document_type', 'tags') + + +class DocumentTypeForm(forms.ModelForm): + """ + Model class form to create or edit a document type + """ + class Meta: + model = DocumentType diff --git a/apps/documents/literals.py b/apps/documents/literals.py index 82d1fc08a8..aff31396f3 100644 --- a/apps/documents/literals.py +++ b/apps/documents/literals.py @@ -5,15 +5,19 @@ PICTURE_ERROR_MEDIUM = u'1297211435_error.png' PICTURE_UNKNOWN_SMALL = u'1299549572_unknown2.png' PICTURE_UNKNOWN_MEDIUM = u'1299549805_unknown.png' -PERMISSION_DOCUMENT_CREATE = {'namespace': 'documents', 'name': 'document_create', 'label': _(u'Create document')} +PERMISSION_DOCUMENT_CREATE = {'namespace': 'documents', 'name': 'document_create', 'label': _(u'Create documents')} PERMISSION_DOCUMENT_PROPERTIES_EDIT = {'namespace': 'documents', 'name': 'document_properties_edit', 'label': _(u'Edit document properties')} -PERMISSION_DOCUMENT_EDIT = {'namespace': 'documents', 'name': 'document_edit', 'label': _(u'Edit document')} -PERMISSION_DOCUMENT_VIEW = {'namespace': 'documents', 'name': 'document_view', 'label': _(u'View document')} -PERMISSION_DOCUMENT_DELETE = {'namespace': 'documents', 'name': 'document_delete', 'label': _(u'Delete document')} -PERMISSION_DOCUMENT_DOWNLOAD = {'namespace': 'documents', 'name': 'document_download', 'label': _(u'Download document')} -PERMISSION_DOCUMENT_TRANSFORM = {'namespace': 'documents', 'name': 'document_transform', 'label': _(u'Transform document')} +PERMISSION_DOCUMENT_EDIT = {'namespace': 'documents', 'name': 'document_edit', 'label': _(u'Edit documents')} +PERMISSION_DOCUMENT_VIEW = {'namespace': 'documents', 'name': 'document_view', 'label': _(u'View documents')} +PERMISSION_DOCUMENT_DELETE = {'namespace': 'documents', 'name': 'document_delete', 'label': _(u'Delete documents')} +PERMISSION_DOCUMENT_DOWNLOAD = {'namespace': 'documents', 'name': 'document_download', 'label': _(u'Download documents')} +PERMISSION_DOCUMENT_TRANSFORM = {'namespace': 'documents', 'name': 'document_transform', 'label': _(u'Transform documents')} PERMISSION_DOCUMENT_TOOLS = {'namespace': 'documents', 'name': 'document_tools', 'label': _(u'Execute document modifying tools')} +PERMISSION_DOCUMENT_TYPE_EDIT = {'namespace': 'documents', 'name': 'document_type_edit', 'label': _(u'Edit document types')} +PERMISSION_DOCUMENT_TYPE_DELETE = {'namespace': 'documents', 'name': 'document_type_delete', 'label': _(u'Delete document types')} +PERMISSION_DOCUMENT_TYPE_CREATE = {'namespace': 'documents', 'name': 'document_type_create', 'label': _(u'Create document types')} + UPLOAD_SOURCE_LOCAL = u'local' UPLOAD_SOURCE_STAGING = u'staging' UPLOAD_SOURCE_USER_STAGING = u'user_staging' diff --git a/apps/documents/urls.py b/apps/documents/urls.py index 967d767d7c..67acf95654 100644 --- a/apps/documents/urls.py +++ b/apps/documents/urls.py @@ -63,4 +63,11 @@ urlpatterns = patterns('documents.views', url(r'^page/transformation/(?P\d+)/delete/$', 'document_page_transformation_delete', (), 'document_page_transformation_delete'), url(r'^missing/list/$', 'document_missing_list', (), 'document_missing_list'), + + # Admin views + url(r'^type/list/$', 'document_type_list', (), 'document_type_list'), + url(r'^type/create/$', 'document_type_create', (), 'document_type_create'), + url(r'^type/(?P\d+)/list/documents/$', 'document_type_document_list', (), 'document_type_document_list'), + url(r'^type/(?P\d+)/edit/$', 'document_type_edit', (), 'document_type_edit'), + url(r'^type/(?P\d+)/delete/$', 'document_type_delete', (), 'document_type_delete'), ) diff --git a/apps/documents/views.py b/apps/documents/views.py index f3c4e13741..54c4d093ae 100644 --- a/apps/documents/views.py +++ b/apps/documents/views.py @@ -67,7 +67,7 @@ from documents.forms import DocumentTypeSelectForm, \ StagingDocumentForm, DocumentPreviewForm, \ DocumentPageForm, DocumentPageTransformationForm, \ DocumentContentForm, DocumentPageForm_edit, \ - DocumentPageForm_text, PrintForm + DocumentPageForm_text, PrintForm, DocumentTypeForm from documents.wizards import DocumentCreateWizard from documents.models import Document, DocumentType, DocumentPage, \ DocumentPageTransformation, RecentDocument @@ -76,6 +76,10 @@ from documents.literals import PICTURE_ERROR_SMALL, PICTURE_ERROR_MEDIUM, \ PICTURE_UNKNOWN_SMALL, PICTURE_UNKNOWN_MEDIUM from documents.literals import UPLOAD_SOURCE_LOCAL, \ UPLOAD_SOURCE_STAGING, UPLOAD_SOURCE_USER_STAGING + +# Document type permissions +from documents.literals import PERMISSION_DOCUMENT_TYPE_EDIT, \ + PERMISSION_DOCUMENT_TYPE_DELETE, PERMISSION_DOCUMENT_TYPE_CREATE def document_list(request, object_list=None, title=None, extra_context=None): @@ -1046,6 +1050,7 @@ def document_hard_copy(request, document_id): page_width = request.GET.get('page_width', dict(PAGE_SIZE_DIMENSIONS)[DEFAULT_PAPER_SIZE][0]) page_height = request.GET.get('page_height', dict(PAGE_SIZE_DIMENSIONS)[DEFAULT_PAPER_SIZE][1]) + # TODO: Replace with regex to extact numeric portion width = float(page_width.split('i')[0].split('c')[0].split('m')[0]) height = float(page_height.split('i')[0].split('c')[0].split('m')[0]) @@ -1068,3 +1073,113 @@ def document_hard_copy(request, document_id): 'page_height': page_height, 'pages': pages, }, context_instance=RequestContext(request)) + + +def document_type_list(request): + check_permissions(request.user, [PERMISSION_DOCUMENT_VIEW]) + + context = { + 'object_list': DocumentType.objects.all(), + 'title': _(u'document types'), + } + + return render_to_response('generic_list.html', context, + context_instance=RequestContext(request)) + + +def document_type_document_list(request, document_type_id): + check_permissions(request.user, [PERMISSION_DOCUMENT_VIEW]) + + document_type = get_object_or_404(DocumentType, pk=document_type_id) + + return document_list( + request, + object_list=Document.objects.filter(document_type=document_type), + title=_(u'documents of type "%s"') % document_type, + extra_context={ + 'object': document_type, + } + ) + + +def document_type_edit(request, document_type_id): + check_permissions(request.user, [PERMISSION_DOCUMENT_TYPE_EDIT]) + document_type = get_object_or_404(DocumentType, pk=document_type_id) + + if request.method == 'POST': + form = DocumentTypeForm(instance=document_type, data=request.POST) + if form.is_valid(): + try: + form.save() + messages.success(request, _(u'Document type edited successfully')) + return HttpResponseRedirect(reverse('document_type_list')) + except Exception, e: + messages.error(request, _(u'Error editing document type; %s') % e) + else: + form = DocumentTypeForm(instance=document_type) + + return render_to_response('generic_form.html', { + 'title': _(u'edit document type: %s') % document_type, + 'form': form, + 'object': document_type, + 'object_name': _(u'document type'), + }, + context_instance=RequestContext(request)) + + +def document_type_delete(request, document_type_id): + check_permissions(request.user, [PERMISSION_DOCUMENT_TYPE_DELETE]) + document_type = get_object_or_404(DocumentType, pk=document_type_id) + + post_action_redirect = reverse('document_type_list') + + previous = request.POST.get('previous', request.GET.get('previous', request.META.get('HTTP_REFERER', '/'))) + next = request.POST.get('next', request.GET.get('next', post_action_redirect if post_action_redirect else request.META.get('HTTP_REFERER', '/'))) + + if request.method == 'POST': + try: + Document.objects.filter(document_type=document_type).update(document_type=None) + document_type.delete() + messages.success(request, _(u'Document type: %s deleted successfully.') % document_type) + except Exception, e: + messages.error(request, _(u'Document type: %(document_type)s delete error: %(error)s') % { + 'document_type': document_type, 'error': e}) + + return HttpResponseRedirect(next) + + context = { + 'object_name': _(u'document tyep'), + 'delete_view': True, + 'previous': previous, + 'next': next, + 'object': document_type, + 'title': _(u'Are you sure you with to delete the document type: %s?') % document_type, + 'message': _(u'The document type of all documents using this document type will be set to none.'), + 'form_icon': u'layout_delete.png', + } + + return render_to_response('generic_confirm.html', context, + context_instance=RequestContext(request)) + + +def document_type_create(request): + check_permissions(request.user, [PERMISSION_DOCUMENT_TYPE_CREATE]) + + if request.method == 'POST': + form = DocumentTypeForm(request.POST) + if form.is_valid(): + try: + form.save() + messages.success(request, _(u'Document type created successfully')) + return HttpResponseRedirect(reverse('document_type_list')) + except Exception, e: + messages.error(request, _(u'Error creating document type; %(error)s') % { + 'error': e}) + else: + form = DocumentTypeForm() + + return render_to_response('generic_form.html', { + 'title': _(u'create document type'), + 'form': form, + }, + context_instance=RequestContext(request)) diff --git a/apps/main/__init__.py b/apps/main/__init__.py index be21f2749e..d4eb65f28f 100644 --- a/apps/main/__init__.py +++ b/apps/main/__init__.py @@ -5,6 +5,7 @@ from permissions import role_list, permission_views from user_management import user_list, group_list, user_management_views from navigation.api import register_links from history import history_list +#from documents import document_type_list from main.conf.settings import SIDE_BAR_SEARCH @@ -18,7 +19,7 @@ diagnostics = {'text': _(u'diagnostics'), 'view': 'diagnostics', 'famfam': 'pill tools_menu = {'text': _(u'tools'), 'view': 'tools_menu', 'famfam': 'wrench'} admin_site = {'text': _(u'admin site'), 'url': '/admin', 'famfam': 'keyboard', 'condition': is_superuser} sentry = {'text': _(u'sentry'), 'url': '/sentry', 'famfam': 'bug', 'condition': is_superuser} - +document_types = {'text': _(u'document types'), 'view': 'document_type_list', 'famfam': 'layout'} __version_info__ = { 'major': 0, @@ -38,12 +39,12 @@ if not SIDE_BAR_SEARCH: register_top_menu('search', link={'text': _(u'search'), 'view': 'search', 'famfam': 'zoom'}) register_top_menu('tools', link=tools_menu, children_views=['statistics', 'history_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']) +register_top_menu('setup_menu', link={'text': _(u'setup'), 'view': 'setting_list', 'famfam': 'cog'}, children_path_regex=[r'^settings/', r'^user_management/', r'^permissions']) register_top_menu('about', link={'text': _(u'about'), 'view': 'about', 'famfam': 'information'}) register_links(['tools_menu', 'statistics', 'history_list', 'history_view'], [tools_menu, statistics, history_list, sentry], menu_name='secondary_menu') -tool_links = [check_settings, role_list, user_list, group_list, admin_site] +tool_links = [check_settings, role_list, user_list, group_list, document_types, admin_site] register_links(['setting_list'], tool_links, menu_name='secondary_menu') register_links(permission_views, tool_links, menu_name='secondary_menu') register_links(user_management_views, tool_links, menu_name='secondary_menu') diff --git a/apps/metadata/__init__.py b/apps/metadata/__init__.py index 7bd58da432..79fac43a65 100644 --- a/apps/metadata/__init__.py +++ b/apps/metadata/__init__.py @@ -21,4 +21,4 @@ metadata_remove = {'text': _(u'remove metadata'), 'view': 'metadata_remove', 'ar metadata_multiple_remove = {'text': _(u'remove metadata'), 'view': 'metadata_multiple_remove', 'famfam': 'xhtml_delete', 'permissions': [PERMISSION_METADATA_DOCUMENT_REMOVE]} register_links(Document, [metadata_add, metadata_edit, metadata_remove]) -register_multi_item_links(['search', 'results', 'document_group_view', 'document_list', 'document_list_recent'], [metadata_multiple_add, metadata_multiple_edit, metadata_multiple_remove]) +register_multi_item_links(['document_type_document_list', 'search', 'results', 'document_group_view', 'document_list', 'document_list_recent'], [metadata_multiple_add, metadata_multiple_edit, metadata_multiple_remove]) diff --git a/site_media/images/icons/layout_delete.png b/site_media/images/icons/layout_delete.png new file mode 100644 index 0000000000..aea1fd9af3 Binary files /dev/null and b/site_media/images/icons/layout_delete.png differ