Browse Source

AdminActionBase.

master
Erik Stein 6 years ago
parent
commit
00e56dd096
  1. 2
      CHANGES
  2. 75
      shared/utils/admin_actions.py
  3. 30
      shared/utils/templates/admin/action_forms/admin_action_base.html

2
CHANGES

@ -1,4 +1,6 @@
- Added dispatch_slug_path.
- Added AdminActionBase.
0.2.17 2018-12-17
- PageTitlesMixin: Slimdown name for get_short_title.
- Daytime utils.

75
shared/utils/admin_actions.py

@ -0,0 +1,75 @@
from django import forms
from django.contrib import admin
from django.http import HttpResponseRedirect
from django.shortcuts import render
class AdminActionBase:
action_name = None
options_template_name = 'admin/action_forms/admin_action_base.html'
title = None
queryset_action_label = None
action_button_label = None
def apply(self, queryset, form):
raise NotImplementedError
def get_message(self, count):
raise NotImplementedError
def get_failure_message(self, count, failure_count):
raise NotImplementedError
class BaseForm(forms.Form):
_selected_action = forms.CharField(widget=forms.MultipleHiddenInput)
def get_form_class(self, modeladmin, request, queryset):
"""
Example:
class CustomForm(BaseForm)
chosen_target = forms.ModelChoiceField(
label=_("Choose target itembundle"),
queryset=ItemBundle.objects.exclude(pk__in=queryset),
widget=ForeignKeyRawIdWidget(modeladmin.model._meta.get_field('parent').rel, modeladmin.admin_site),
empty_label=_("Root level"), required=False)
return CustomForm
"""
raise NotImplementedError
def __call__(self, modeladmin, request, queryset):
form_class = self.get_form_class(modeladmin, request, queryset)
form = None
if 'apply' in request.POST:
form = form_class(request.POST)
if form.is_valid():
queryset_count = queryset.count()
count = self.apply(queryset, form)
failure_count = queryset_count - count
if failure_count > 0:
message = self.get_failure_message(form, count, failure_count)
else:
message = self.get_message(form, count)
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 = form_class(initial={
'_selected_action': request.POST.getlist(
admin.ACTION_CHECKBOX_NAME),
})
return render(request, self.options_template_name, context={
'action_name': self.action_name,
'title': self.title,
'queryset_action_label': self.queryset_action_label,
'action_button_label': self.action_button_label,
'queryset': queryset,
'action_form': form,
'opts': modeladmin.model._meta,
})

30
shared/utils/templates/admin/action_forms/admin_action_base.html

@ -0,0 +1,30 @@
{% extends "admin/change_form.html" %}{# Needed for admin javascripts #}
{% load i18n static %}
{% block title %}{{ title }}{% endblock %}
{% block content %}
<div id="content-main">
<form action="" method="post">{% csrf_token %}
<div>
{{ action_form.as_p }}
{% for obj in queryset %}
<input type="hidden" name="_selected_action" value="{{ obj.id }}">
{% endfor %}
<p>{{ queryset_action_label }}</p>
<ul>
{{ queryset|unordered_list }}
</ul>
<input type="hidden" name="action" value="{{ action_name }}">
<input type="submit" name="apply" value="{{ action_button_label }}">
<input class="button cancel-link" type="submit" name="cancel" value="{% trans "Cancel" %}">
{# <a href="#" class="button cancel-link">{% trans "No, take me back" %}</a> #}
</div>
</form>
</div>
{% endblock %}
Loading…
Cancel
Save