mirror of
				https://github.com/paperless-ngx/paperless-ngx.git
				synced 2025-10-30 03:56:23 -05:00 
			
		
		
		
	removed duplicate code
This commit is contained in:
		| @@ -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" | ||||
|   | ||||
| @@ -21,16 +21,16 @@ | ||||
| {% endblock %} | ||||
| 
 | ||||
| {% block content %} | ||||
| <p>Please select the tag.</p> | ||||
| <p>Please select the {{itemname}}.</p> | ||||
| <form method="post">{% csrf_token %} | ||||
|     <div> | ||||
|         {% for obj in queryset %} | ||||
|         <input type="hidden" name="{{ action_checkbox_name }}" value="{{ obj.pk|unlocalize }}"/> | ||||
|         {% endfor %} | ||||
|         <p> | ||||
|             <select name="tag_id"> | ||||
|                 {% for tag in tags %} | ||||
|                 <option value="{{tag.id}}">{{tag.name}}</option> | ||||
|             <select name="obj_id"> | ||||
|                 {% for obj in objects %} | ||||
|                 <option value="{{obj.id}}">{{obj.name}}</option> | ||||
|                 {% endfor %} | ||||
|             </select> | ||||
|         </p> | ||||
| @@ -1,46 +0,0 @@ | ||||
| {% extends "admin/base_site.html" %} | ||||
| {% load i18n l10n admin_urls static %} | ||||
| {% load staticfiles %} | ||||
|  | ||||
| {% block extrahead %} | ||||
| {{ block.super }} | ||||
| {{ media }} | ||||
| <script type="text/javascript" src="{% static 'admin/js/cancel.js' %}"></script> | ||||
|  | ||||
| {% endblock %} | ||||
|  | ||||
| {% block bodyclass %}{{ block.super }} app-{{ opts.app_label }} model-{{ opts.model_name }} delete-confirmation delete-selected-confirmation{% endblock %} | ||||
|  | ||||
| {% block breadcrumbs %} | ||||
| <div class="breadcrumbs"> | ||||
|     <a href="{% url 'admin:index' %}">{% trans 'Home' %}</a> | ||||
|     › <a href="{% url 'admin:app_list' app_label=opts.app_label %}">{{ opts.app_config.verbose_name }}</a> | ||||
|     › <a href="{% url opts|admin_urlname:'changelist' %}">{{ opts.verbose_name_plural|capfirst }}</a> | ||||
|     › {{title}} | ||||
| </div> | ||||
| {% endblock %} | ||||
|  | ||||
| {% block content %} | ||||
| <p>Please select the correspondent.</p> | ||||
| <form method="post">{% csrf_token %} | ||||
|     <div> | ||||
|         {% for obj in queryset %} | ||||
|         <input type="hidden" name="{{ action_checkbox_name }}" value="{{ obj.pk|unlocalize }}"/> | ||||
|         {% endfor %} | ||||
|         <p> | ||||
|             <select name="correspondent_id"> | ||||
|                 {% for correspondent in correspondents %} | ||||
|                 <option value="{{correspondent.id}}">{{correspondent.name}}</option> | ||||
|                 {% endfor %} | ||||
|             </select> | ||||
|         </p> | ||||
|  | ||||
|         <input type="hidden" name="action" value="set_correspondent_on_selected"/> | ||||
|         <input type="hidden" name="post" value="yes"/> | ||||
|         <p> | ||||
|             <input type="submit" value="{% trans " Confirm" %}" /> | ||||
|             <a href="#" class="button cancel-link">{% trans "Go back" %}</a> | ||||
|         </p> | ||||
|     </div> | ||||
| </form> | ||||
| {% endblock %} | ||||
| @@ -1,46 +0,0 @@ | ||||
| {% extends "admin/base_site.html" %} | ||||
| {% load i18n l10n admin_urls static %} | ||||
| {% load staticfiles %} | ||||
|  | ||||
| {% block extrahead %} | ||||
| {{ block.super }} | ||||
| {{ media }} | ||||
| <script type="text/javascript" src="{% static 'admin/js/cancel.js' %}"></script> | ||||
|  | ||||
| {% endblock %} | ||||
|  | ||||
| {% block bodyclass %}{{ block.super }} app-{{ opts.app_label }} model-{{ opts.model_name }} delete-confirmation delete-selected-confirmation{% endblock %} | ||||
|  | ||||
| {% block breadcrumbs %} | ||||
| <div class="breadcrumbs"> | ||||
|     <a href="{% url 'admin:index' %}">{% trans 'Home' %}</a> | ||||
|     › <a href="{% url 'admin:app_list' app_label=opts.app_label %}">{{ opts.app_config.verbose_name }}</a> | ||||
|     › <a href="{% url opts|admin_urlname:'changelist' %}">{{ opts.verbose_name_plural|capfirst }}</a> | ||||
|     › {{title}} | ||||
| </div> | ||||
| {% endblock %} | ||||
|  | ||||
| {% block content %} | ||||
| <p>Please select the document type.</p> | ||||
| <form method="post">{% csrf_token %} | ||||
|     <div> | ||||
|         {% for obj in queryset %} | ||||
|         <input type="hidden" name="{{ action_checkbox_name }}" value="{{ obj.pk|unlocalize }}"/> | ||||
|         {% endfor %} | ||||
|         <p> | ||||
|             <select name="document_type_id"> | ||||
|                 {% for document_type in document_types %} | ||||
|                 <option value="{{document_type.id}}">{{document_type.name}}</option> | ||||
|                 {% endfor %} | ||||
|             </select> | ||||
|         </p> | ||||
|  | ||||
|         <input type="hidden" name="action" value="set_document_type_on_selected"/> | ||||
|         <input type="hidden" name="post" value="yes"/> | ||||
|         <p> | ||||
|             <input type="submit" value="{% trans " Confirm" %}" /> | ||||
|             <a href="#" class="button cancel-link">{% trans "Go back" %}</a> | ||||
|         </p> | ||||
|     </div> | ||||
| </form> | ||||
| {% endblock %} | ||||
		Reference in New Issue
	
	Block a user
	 Jonas Winkler
					Jonas Winkler