admin: ajoute un bouton annuler aux vues de suppression

Ce commit ajoute aussi un AdminSite customisé et une classe
BaseModelAdmin pour tous les ModelAdmin; elle surcharge les templates
des vues de suppression pour ajouter les boutons.

Il a aussi fallu modifier la configuration de django-admin-tools qui ne
supporte les surcharge de la classe AdminSite que si celle-ci sont
explicitement déclarées.

fixes #1939
This commit is contained in:
Benjamin Dauvergne 2012-11-28 11:33:22 +01:00
parent 7241b363c2
commit 25748b344c
8 changed files with 112 additions and 39 deletions

View File

@ -3,7 +3,7 @@
from django.contrib import admin
import django.forms.models
from django.contrib.sites.models import Site
from django.contrib.auth import admin as auth_admin
from django.contrib.auth import admin as auth_admin, models as auth_models
from django.utils.translation import ugettext_lazy as _
from django.db.models import Q
@ -17,28 +17,46 @@ from models import (AccountingCode, Action, DeliveryPlace, DocumentLicence,
ProfileOption, ProfileOptionChoice, Request, Role, RoleAssociation,
Status, Transition, User)
class ProfileAdmin(admin.ModelAdmin, utils.LocalizedModelAdmin):
class PolynumAdminSite(admin.AdminSite):
pass
class BaseModelAdmin(admin.ModelAdmin):
delete_confirmation_template = 'admin/polynum_delete_confirmation.html'
delete_selected_confirmation_template = 'admin/polynum_delete_selected_confirmation.html'
site = PolynumAdminSite()
class UserAdmin(auth_admin.UserAdmin, BaseModelAdmin):
pass
class GroupAdmin(auth_admin.GroupAdmin, BaseModelAdmin):
pass
site.register(auth_models.User, auth_admin.UserAdmin)
site.register(auth_models.Group, auth_admin.GroupAdmin)
class ProfileAdmin(BaseModelAdmin, utils.LocalizedModelAdmin):
filter_horizontal = [ 'choices', ]
list_display = ['id', 'order', 'name', 'display_choices', 'ppd', 'ppp']
list_editable = [ 'order' ]
admin.site.register(Profile, ProfileAdmin)
site.register(Profile, ProfileAdmin)
class ProfileOptionChoiceInline(admin.StackedInline, utils.LocalizedModelAdmin):
model = ProfileOptionChoice
extra = 0
class ProfileOptionAdmin(admin.ModelAdmin):
class ProfileOptionAdmin(BaseModelAdmin):
inlines = [ ProfileOptionChoiceInline, ]
list_display = ['id', 'order', 'name', 'visible', 'list_type', 'display_choices']
list_editable = ['name', 'order', 'visible', 'list_type']
admin.site.register(ProfileOption, ProfileOptionAdmin)
site.register(ProfileOption, ProfileOptionAdmin)
class AccountingCodeInline(admin.TabularInline):
model = AccountingCode
class EntityAdmin(admin.ModelAdmin):
class EntityAdmin(BaseModelAdmin):
list_display = ['pre_code', 'get_name', 'get_description', 'entity_type']
fields = [ 'code', 'is_active', 'name', 'description', 'entity_type', 'parent', 'depth',
'description_override', 'name_override', 'get_children',
@ -93,7 +111,7 @@ class HistoryInline(admin.TabularInline):
model = History
extra = 0
class RequestAdmin(admin.ModelAdmin):
class RequestAdmin(BaseModelAdmin):
raw_id_fields = [ 'entity' ]
list_display = ['id', 'user', 'uploadfile', 'name', 'nb_pages', 'entity', ]
date_hierarchy = 'delivery_date'
@ -101,7 +119,7 @@ class RequestAdmin(admin.ModelAdmin):
'licence', 'copyright', 'usage' ]
inlines = [ HistoryInline ]
class TransitionAdmin(admin.ModelAdmin):
class TransitionAdmin(BaseModelAdmin):
list_display = [ 'id', 'role', 'source', 'get_name', 'destination',
'default', 'warn' ]
list_filter = [ 'role', 'source', 'action', 'destination' ]
@ -112,55 +130,52 @@ class MailNotificationInline(admin.TabularInline):
list_filter = ('action', 'to')
extra = 0
class ActionAdmin(admin.ModelAdmin):
class ActionAdmin(BaseModelAdmin):
inlines = [ MailNotificationInline ]
list_display = ('id', 'name', 'comment', 'special_type', 'pages',
'validate_request' )
list_filter = ('comment', 'special_type', 'validate_request')
list_editable = [ 'name', 'comment', 'special_type', 'validate_request' ]
class StatusAdmin(admin.ModelAdmin):
class StatusAdmin(BaseModelAdmin):
list_display = ('id', 'name', 'order', 'visible', 'default', 'start', 'end')
list_editable = ('name', 'order', 'visible', 'default', 'start', 'end')
list_filter = ('visible', 'default', 'start', 'end')
filter_horizontal = [ 'visible_by' ]
admin.site.register(Entity, EntityAdmin)
admin.site.register(EntityType)
site.register(Entity, EntityAdmin)
site.register(EntityType, BaseModelAdmin)
admin.site.register(Role)
site.register(Role, BaseModelAdmin)
class DeliveryPlaceAdmin(admin.ModelAdmin):
class DeliveryPlaceAdmin(BaseModelAdmin):
list_display = [ 'id', 'order', 'name', 'description', 'comments' ]
list_editable = [ 'order', 'name', 'description', 'comments' ]
admin.site.register(DeliveryPlace, DeliveryPlaceAdmin)
site.register(DeliveryPlace, DeliveryPlaceAdmin)
class DocumentUsageAdmin(admin.ModelAdmin):
class DocumentUsageAdmin(BaseModelAdmin):
list_display = [ 'id', 'order', 'name', 'description', 'url', 'comments' ]
list_editable = [ 'order', 'name', 'description', 'url', 'comments' ]
admin.site.register(DocumentUsage, DocumentUsageAdmin)
site.register(DocumentUsage, DocumentUsageAdmin)
class DocumentLicenceAdmin(admin.ModelAdmin):
class DocumentLicenceAdmin(BaseModelAdmin):
list_display = [ 'id', 'order', 'name', 'description', 'url', 'comments' ]
list_editable = [ 'order', 'name', 'description', 'url', 'comments' ]
admin.site.register(DocumentLicence, DocumentLicenceAdmin)
admin.site.register(Request, RequestAdmin)
site.register(DocumentLicence, DocumentLicenceAdmin)
site.register(Request, RequestAdmin)
admin.site.register(Status, StatusAdmin)
admin.site.register(Action, ActionAdmin)
admin.site.register(Transition, TransitionAdmin)
site.register(Status, StatusAdmin)
site.register(Action, ActionAdmin)
site.register(Transition, TransitionAdmin)
class MailNotificationAdmin(admin.ModelAdmin):
class MailNotificationAdmin(BaseModelAdmin):
list_display = [ 'action', 'to', 'subject_template' ]
list_filter = [ 'action', 'to' ]
admin.site.register(MailNotification, MailNotificationAdmin)
# don't show the "Site" model
admin.site.unregister(Site)
site.register(MailNotification, MailNotificationAdmin)
class RoleAssociationInline(admin.TabularInline):
model = RoleAssociation
@ -202,4 +217,28 @@ class UserAdmin(auth_admin.UserAdmin):
affectation = attr.get('supannEntiteAffectation', [])
return u', '.join(affectation)
admin.site.register(User, UserAdmin)
site.register(User, UserAdmin)
# delegation
from polynum.delegation.models import Delegation
from polynum.delegation.admin import DelegationAdmin as BaseDelegationAdmin
class DelegationAdmin(BaseDelegationAdmin, BaseModelAdmin):
pass
site.register(Delegation, DelegationAdmin)
# editor
from polynum.editor.models import ContentBlock
from polynum.editor.admin import ContentBlockAdmin as BaseContentBlockAdmin
class ContentBlockAdmin(BaseContentBlockAdmin, BaseModelAdmin):
pass
site.register(ContentBlock, ContentBlockAdmin)

