From 358291cb222400434ff5619abd69fb8d9a6054f1 Mon Sep 17 00:00:00 2001 From: Étienne Loks Date: Wed, 2 Sep 2020 12:44:44 +0200 Subject: Admin - Document tag: add merge action --- ishtar_common/admin.py | 76 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 75 insertions(+), 1 deletion(-) (limited to 'ishtar_common/admin.py') 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) -- cgit v1.2.3