]> git.0d.be Git - panikdb.git/blob - panikdb/urls_utils.py
load-piwik-stats: make request using requests module
[panikdb.git] / panikdb / urls_utils.py
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
4
5
6 class DecoratedURLPattern(RegexURLPattern):
7     def resolve(self, *args, **kwargs):
8         result = super(DecoratedURLPattern, self).resolve(*args, **kwargs)
9         if result:
10             result.func = self._decorate_with(result.func)
11         return result
12
13 class DecoratedRegexURLResolver(RegexURLResolver):
14     def resolve(self, *args, **kwargs):
15         result = super(DecoratedRegexURLResolver, self).resolve(*args, **kwargs)
16         if result:
17             result.func = self._decorate_with(result.func)
18         return result
19
20 def decorated_includes(func, includes, *args, **kwargs):
21     urlconf_module, app_name, namespace = includes
22
23     for item in urlconf_module:
24         if isinstance(item, RegexURLPattern):
25             item.__class__ = DecoratedURLPattern
26             item._decorate_with = func
27
28         elif isinstance(item, RegexURLResolver):
29             item.__class__ = DecoratedRegexURLResolver
30             item._decorate_with = func
31
32     return urlconf_module, app_name, namespace
33
34
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'):
38             return True
39         if user and not user.is_anonymous():
40             raise PermissionDenied()
41         # As the last resort, show the login form
42         return False
43     actual_decorator = user_passes_test(check_cms_permission, login_url=login_url)
44     if function:
45         return actual_decorator(function)
46     return actual_decorator