View File

@ -27,7 +27,7 @@ class CustomIndexDashboard(Dashboard):
site_name = get_admin_site_name(context)
self.children.append(modules.ModelList(
self.children.append(modules.ModelList(
_(u'Groupes, utilisateurs et rôles'),
layout='inline',
draggable=True,

View File

@ -18,5 +18,3 @@ class DelegationAdmin(admin.ModelAdmin):
user_delegated__display_name.short_description = \
models.Delegation._meta.get_field('user_delegated').verbose_name
user_delegated__display_name.admin_order_field = 'user_delegated'
admin.site.register(models.Delegation, DelegationAdmin)

View File

@ -1,8 +1,4 @@
from django.contrib import admin
import models
class ContentBlockAdmin(admin.ModelAdmin):
list_display = ('name', 'content')
admin.site.register(models.ContentBlock, ContentBlockAdmin)

View File

@ -198,8 +198,13 @@ CAS_SERVER_URL = None # 'https://www.ent.dauphine.fr/cas/'
# django-admin-tools
# see http://django-admin-tools.readthedocs.org/en/latest/customization.html
ADMIN_TOOLS_INDEX_DASHBOARD = 'polynum.dashboard.CustomIndexDashboard'
ADMIN_TOOLS_APP_INDEX_DASHBOARD = 'polynum.dashboard.CustomAppIndexDashboard'
ADMIN_TOOLS_INDEX_DASHBOARD = {
'polynum.base.admin.site': 'polynum.dashboard.CustomIndexDashboard',
}
ADMIN_TOOLS_APP_INDEX_DASHBOARD = {
'polynum.base.admin.site': 'polynum.dashboard.CustomAppIndexDashboard',
}
# Session cookies
SESSION_COOKIE_AGE = 3600*24 # 1 day

View File

@ -0,0 +1,17 @@
{% extends "admin/delete_confirmation.html" %}
{% block extrastyle %}
{{ block.super }}
<script src="/static/jquery/js/jquery.js"></script>
<script>
$(function () {
var $button = $('<input style="margin-left: 1em" type="submit" value="Annuler"/>');
$button.click(function () {
window.location = "..";
return false;
});
$('input[type="submit"]').after($button);
$('input[type="submit"]').after($button);
});
</script>
{% endblock %}

View File

@ -0,0 +1,17 @@
{% extends "admin/delete_selected_confirmation.html" %}
{% block extrastyle %}
{{ block.super }}
<script src="/static/jquery/js/jquery.js"></script>
<script>
$(function () {
var $button = $('<input style="margin-left: 1em" type="submit" value="Annuler"/>');
$button.click(function () {
window.location = "";
return false;
});
$('input[type="submit"]').after($button);
$('input[type="submit"]').after($button);
});
</script>
{% endblock %}

View File

@ -11,6 +11,7 @@ from utils import decorated_includes
import request.urls
import delegation.urls
from base.decorators import combine_decorators, user_has_validated_cgu
from base.admin import site as admin_site
request_decorator = combine_decorators(
@ -24,7 +25,7 @@ urlpatterns = patterns('',
# url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
url(r'^admin_tools/', include('admin_tools.urls')), # django-admin-tools
url(r'^admin/', include(admin.site.urls)),
url(r'^admin/', include(admin_site.urls)),
url(r'^request/',
decorated_includes(request_decorator, include(request.urls.urlpatterns))),