diff --git a/apps/documents/__init__.py b/apps/documents/__init__.py index 98b5507acd..ace7578129 100644 --- a/apps/documents/__init__.py +++ b/apps/documents/__init__.py @@ -139,7 +139,7 @@ register_links(['document_type_filename_edit', 'document_type_filename_delete'], # Register document links register_links(Document, [document_edit, document_print, document_delete, document_download, document_find_duplicates, document_clear_transformations, document_create_siblings]) -register_multi_item_links(['index_instance_list', 'document_type_document_list', 'search', 'results', 'document_group_view', 'document_list', 'document_list_recent'], [document_multiple_clear_transformations, document_multiple_delete]) +register_multi_item_links(['folder_view', 'index_instance_list', '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/folders/__init__.py b/apps/folders/__init__.py index d37669159b..27842d4ac7 100644 --- a/apps/folders/__init__.py +++ b/apps/folders/__init__.py @@ -3,24 +3,29 @@ from django.utils.translation import ugettext_lazy as _ from navigation.api import register_links, register_top_menu, \ register_multi_item_links, register_sidebar_template from navigation.api import register_sidebar_template +from documents.models import Document from folders.models import Folder folder_list = {'text': _(u'folder list'), 'view': 'folder_list', 'famfam': 'folder_user'} folder_create = {'text': _('create folder'), 'view': 'folder_create', 'famfam': 'folder_add'} -folder_edit = {'text': _('edit'), 'view': 'folder_edit', 'args': 'object.id', 'famfam': 'folder_edit'} -folder_delete = {'text': _('delete'), 'view': 'folder_delete', 'args': 'object.id', 'famfam': 'folder_delete'} -folder_document_multiple_remove = {'text': _('remove'), 'view': 'folder_document_multiple_remove', 'famfam': 'delete'} -folder_view = {'text': _(u'folder documents'), 'view': 'folder_view', 'args': 'object.id', 'famfam': 'folder_go'} +folder_edit = {'text': _('edit'), 'view': 'folder_edit', 'args': 'object.pk', 'famfam': 'folder_edit'} +folder_delete = {'text': _('delete'), 'view': 'folder_delete', 'args': 'object.pk', 'famfam': 'folder_delete'} +folder_document_multiple_remove = {'text': _('remove from folder'), 'view': 'folder_document_multiple_remove', 'args': 'object.pk', 'famfam': 'delete'} +folder_view = {'text': _(u'folder documents'), 'view': 'folder_view', 'args': 'object.pk', 'famfam': 'folder_go'} +folder_add_document = {'text': _('add to folder'), 'view': 'folder_add_document', 'args': 'object.pk', 'famfam': 'add'} +document_folder_list = {'text': _(u'folders'), 'view': 'document_folder_list', 'args': 'object.pk', 'famfam': 'folder_user'} register_multi_item_links(['folder_view'], [folder_document_multiple_remove]) register_links(Folder, [folder_view, folder_edit, folder_delete]) -register_links(['folder_edit', 'folder_delete', 'folder_list', 'folder_create', 'folder_view'], [folder_list, folder_create], menu_name='secondary_menu') +register_links(['folder_edit', 'folder_delete', 'folder_list', 'folder_create', 'folder_view', 'folder_document_multiple_remove'], [folder_list, folder_create], menu_name='secondary_menu') register_top_menu(name='folders', link={'text': _('folders'), 'famfam': 'folder_user', 'view': 'folder_list'}, children_path_regex=[r'^folders/']) -register_sidebar_template(['document_view_advanced', 'document_view_simple'], 'folders_sidebar_template.html') +register_links(Document, [document_folder_list], menu_name='form_header') register_sidebar_template(['folder_list'], 'folders_help.html') + +register_links(['document_folder_list', 'folder_add_document'], [folder_add_document], menu_name="sidebar") diff --git a/apps/folders/templatetags/folder_tags.py b/apps/folders/templatetags/folder_tags.py index 99d7c60b3e..ea97f9a403 100644 --- a/apps/folders/templatetags/folder_tags.py +++ b/apps/folders/templatetags/folder_tags.py @@ -13,7 +13,7 @@ def get_add_document_to_folder_form(context): context.update({ 'form': AddDocumentForm(user=context['request'].user), 'request': context['request'], - 'form_action': reverse('folder_add_document', args=[context['object'].pk]), + 'form_action': reverse('folder_add_document_sidebar', args=[context['object'].pk]), 'title': _('Add document to a folder') }) return context diff --git a/apps/folders/urls.py b/apps/folders/urls.py index c0012b59a1..26710ae0c5 100644 --- a/apps/folders/urls.py +++ b/apps/folders/urls.py @@ -7,7 +7,9 @@ urlpatterns = patterns('folders.views', url(r'^(?P\d+)/edit/$', 'folder_edit', (), 'folder_edit'), url(r'^(?P\d+)/delete/$', 'folder_delete', (), 'folder_delete'), url(r'^(?P\d+)/$', 'folder_view', (), 'folder_view'), - url(r'^document/multiple/remove/$', 'folder_document_multiple_remove', (), 'folder_document_multiple_remove'), + url(r'^(?P\d+)/remove/document/multiple/$', 'folder_document_multiple_remove', (), 'folder_document_multiple_remove'), - url(r'^add_document/(?P\d+)/$', 'folder_add_document', (), 'folder_add_document'), + url(r'^document/(?P\d+)/folder/add/sidebar/$', 'folder_add_document_sidebar', (), 'folder_add_document_sidebar'), + url(r'^document/(?P\d+)/folder/add/$', 'folder_add_document', (), 'folder_add_document'), + url(r'^document/(?P\d+)/folder/list/$', 'document_folder_list', (), 'document_folder_list'), ) diff --git a/apps/folders/views.py b/apps/folders/views.py index 824c57bd05..a307ae155c 100644 --- a/apps/folders/views.py +++ b/apps/folders/views.py @@ -16,22 +16,25 @@ from folders.models import Folder, FolderDocument from folders.forms import FolderForm, AddDocumentForm -def folder_list(request): +def folder_list(request, queryset=None, extra_context=None): + context = { + 'title': _(u'folders'), + 'multi_select_as_buttons': True, + 'extra_columns': [ + {'name': _(u'created'), 'attribute': 'datetime_created'}, + {'name': _(u'documents'), 'attribute': lambda x: x.folderdocument_set.count()} + ] + } + if extra_context: + context.update(extra_context) + return object_list( request, - queryset=Folder.objects.filter(user=request.user), + queryset=queryset if not (queryset is None) else Folder.objects.filter(user=request.user), template_name='generic_list.html', - extra_context={ - 'title': _(u'folders'), - 'multi_select_as_buttons': True, - 'extra_columns': [ - {'name': _(u'created'), 'attribute': 'datetime_created'}, - {'name': _(u'documents'), 'attribute': lambda x: x.folderdocument_set.count()} - ] - }, + extra_context=context, ) - def folder_create(request): if request.method == 'POST': form = FolderForm(request.POST) @@ -122,17 +125,8 @@ def folder_view(request, folder_id): raise PermissionDenied return render_to_response('generic_list.html', { - 'object_list': folder.folderdocument_set.all(), - 'extra_columns': [ - {'name': _(u'document'), 'attribute': - lambda x: document_link(x.document) - }, - {'name': _(u'thumbnail'), 'attribute': - lambda x: document_thumbnail(x.document) - }, - ], - 'hide_link': True, - 'hide_object': True, + 'object_list': [fd.document for fd in folder.folderdocument_set.all()], + 'hide_links': True, 'title': _(u'documents in folder: %s') % folder, 'multi_select_as_buttons': True, 'object': folder, @@ -140,12 +134,13 @@ def folder_view(request, folder_id): }, context_instance=RequestContext(request)) -def folder_add_document(request, document_id): +def folder_add_document_sidebar(request, document_id): check_permissions(request.user, [PERMISSION_DOCUMENT_VIEW]) document = get_object_or_404(Document, pk=document_id) + previous = request.META.get('HTTP_REFERER', '/') + if request.method == 'POST': - previous = request.META.get('HTTP_REFERER', '/') form = AddDocumentForm(request.POST, user=request.user) if form.is_valid(): if form.cleaned_data['existing_folder']: @@ -172,13 +167,73 @@ def folder_add_document(request, document_id): return HttpResponseRedirect(previous) -def folder_document_remove(request, folder_document_id=None, folder_document_id_list=None): +def folder_add_document(request, document_id): + # TODO: merge with folder_add_document_sidebar + check_permissions(request.user, [PERMISSION_DOCUMENT_VIEW]) + document = get_object_or_404(Document, pk=document_id) + + next = request.POST.get('next', request.GET.get('next', request.META.get('HTTP_REFERER', '/')))#reverse('document_tags', args=[document.pk])))) + + if request.method == 'POST': + form = AddDocumentForm(request.POST, user=request.user) + if form.is_valid(): + if form.cleaned_data['existing_folder']: + folder = form.cleaned_data['existing_folder'] + elif form.cleaned_data['title']: + folder, created = Folder.objects.get_or_create(user=request.user, title=form.cleaned_data['title']) + if created: + messages.success(request, _(u'Folder "%s" created successfully') % form.cleaned_data['title']) + else: + messages.error(request, _(u'A folder named: %s, already exists.') % form.cleaned_data['title']) + return HttpResponseRedirect(next) + else: + messages.error(request, _(u'Must specify a new folder or an existing one.')) + return HttpResponseRedirect(next) + + folder_document, created = FolderDocument.objects.get_or_create(folder=folder, document=document) + if created: + messages.success(request, _(u'Document: %(document)s added to folder: %(folder)s successfully.') % { + 'document': document, 'folder': folder}) + else: + messages.warning(request, _(u'Document: %(document)s is already in folder: %(folder)s.') % { + 'document': document, 'folder': folder}) + + return HttpResponseRedirect(next) + else: + form = AddDocumentForm(user=request.user) + + return render_to_response('generic_form.html', { + 'title': _(u'add document "%s" to a folder') % document, + 'form': form, + 'object': document, + 'next': next, + }, + context_instance=RequestContext(request)) + + +def document_folder_list(request, document_id): + check_permissions(request.user, [PERMISSION_DOCUMENT_VIEW]) + document = get_object_or_404(Document, pk=document_id) + + return folder_list( + request, + queryset=Folder.objects.filter(user=request.user).filter(folderdocument__document=document), + extra_context={ + 'title': _(u'folders containing: %s') % document, + 'object': document, + } + ) + + +def folder_document_remove(request, folder_id, document_id=None, document_id_list=None): post_action_redirect = None - if folder_document_id: - folder_documents = [get_object_or_404(FolderDocument, pk=folder_document_id)] - elif folder_document_id_list: - folder_documents = [get_object_or_404(FolderDocument, pk=folder_document_id) for folder_document_id in folder_document_id_list.split(',')] + folder = get_object_or_404(Folder, pk=folder_id) + + if document_id: + folder_documents = [get_object_or_404(FolderDocument, folder__pk=folder_id, document__pk=document_id)] + elif document_id_list: + folder_documents = [get_object_or_404(FolderDocument, folder__pk=folder_id, document__pk=document_id) for document_id in document_id_list.split(',')] else: messages.error(request, _(u'Must provide at least one folder document.')) return HttpResponseRedirect(request.META.get('HTTP_REFERER', '/')) @@ -201,10 +256,11 @@ def folder_document_remove(request, folder_document_id=None, folder_document_id_ 'object_name': _(u'folder document'), 'previous': previous, 'next': next, - 'form_icon': u'folder_page.png', + 'form_icon': u'delete.png', + 'object': folder } if len(folder_documents) == 1: - context['object'] = folder_documents[0] + #context['object'] = folder_documents[0] context['title'] = _(u'Are you sure you wish to remove the document: %(document)s from the folder "%(folder)s"?') % { 'document': ', '.join([unicode(d) for d in folder_documents]), 'folder': folder_documents[0].folder} elif len(folder_documents) > 1: @@ -215,5 +271,5 @@ def folder_document_remove(request, folder_document_id=None, folder_document_id_ context_instance=RequestContext(request)) -def folder_document_multiple_remove(request): - return folder_document_remove(request, folder_document_id_list=request.GET.get('id_list', [])) +def folder_document_multiple_remove(request, folder_id): + return folder_document_remove(request, folder_id, document_id_list=request.GET.get('id_list', [])) diff --git a/apps/metadata/__init__.py b/apps/metadata/__init__.py index 3c3ecad36b..e4d602bd90 100644 --- a/apps/metadata/__init__.py +++ b/apps/metadata/__init__.py @@ -62,7 +62,7 @@ setup_document_type_metadata = {'text': _(u'default metadata'), 'view': 'setup_d #register_links(Document, [metadata_add, metadata_edit, metadata_remove]) register_links(['metadata_add', 'metadata_edit', 'metadata_remove', 'metadata_view'], [metadata_add, metadata_edit, metadata_remove], menu_name='sidebar') register_links(Document, [metadata_view], menu_name='form_header')#, metadata_edit, metadata_remove]) -register_multi_item_links(['index_instance_list', 'document_type_document_list', 'search', 'results', 'document_group_view', 'document_list', 'document_list_recent'], [metadata_multiple_add, metadata_multiple_edit, metadata_multiple_remove]) +register_multi_item_links(['folder_view', 'index_instance_list', 'document_type_document_list', 'search', 'results', 'document_group_view', 'document_list', 'document_list_recent'], [metadata_multiple_add, metadata_multiple_edit, metadata_multiple_remove]) register_links(MetadataType, [setup_metadata_type_edit, setup_metadata_type_delete]) register_links(['setup_metadata_type_delete', 'setup_metadata_type_edit', 'setup_metadata_type_list', 'setup_metadata_type_create'], [setup_metadata_type_create], menu_name='sidebar')