removed duplicate code

This commit is contained in:
Jonas Winkler 2018-09-12 13:43:28 +02:00
parent ef0d37985b
commit 25a6aa909b
4 changed files with 80 additions and 277 deletions

View file

@ -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"