<filename>shared/media_archive/admin_actions.py<gh_stars>0
from django import forms
from django.contrib import admin
from django.http import HttpResponseRedirect
from django.utils.translation import ngettext, gettext_lazy as _
from django.shortcuts import render

from shared.utils.admin_actions import AdminActionBase, TargetActionBase
from . import models


class AddImagesToGalleryAction(TargetActionBase):
    target_model = models.Gallery
    related_field_name = 'gallery_set'

    __name__ = title = _("Add images to gallery")
    queryset_action_label = _("The selected images will be added to the following gallery:")
    action_button_label = _("Add Images")

    def apply(self, queryset, form):
        gallery = self.get_target(form)
        count = 0
        for image in queryset:
            _, created = \
                models.ImageGalleryRel.objects.get_or_create(
                    image=image,
                    gallery=gallery)
            if created:
                count += 1
        return count


add_images_to_gallery = AddImagesToGalleryAction('add_images_to_gallery')


class AssignCategoryAction(TargetActionBase):
    target_model = models.MediaCategory
    related_field_name = 'categories'

    __name__ = title = _("Assign category to images")
    short_description = title
    queryset_action_label = _("Images which will be assigned to the chosen category:")
    action_button_label = _("Add Images")

    def apply(self, queryset, form):
        category = self.get_target(form)
        count = 0
        for mediafile in queryset:
            getattr(mediafile, self.related_field_name).add(category)
            count += 1
        return count


assign_category = AssignCategoryAction('assign_category')


class MediaBaseActionsMixin:
    def change_is_public_action(self, request, queryset):
        modeladmin = self
        options_template_name = 'media_archive/admin/action_forms/change_is_public.html'

        class AccessAllowedForm(forms.Form):
            _selected_action = forms.CharField(widget=forms.MultipleHiddenInput)
            # is_public = forms.BooleanField(label=_("Öffentlich sichtbar"))
            is_public = forms.TypedChoiceField(
                coerce=lambda x: x == 'True',
                choices=((False, _("Nicht veröffentlicht")), (True, _("Veröffentlicht"))),
                widget=forms.RadioSelect
            )

        form = None
        if 'apply' in request.POST:
            form = AccessAllowedForm(request.POST)
            if form.is_valid():
                chosen_is_public = form.cleaned_data['is_public']
                count = queryset.update(is_public=chosen_is_public)
                message = ngettext(
                    'Successfully set %(count)d media file to %(chosen_is_public)s.',
                    'Successfully set %(count)d media files to %(chosen_is_public)s.',
                    count) % {'count': count, 'chosen_is_public': chosen_is_public}
                modeladmin.message_user(request, message)
                return HttpResponseRedirect(request.get_full_path())
        if 'cancel' in request.POST:
            return HttpResponseRedirect(request.get_full_path())

        if not form:
            form = AccessAllowedForm(initial={
                '_selected_action': request.POST.getlist(
                    admin.ACTION_CHECKBOX_NAME),
            })

        return render(request, options_template_name, context={
            'mediafiles': queryset,
            'action_form': form,
            'opts': modeladmin.model._meta,
            'queryset': queryset,
        })
    change_is_public_action.short_description = _("Zugriff für ausgewählte Mediendateien setzen")


<filename>shared/media_archive/admin_actions.py<gh_stars>0
from django import forms
from django.contrib import admin
from django.http import HttpResponseRedirect
from django.utils.translation import ngettext, gettext_lazy as _
from django.shortcuts import render

from shared.utils.admin_actions import AdminActionBase, TargetActionBase
from . import models


class AddImagesToGalleryAction(TargetActionBase):
    target_model = models.Gallery
    related_field_name = 'gallery_set'

    __name__ = title = _("Add images to gallery")
    queryset_action_label = _("The selected images will be added to the following gallery:")
    action_button_label = _("Add Images")

    def apply(self, queryset, form):
        gallery = self.get_target(form)
        count = 0
        for image in queryset:
            _, created = \
                models.ImageGalleryRel.objects.get_or_create(
                    image=image,
                    gallery=gallery)
            if created:
                count += 1
        return count


add_images_to_gallery = AddImagesToGalleryAction('add_images_to_gallery')


class AssignCategoryAction(TargetActionBase):
    target_model = models.MediaCategory
    related_field_name = 'categories'

    __name__ = title = _("Assign category to images")
    short_description = title
    queryset_action_label = _("Images which will be assigned to the chosen category:")
    action_button_label = _("Add Images")

    def apply(self, queryset, form):
        category = self.get_target(form)
        count = 0
        for mediafile in queryset:
            getattr(mediafile, self.related_field_name).add(category)
            count += 1
        return count


assign_category = AssignCategoryAction('assign_category')


class MediaBaseActionsMixin:
    def change_is_public_action(self, request, queryset):
        modeladmin = self
        options_template_name = 'media_archive/admin/action_forms/change_is_public.html'

        class AccessAllowedForm(forms.Form):
            _selected_action = forms.CharField(widget=forms.MultipleHiddenInput)
            # is_public = forms.BooleanField(label=_("Öffentlich sichtbar"))
            is_public = forms.TypedChoiceField(
                coerce=lambda x: x == 'True',
                choices=((False, _("Nicht veröffentlicht")), (True, _("Veröffentlicht"))),
                widget=forms.RadioSelect
            )

        form = None
        if 'apply' in request.POST:
            form = AccessAllowedForm(request.POST)
            if form.is_valid():
                chosen_is_public = form.cleaned_data['is_public']
                count = queryset.update(is_public=chosen_is_public)
                message = ngettext(
                    'Successfully set %(count)d media file to %(chosen_is_public)s.',
                    'Successfully set %(count)d media files to %(chosen_is_public)s.',
                    count) % {'count': count, 'chosen_is_public': chosen_is_public}
                modeladmin.message_user(request, message)
                return HttpResponseRedirect(request.get_full_path())
        if 'cancel' in request.POST:
            return HttpResponseRedirect(request.get_full_path())

        if not form:
            form = AccessAllowedForm(initial={
                '_selected_action': request.POST.getlist(
                    admin.ACTION_CHECKBOX_NAME),
            })

        return render(request, options_template_name, context={
            'mediafiles': queryset,
            'action_form': form,
            'opts': modeladmin.model._meta,
            'queryset': queryset,
        })
    change_is_public_action.short_description = _("Zugriff für ausgewählte Mediendateien setzen")


# is_public = forms.BooleanField(label=_("Öffentlich sichtbar"))