diff options
Diffstat (limited to 'app/lib/grappelli/admin.py')
-rw-r--r-- | app/lib/grappelli/admin.py | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/app/lib/grappelli/admin.py b/app/lib/grappelli/admin.py new file mode 100644 index 0000000..79df71c --- /dev/null +++ b/app/lib/grappelli/admin.py @@ -0,0 +1,67 @@ +# 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) + + |