diff options
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 |
commit | 358291cb222400434ff5619abd69fb8d9a6054f1 (patch) | |
tree | f9b2ad849ffc80a6bef1e9f31f853a6aabc0228d | |
parent | b4da7d1172c45a379cb695cdd6661be10beb2458 (diff) | |
download | Ishtar-358291cb222400434ff5619abd69fb8d9a6054f1.tar.bz2 Ishtar-358291cb222400434ff5619abd69fb8d9a6054f1.zip |
Admin - Document tag: add merge action
-rw-r--r-- | ishtar_common/admin.py | 76 | ||||
-rw-r--r-- | ishtar_common/models.py | 1 | ||||
-rw-r--r-- | ishtar_common/templates/admin/merge.html | 17 |
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 %} |