summaryrefslogtreecommitdiff
path: root/ishtar_common
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2020-09-02 12:44:44 +0200
committerÉtienne Loks <etienne.loks@iggdrasil.net>2021-02-28 12:15:21 +0100
commit2f86de32aac26c4e019a9e136a6301afef0b7884 (patch)
treef9b2ad849ffc80a6bef1e9f31f853a6aabc0228d /ishtar_common
parent2b21cef742196c832204dffa664d629c4cef08b4 (diff)
downloadIshtar-2f86de32aac26c4e019a9e136a6301afef0b7884.tar.bz2
Ishtar-2f86de32aac26c4e019a9e136a6301afef0b7884.zip
Admin - Document tag: add merge action
Diffstat (limited to 'ishtar_common')
-rw-r--r--ishtar_common/admin.py76
-rw-r--r--ishtar_common/models.py1
-rw-r--r--ishtar_common/templates/admin/merge.html17
3 files changed, 93 insertions, 1 deletions
diff --git a/ishtar_common/admin.py b/ishtar_common/admin.py
index 67b2ff41c..287f28249 100644
--- a/ishtar_common/admin.py
+++ b/ishtar_common/admin.py
@@ -64,6 +64,7 @@ from django import forms
from ishtar_common import models
from ishtar_common.apps import admin_site
+from ishtar_common.model_merging import merge_model_objects
from ishtar_common.utils import get_cache, create_slug
from ishtar_common import forms as common_forms
@@ -247,6 +248,75 @@ SERIALIZE_DESC = _("Export selected as Ishtar (zipped JSON)")
serialize_type_action = serialize_action("types", None)
serialize_type_action.short_description = SERIALIZE_DESC
+
+class MergeForm(forms.Form):
+ merge_in = forms.ChoiceField(label=_("Merge inside"), choices=[])
+
+ def __init__(self, choices, post=None, files=None):
+ if post:
+ super(MergeForm, self).__init__(post, files)
+ else:
+ super(MergeForm, self).__init__()
+ self.fields["merge_in"].choices = choices
+
+
+class MergeActionAdmin:
+ def get_actions(self, request):
+ action_dct = super(MergeActionAdmin, self).get_actions(request)
+ action_dct["merge_selected"] = (self.admin_merge, "merge_selected",
+ _("Merge selected items"))
+ return action_dct
+
+ def admin_merge(self, modeladmin, request, queryset):
+ return_url = reverse(
+ 'admin:%s_%s_changelist' % (
+ self.model._meta.app_label,
+ self.model._meta.model_name)
+ )
+ if not request.POST:
+ return HttpResponseRedirect(return_url)
+
+ selected = request.POST.getlist('_selected_action', [])
+ if len(selected) < 2:
+ messages.add_message(
+ request, messages.WARNING,
+ str(_("At least two items have to be selected."))
+ )
+ return HttpResponseRedirect(return_url)
+
+ items = {}
+ choices = []
+ for pk in selected:
+ obj = self.model.objects.get(pk=pk)
+ choices.append((obj.pk, str(obj)))
+ items[str(obj.pk)] = obj
+
+ form = None
+ if 'apply' in request.POST:
+ form = MergeForm(choices, request.POST, request.FILES)
+ if form.is_valid():
+ merge_in = items[form.cleaned_data['merge_in']]
+ merged = []
+ for key in items.keys():
+ if key == str(merge_in.pk):
+ continue
+ merge_model_objects(merge_in, items[key])
+ merged.append(str(items[key]))
+ messages.add_message(
+ request, messages.INFO,
+ str(_("{} merged into {}.")).format(' ; '.join(merged),
+ str(merge_in))
+ )
+ return HttpResponseRedirect(return_url)
+ if not form:
+ form = MergeForm(choices)
+ return render(
+ request, 'admin/merge.html',
+ {'merge_form': form, 'current_action': 'merge_selected',
+ 'selected_items': selected}
+ )
+
+
TokenAdmin.raw_id_fields = ('user',)
admin_site.register(Token, TokenAdmin)
@@ -914,7 +984,7 @@ class GeneralTypeAdmin(ImportActionAdmin, ImportJSONActionAdmin):
general_models = [models.OrganizationType, models.SourceType,
models.AuthorType, models.TitleType, models.Format,
models.SupportType, models.PersonType, models.LicenseType,
- models.DocumentTag, models.Language]
+ models.Language]
for model in general_models:
admin_site.register(model, GeneralTypeAdmin)
@@ -1022,6 +1092,10 @@ class AreaAdmin(CreateDepartmentActionAdmin):
)
+@admin.register(models.DocumentTag, site=admin_site)
+class DocumentTag(MergeActionAdmin, GeneralTypeAdmin):
+ pass
+
admin_site.register(models.Area, AreaAdmin)
diff --git a/ishtar_common/models.py b/ishtar_common/models.py
index 785311764..d9112b5e7 100644
--- a/ishtar_common/models.py
+++ b/ishtar_common/models.py
@@ -5328,6 +5328,7 @@ class LicenseType(GeneralType):
class DocumentTag(GeneralType):
SLUG = "documenttag"
+
class Meta:
verbose_name = _("Document tag")
verbose_name_plural = _("Document tags")
diff --git a/ishtar_common/templates/admin/merge.html b/ishtar_common/templates/admin/merge.html
new file mode 100644
index 000000000..98c66ad8e
--- /dev/null
+++ b/ishtar_common/templates/admin/merge.html
@@ -0,0 +1,17 @@
+{% extends "admin/base_site.html" %}{% load i18n %}
+
+{% block content %}
+
+<form action="." method="post" enctype="multipart/form-data">
+{% csrf_token %}
+ <table>
+ {{ merge_form }}
+ </table>
+ <input type="hidden" name="action" value="{{current_action}}" />
+ {% for selected in selected_items %}
+ <input type="hidden" name="_selected_action" value="{{selected}}" />
+ {% endfor %}
+ <input type="submit" name="apply" value="{% trans 'Merge' %}" />
+</form>
+
+{% endblock %}