diff --git a/mayan/apps/tags/urls.py b/mayan/apps/tags/urls.py index 3969a88eef..b6268cb68e 100644 --- a/mayan/apps/tags/urls.py +++ b/mayan/apps/tags/urls.py @@ -7,8 +7,8 @@ from .api_views import ( APITagListView, APITagView ) from .views import ( - DocumentTagListView, TagAttachActionView, TagCreateView, TagEditView, - TagListView, TagTaggedItemListView, tag_delete, tag_multiple_delete, + DocumentTagListView, TagAttachActionView, TagCreateView, + TagDeleteActionView, TagEditView, TagListView, TagTaggedItemListView, multiple_documents_selection_tag_remove, single_document_multiple_tag_remove ) @@ -16,14 +16,18 @@ from .views import ( urlpatterns = [ url(r'^list/$', TagListView.as_view(), name='tag_list'), url(r'^create/$', TagCreateView.as_view(), name='tag_create'), - url(r'^(?P\d+)/delete/$', tag_delete, name='tag_delete'), + url( + r'^(?P\d+)/delete/$', TagDeleteActionView.as_view(), + name='tag_delete' + ), url(r'^(?P\d+)/edit/$', TagEditView.as_view(), name='tag_edit'), url( r'^(?P\d+)/documents/$', TagTaggedItemListView.as_view(), name='tag_tagged_item_list' ), url( - r'^multiple/delete/$', tag_multiple_delete, name='tag_multiple_delete' + r'^multiple/delete/$', TagDeleteActionView.as_view(), + name='tag_multiple_delete' ), url( diff --git a/mayan/apps/tags/views.py b/mayan/apps/tags/views.py index 2c33aee07d..b4edc31408 100644 --- a/mayan/apps/tags/views.py +++ b/mayan/apps/tags/views.py @@ -12,8 +12,8 @@ from django.utils.translation import ugettext_lazy as _, ungettext from acls.models import AccessControlList from common.views import ( - ActionView, SingleObjectCreateView, SingleObjectEditView, - SingleObjectListView + MultipleObjectFormActionView, MultipleObjectConfirmActionView, + SingleObjectCreateView, SingleObjectEditView, SingleObjectListView ) from documents.models import Document from documents.views import DocumentListView @@ -29,12 +29,14 @@ from .permissions import ( logger = logging.getLogger(__name__) -class TagAttachActionView(ActionView): +class TagAttachActionView(MultipleObjectFormActionView): form_class = TagMultipleSelectionForm model = Document object_permission = permission_tag_attach - success_message = 'Tag attach request performed on %(count)d document' - success_message_plural = 'Tag attach request performed on %(count)d documents' + success_message = _('Tag attach request performed on %(count)d document') + success_message_plural = _( + 'Tag attach request performed on %(count)d documents' + ) def get_extra_context(self): queryset = self.get_queryset() @@ -100,6 +102,66 @@ class TagCreateView(SingleObjectCreateView): view_permission = permission_tag_create +class TagDeleteActionView(MultipleObjectConfirmActionView): + model = Tag + post_action_redirect = reverse_lazy('tags:tag_list') + object_permission = permission_tag_delete + success_message = _('Tag delete request performed on %(count)d tag') + success_message_plural = _( + 'Tag delete request performed on %(count)d tags' + ) + + def get_extra_context(self): + queryset = self.get_queryset() + + result = { + 'message': _('Will be removed from all documents.'), + 'submit_icon': _('fa fa-times'), + 'submit_label': _('Delete'), + 'title': ungettext( + 'Delete the selected tag?', + 'Delete the selected tags?', + queryset.count() + ) + } + + if queryset.count() == 1: + result.update( + { + 'object': queryset.first(), + 'title': _('Delete tag: %s') % queryset.first() + } + ) + + return result + + def object_action(self, instance, form=None): + try: + instance.delete() + messages.success( + self.request, _('Tag "%s" deleted successfully.') % instance + ) + except Exception as exception: + messages.error( + self.request, _('Error deleting tag "%(tag)s": %(error)s') % { + 'tag': instance, 'error': exception + } + ) + + +class TagEditView(SingleObjectEditView): + fields = ('label', 'color') + model = Tag + object_permission = permission_tag_edit + post_action_redirect = reverse_lazy('tags:tag_list') + + def get_extra_context(self): + return { + 'object': self.get_object(), + 'title': _('Edit tag: %s') % self.get_object(), + } + + class TagListView(SingleObjectListView): object_permission = permission_tag_view @@ -117,88 +179,6 @@ class TagListView(SingleObjectListView): return Tag.objects.all() -def tag_delete(request, tag_id=None, tag_id_list=None): - post_action_redirect = None - - if tag_id: - queryset = Tag.objects.filter(pk=tag_id) - post_action_redirect = reverse('tags:tag_list') - elif tag_id_list: - queryset = Tag.objects.filter(pk__in=tag_id_list) - - if not queryset: - messages.error(request, _('Must provide at least one tag.')) - return HttpResponseRedirect( - request.META.get( - 'HTTP_REFERER', reverse(settings.LOGIN_REDIRECT_URL) - ) - ) - - queryset = AccessControlList.objects.filter_by_access( - permission_tag_delete, request.user, queryset=queryset - ) - - previous = request.POST.get('previous', request.GET.get('previous', request.META.get('HTTP_REFERER', reverse(settings.LOGIN_REDIRECT_URL)))) - next = request.POST.get('next', request.GET.get('next', post_action_redirect if post_action_redirect else request.META.get('HTTP_REFERER', reverse(settings.LOGIN_REDIRECT_URL)))) - - if request.method == 'POST': - for tag in queryset: - try: - tag.delete() - messages.success( - request, _('Tag "%s" deleted successfully.') % tag - ) - except Exception as exception: - messages.error( - request, _('Error deleting tag "%(tag)s": %(error)s') % { - 'tag': tag, 'error': exception - } - ) - - return HttpResponseRedirect(next) - - context = { - 'delete_view': True, - 'previous': previous, - 'message': _('Will be removed from all documents.'), - 'next': next, - 'title': ungettext( - 'Delete the selected tag?', - 'Delete the selected tags?', - queryset.count() - ) - } - - if queryset.count() == 1: - context['object'] = queryset.first() - - return render_to_response( - 'appearance/generic_confirm.html', context, - context_instance=RequestContext(request) - ) - - -def tag_multiple_delete(request): - return tag_delete( - request, tag_id_list=request.GET.get( - 'id_list', request.POST.get('id_list', '') - ).split(',') - ) - - -class TagEditView(SingleObjectEditView): - fields = ('label', 'color') - model = Tag - object_permission = permission_tag_edit - post_action_redirect = reverse_lazy('tags:tag_list') - - def get_extra_context(self): - return { - 'object': self.get_object(), - 'title': _('Edit tag: %s') % self.get_object(), - } - - class TagTaggedItemListView(DocumentListView): def get_tag(self): return get_object_or_404(Tag, pk=self.kwargs['pk'])