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 /ishtar_common/admin.py | |
| parent | b4da7d1172c45a379cb695cdd6661be10beb2458 (diff) | |
| download | Ishtar-358291cb222400434ff5619abd69fb8d9a6054f1.tar.bz2 Ishtar-358291cb222400434ff5619abd69fb8d9a6054f1.zip | |
Admin - Document tag: add merge action
Diffstat (limited to 'ishtar_common/admin.py')
| -rw-r--r-- | ishtar_common/admin.py | 76 | 
1 files changed, 75 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) | 
