diff options
author | Rogelio Mita <rogeliomita@activitycentral.com> | 2013-03-12 23:11:56 (GMT) |
---|---|---|
committer | Rogelio Mita <rogeliomita@activitycentral.com> | 2013-03-25 21:42:19 (GMT) |
commit | 23ba438d0831e488fb718766fcbff680eb4f6fac (patch) | |
tree | 741b49c3e7271459634109ef2df66a5ee6b8e35e /webapp/utils | |
parent | c48fffb48a4f3031a68c745c21fe2a839d703d32 (diff) |
Authentication with sqlite3 and Django auth app
Diffstat (limited to 'webapp/utils')
-rw-r--r-- | webapp/utils/decorators.py | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/webapp/utils/decorators.py b/webapp/utils/decorators.py new file mode 100644 index 0000000..05184f9 --- /dev/null +++ b/webapp/utils/decorators.py @@ -0,0 +1,98 @@ +from functools import wraps + +from django.conf import settings +from django.utils.importlib import import_module +from django.core.exceptions import ImproperlyConfigured +from django.core.urlresolvers import RegexURLPattern, RegexURLResolver +from django.contrib.auth.decorators import login_required + + +__all__ = [ + 'decorator_include', + 'user_account_required' +] + + +class DecoratedPatterns(object): + """ + A wrapper for an urlconf that applies a decorator to all its views. + """ + def __init__(self, urlconf_name, decorators): + self.urlconf_name = urlconf_name + try: + iter(decorators) + except TypeError: + decorators = [decorators] + self.decorators = decorators + if not isinstance(urlconf_name, basestring): + self._urlconf_module = self.urlconf_name + else: + self._urlconf_module = None + + def decorate_pattern(self, pattern): + if isinstance(pattern, RegexURLResolver): + regex = pattern.regex.pattern + urlconf_module = pattern.urlconf_name + default_kwargs = pattern.default_kwargs + namespace = pattern.namespace + app_name = pattern.app_name + urlconf = DecoratedPatterns(urlconf_module, self.decorators) + decorated = RegexURLResolver( + regex, urlconf, default_kwargs, + app_name, namespace + ) + else: + callback = pattern.callback + for decorator in reversed(self.decorators): + callback = decorator(callback) + decorated = RegexURLPattern( + pattern.regex.pattern, + callback, + pattern.default_args, + pattern.name + ) + return decorated + + def _get_urlconf_module(self): + if self._urlconf_module is None: + self._urlconf_module = import_module(self.urlconf_name) + return self._urlconf_module + urlconf_module = property(_get_urlconf_module) + + def _get_urlpatterns(self): + try: + patterns = self.urlconf_module.urlpatterns + except AttributeError: + patterns = self.urlconf_module + return [self.decorate_pattern(pattern) for pattern in patterns] + urlpatterns = property(_get_urlpatterns) + + def __getattr__(self, name): + return getattr(self.urlconf_module, name) + + +def decorator_include(decorators, arg, namespace=None, app_name=None): + """ + Works like ``django.conf.urls.defaults.include`` but takes a view decorator + or an iterable of view decorators as the first argument and applies them, + in reverse order, to all views in the included urlconf. + """ + if isinstance(arg, tuple): + if namespace: + raise ImproperlyConfigured( + 'Cannot override the namespace for a dynamic ' + 'module that provides a namespace' + ) + urlconf, app_name, namespace = arg + else: + urlconf = arg + decorated_urlconf = DecoratedPatterns(urlconf, decorators) + return (decorated_urlconf, app_name, namespace) + + +def user_account_required(view_function): + @wraps(view_function) + @login_required(login_url=settings.LOGIN_URL) + def decorator(*args, **kwargs): + return view_function(*args, **kwargs) + return decorator |