68 lines
2.3 KiB
Python
68 lines
2.3 KiB
Python
# coding: utf-8
|
|
|
|
# DJANGO IMPORTS
|
|
from django.contrib import admin
|
|
from django.contrib.admin import sites
|
|
from django.contrib.admin import ModelAdmin
|
|
|
|
from django.utils.functional import update_wrapper
|
|
from django.views.decorators.csrf import csrf_protect
|
|
from django.utils.translation import ugettext as _
|
|
from django.views.decorators.cache import never_cache
|
|
|
|
from django.conf import settings
|
|
|
|
|
|
class AdminSite(sites.AdminSite):
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
self.grappelli_title = kwargs.pop('title', 'Grappelli')
|
|
self.grappelli_headline = kwargs.pop('headline', 'Grappelli')
|
|
super(AdminSite, self).__init__(*args, **kwargs)
|
|
|
|
def annotate_context(self, extra_context):
|
|
extra_context = extra_context or {}
|
|
extra_context.update({
|
|
'grappelli_admin_title': self.grappelli_title,
|
|
'grappelli_admin_headline': self.grappelli_headline,
|
|
})
|
|
return extra_context
|
|
|
|
def admin_view(self, view, cacheable=False):
|
|
# not everything can take extra_context
|
|
excludes = [
|
|
'password_change',
|
|
'password_change_done',
|
|
'i18n_javascript',
|
|
'login',
|
|
'logout',
|
|
'user_change_password',
|
|
]
|
|
def inner(request, *args, **kwargs):
|
|
if not self.has_permission(request):
|
|
return self.login(request)
|
|
if view.__name__ not in excludes:
|
|
extra_context = kwargs.get('extra_context', {})
|
|
extra_context = self.annotate_context(extra_context)
|
|
kwargs['extra_context'] = extra_context
|
|
return view(request, *args, **kwargs)
|
|
if not cacheable:
|
|
inner = never_cache(inner)
|
|
# We add csrf_protect here so this function can be used as a utility
|
|
# function for any view, without having to repeat 'csrf_protect'.
|
|
if not getattr(view, 'csrf_exempt', False):
|
|
inner = csrf_protect(inner)
|
|
return update_wrapper(inner, view)
|
|
|
|
|
|
class RelatedLookupAdmin(admin.ModelAdmin):
|
|
|
|
def has_change_permission(self, request, obj=None):
|
|
if not obj:
|
|
opts = self.opts
|
|
if request.user.has_perm(opts.app_label + '.view_' + opts.object_name.lower()):
|
|
return True
|
|
return super(RelatedLookupAdmin, self).has_change_permission(request, obj)
|
|
|
|
|