diff --git a/src/documents/actions.py b/src/documents/actions.py index 9ad691ca2..abc397214 100644 --- a/src/documents/actions.py +++ b/src/documents/actions.py @@ -8,7 +8,7 @@ from documents.classifier import DocumentClassifier from documents.models import Tag, Correspondent, DocumentType -def add_tag_to_selected(modeladmin, request, queryset): +def select_action(modeladmin, request, queryset, title, action, modelclass, message_type='add', document_action=None, queryset_action=None): opts = modeladmin.model._meta app_label = opts.app_label @@ -17,21 +17,32 @@ def add_tag_to_selected(modeladmin, request, queryset): if request.POST.get('post'): n = queryset.count() - tag = Tag.objects.get(id=request.POST.get('tag_id')) + selected_object = modelclass.objects.get(id=request.POST.get('obj_id')) if n: - for obj in queryset: - obj.tags.add(tag) - obj_display = str(obj) - modeladmin.log_change(request, obj, obj_display) - modeladmin.message_user(request, "Successfully added tag %(tag)s to %(count)d %(items)s." % { - "tag": tag.name, "count": n, "items": model_ngettext(modeladmin.opts, n) + for document in queryset: + if document_action: + document_action(document, selected_object) + document_display = str(document) + modeladmin.log_change(request, document, document_display) + if queryset_action: + queryset_action(queryset, selected_object) + + if message_type == 'add': + message = "Successfully added %(model_name)s %(tag)s to %(count)d %(items)s." + elif message_type == 'remove': + message = "Successfully removed %(model_name)s %(tag)s from %(count)d %(items)s." + elif message_type == 'set': + message = "Successfully set %(model_name)s %(tag)s on %(count)d %(items)s." + else: + raise ValueError("Unknown message type") + + modeladmin.message_user(request, message % { + "model_name": model_ngettext(modelclass, 1), "tag": selected_object.name, "count": n, "items": model_ngettext(modeladmin.opts, n) }, messages.SUCCESS) # Return None to display the change list page again. return None - title = "Add tag to multiple documents" - context = dict( modeladmin.admin_site.each_context(request), title=title, @@ -39,213 +50,97 @@ def add_tag_to_selected(modeladmin, request, queryset): opts=opts, action_checkbox_name=helpers.ACTION_CHECKBOX_NAME, media=modeladmin.media, - action="add_tag_to_selected", - tags=Tag.objects.all() + action=action, + objects=modelclass.objects.all(), + itemname=model_ngettext(modelclass,1) ) request.current_app = modeladmin.admin_site.name return TemplateResponse(request, - "admin/%s/%s/mass_modify_tag.html" % (app_label, opts.model_name) + "admin/%s/%s/select_object.html" % (app_label, opts.model_name) , context) +def simple_action(modeladmin, request, queryset, document_action=None, queryset_action=None): + if not modeladmin.has_change_permission(request): + raise PermissionDenied + + n = queryset.count() + if n: + for document in queryset: + if document_action: + document_action(document) + document_display = str(document) + modeladmin.log_change(request, document, document_display) + if queryset_action: + queryset_action(queryset) + modeladmin.message_user(request, "Successfully edited %(count)d %(items)s." % { + "count": n, "items": model_ngettext(modeladmin.opts, n) + }, messages.SUCCESS) + + return None + + +def add_tag_to_selected(modeladmin, request, queryset): + return select_action(modeladmin=modeladmin, request=request, queryset=queryset, + title="Add tag to multiple documents", + action="add_tag_to_selected", + modelclass=Tag, + message_type='add', + document_action=lambda doc, tag: doc.tags.add(tag)) add_tag_to_selected.short_description = "Add tag to selected documents" def remove_tag_from_selected(modeladmin, request, queryset): - opts = modeladmin.model._meta - app_label = opts.app_label - - if not modeladmin.has_change_permission(request): - raise PermissionDenied - - if request.POST.get('post'): - n = queryset.count() - tag = Tag.objects.get(id=request.POST.get('tag_id')) - if n: - for obj in queryset: - obj.tags.remove(tag) - obj_display = str(obj) - modeladmin.log_change(request, obj, obj_display) - modeladmin.message_user(request, "Successfully removed tag %(tag)s from %(count)d %(items)s." % { - "tag": tag.name, "count": n, "items": model_ngettext(modeladmin.opts, n) - }, messages.SUCCESS) - - # Return None to display the change list page again. - return None - - title = "Remove tag from multiple documents" - - context = dict( - modeladmin.admin_site.each_context(request), - title=title, - queryset=queryset, - opts=opts, - action_checkbox_name=helpers.ACTION_CHECKBOX_NAME, - media=modeladmin.media, - action="remove_tag_from_selected", - tags=Tag.objects.all() - ) - - request.current_app = modeladmin.admin_site.name - - return TemplateResponse(request, - "admin/%s/%s/mass_modify_tag.html" % (app_label, opts.model_name) - , context) - - + return select_action(modeladmin=modeladmin, request=request, queryset=queryset, + title="Remove tag from multiple documents", + action="remove_tag_from_selected", + modelclass=Tag, + message_type='remove', + document_action=lambda doc, tag: doc.tags.remove(tag)) remove_tag_from_selected.short_description = "Remove tag from selected documents" def set_correspondent_on_selected(modeladmin, request, queryset): - opts = modeladmin.model._meta - app_label = opts.app_label - - if not modeladmin.has_change_permission(request): - raise PermissionDenied - - if request.POST.get('post'): - n = queryset.count() - correspondent = Correspondent.objects.get(id=request.POST.get('correspondent_id')) - if n: - for obj in queryset: - obj_display = str(obj) - modeladmin.log_change(request, obj, obj_display) - queryset.update(correspondent=correspondent) - modeladmin.message_user(request, "Successfully set correspondent %(correspondent)s on %(count)d %(items)s." % { - "correspondent": correspondent.name, "count": n, "items": model_ngettext(modeladmin.opts, n) - }, messages.SUCCESS) - - # Return None to display the change list page again. - return None - - title = "Set correspondent on multiple documents" - - context = dict( - modeladmin.admin_site.each_context(request), - title=title, - queryset=queryset, - opts=opts, - action_checkbox_name=helpers.ACTION_CHECKBOX_NAME, - media=modeladmin.media, - correspondents=Correspondent.objects.all() - ) - - request.current_app = modeladmin.admin_site.name - - return TemplateResponse(request, - "admin/%s/%s/set_correspondent.html" % (app_label, opts.model_name) - , context) - - + return select_action(modeladmin=modeladmin, request=request, queryset=queryset, + title="Set correspondent on multiple documents", + action="set_correspondent_on_selected", + modelclass=Correspondent, + message_type='set', + queryset_action=lambda queryset, correspondent: queryset.update(correspondent=correspondent)) set_correspondent_on_selected.short_description = "Set correspondent on selected documents" def remove_correspondent_from_selected(modeladmin, request, queryset): - if not modeladmin.has_change_permission(request): - raise PermissionDenied - - n = queryset.count() - if n: - for obj in queryset: - obj_display = str(obj) - modeladmin.log_change(request, obj, obj_display) - queryset.update(correspondent=None) - modeladmin.message_user(request, "Successfully removed correspondent from %(count)d %(items)s." % { - "count": n, "items": model_ngettext(modeladmin.opts, n) - }, messages.SUCCESS) - - return None - - + return simple_action(modeladmin=modeladmin, request=request, queryset=queryset, + queryset_action=lambda qs: qs.update(correspondent=None)) remove_correspondent_from_selected.short_description = "Remove correspondent from selected documents" def set_document_type_on_selected(modeladmin, request, queryset): - opts = modeladmin.model._meta - app_label = opts.app_label - - if not modeladmin.has_change_permission(request): - raise PermissionDenied - - if request.POST.get('post'): - n = queryset.count() - document_type = DocumentType.objects.get(id=request.POST.get('document_type_id')) - if n: - for obj in queryset: - obj_display = str(obj) - modeladmin.log_change(request, obj, obj_display) - queryset.update(document_type=document_type) - modeladmin.message_user(request, "Successfully set document type %(document_type)s on %(count)d %(items)s." % { - "document_type": document_type.name, "count": n, "items": model_ngettext(modeladmin.opts, n) - }, messages.SUCCESS) - - # Return None to display the change list page again. - return None - - title = "Set document type on multiple documents" - - context = dict( - modeladmin.admin_site.each_context(request), - title=title, - queryset=queryset, - opts=opts, - action_checkbox_name=helpers.ACTION_CHECKBOX_NAME, - media=modeladmin.media, - document_types=DocumentType.objects.all() - ) - - request.current_app = modeladmin.admin_site.name - - return TemplateResponse(request, - "admin/%s/%s/set_document_type.html" % (app_label, opts.model_name) - , context) - - + return select_action(modeladmin=modeladmin, request=request, queryset=queryset, + title="Set document type on multiple documents", + action="set_document_type_on_selected", + modelclass=DocumentType, + message_type='set', + queryset_action=lambda queryset, document_type: queryset.update(document_type=document_type)) set_document_type_on_selected.short_description = "Set document type on selected documents" def remove_document_type_from_selected(modeladmin, request, queryset): - if not modeladmin.has_change_permission(request): - raise PermissionDenied - - n = queryset.count() - if n: - for obj in queryset: - obj_display = str(obj) - modeladmin.log_change(request, obj, obj_display) - queryset.update(document_type=None) - modeladmin.message_user(request, "Successfully removed document type from %(count)d %(items)s." % { - "count": n, "items": model_ngettext(modeladmin.opts, n) - }, messages.SUCCESS) - - return None - - + return simple_action(modeladmin=modeladmin, request=request, queryset=queryset, + queryset_action=lambda qs: qs.update(document_type=None)) remove_document_type_from_selected.short_description = "Remove document type from selected documents" def run_document_classifier_on_selected(modeladmin, request, queryset): - if not modeladmin.has_change_permission(request): - raise PermissionDenied - try: clf = DocumentClassifier.load_classifier() except FileNotFoundError: modeladmin.message_user(request, "Classifier model file not found.", messages.ERROR) return None - n = queryset.count() - if n: - for obj in queryset: - clf.classify_document(obj, classify_correspondent=True, classify_tags=True, classify_document_type=True, replace_tags=True) - modeladmin.log_change(request, obj, str(obj)) - modeladmin.message_user(request, "Successfully applied tags, correspondent and document type to %(count)d %(items)s." % { - "count": n, "items": model_ngettext(modeladmin.opts, n) - }, messages.SUCCESS) - - return None - - + return simple_action(modeladmin=modeladmin, request=request, queryset=queryset, + document_action=lambda doc: clf.classify_document(doc, classify_correspondent=True, classify_tags=True, classify_document_type=True)) run_document_classifier_on_selected.short_description = "Run document classifier on selected" diff --git a/src/documents/templates/admin/documents/document/mass_modify_tag.html b/src/documents/templates/admin/documents/document/select_object.html old mode 100755 new mode 100644 similarity index 88% rename from src/documents/templates/admin/documents/document/mass_modify_tag.html rename to src/documents/templates/admin/documents/document/select_object.html index 71ef09ae8..249814d28 --- a/src/documents/templates/admin/documents/document/mass_modify_tag.html +++ b/src/documents/templates/admin/documents/document/select_object.html @@ -21,16 +21,16 @@ {% endblock %} {% block content %} -

Please select the tag.

+

Please select the {{itemname}}.

{% csrf_token %}
{% for obj in queryset %} {% endfor %}

- + {% for obj in objects %} + {% endfor %}

diff --git a/src/documents/templates/admin/documents/document/set_correspondent.html b/src/documents/templates/admin/documents/document/set_correspondent.html deleted file mode 100755 index 22993421e..000000000 --- a/src/documents/templates/admin/documents/document/set_correspondent.html +++ /dev/null @@ -1,46 +0,0 @@ -{% extends "admin/base_site.html" %} -{% load i18n l10n admin_urls static %} -{% load staticfiles %} - -{% block extrahead %} -{{ block.super }} -{{ media }} - - -{% endblock %} - -{% block bodyclass %}{{ block.super }} app-{{ opts.app_label }} model-{{ opts.model_name }} delete-confirmation delete-selected-confirmation{% endblock %} - -{% block breadcrumbs %} - -{% endblock %} - -{% block content %} -

Please select the correspondent.

-{% csrf_token %} -
- {% for obj in queryset %} - - {% endfor %} -

- -

- - - -

- - {% trans "Go back" %} -

-
- -{% endblock %} \ No newline at end of file diff --git a/src/documents/templates/admin/documents/document/set_document_type.html b/src/documents/templates/admin/documents/document/set_document_type.html deleted file mode 100755 index 0419e0ebb..000000000 --- a/src/documents/templates/admin/documents/document/set_document_type.html +++ /dev/null @@ -1,46 +0,0 @@ -{% extends "admin/base_site.html" %} -{% load i18n l10n admin_urls static %} -{% load staticfiles %} - -{% block extrahead %} -{{ block.super }} -{{ media }} - - -{% endblock %} - -{% block bodyclass %}{{ block.super }} app-{{ opts.app_label }} model-{{ opts.model_name }} delete-confirmation delete-selected-confirmation{% endblock %} - -{% block breadcrumbs %} - -{% endblock %} - -{% block content %} -

Please select the document type.

-
{% csrf_token %} -
- {% for obj in queryset %} - - {% endfor %} -

- -

- - - -

- - {% trans "Go back" %} -

-
-
-{% endblock %} \ No newline at end of file