summaryrefslogtreecommitdiff
path: root/app/lib/grappelli/admin.py
diff options
context:
space:
mode:
Diffstat (limited to 'app/lib/grappelli/admin.py')
-rw-r--r--app/lib/grappelli/admin.py67
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)
+
+