1 from django.contrib.auth.decorators import user_passes_test
2 from django.core.urlresolvers import RegexURLPattern, RegexURLResolver
3 from django.core.exceptions import PermissionDenied
6 class DecoratedURLPattern(RegexURLPattern):
7 def resolve(self, *args, **kwargs):
8 result = super(DecoratedURLPattern, self).resolve(*args, **kwargs)
10 result.func = self._decorate_with(result.func)
13 class DecoratedRegexURLResolver(RegexURLResolver):
14 def resolve(self, *args, **kwargs):
15 result = super(DecoratedRegexURLResolver, self).resolve(*args, **kwargs)
17 result.func = self._decorate_with(result.func)
20 def decorated_includes(func, includes, *args, **kwargs):
21 urlconf_module, app_name, namespace = includes
23 for item in urlconf_module:
24 if isinstance(item, RegexURLPattern):
25 item.__class__ = DecoratedURLPattern
26 item._decorate_with = func
28 elif isinstance(item, RegexURLResolver):
29 item.__class__ = DecoratedRegexURLResolver
30 item._decorate_with = func
32 return urlconf_module, app_name, namespace
35 def cms_permission_required(function=None, login_url=None):
36 def check_cms_permission(user):
37 if user and user.has_perm('data.add_page'):
39 if user and not user.is_anonymous():
40 raise PermissionDenied()
41 # As the last resort, show the login form
43 actual_decorator = user_passes_test(check_cms_permission, login_url=login_url)
45 return actual_decorator(function)
46 return actual_decorator