Last active
March 15, 2020 12:52
-
-
Save LouisdeBruijn/d638142e8fca50734853a97e4f6dc74f to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| from functools import wraps | |
| from django.contrib import messages | |
| from django.contrib.auth.views import redirect_to_login | |
| from django.contrib.auth import REDIRECT_FIELD_NAME | |
| from django.shortcuts import resolve_url | |
| from urllib.parse import urlparse | |
| from [projectname].settings import config | |
| import [projectname].settings as settings | |
| import requests | |
| default_message = 'Unauthorised action.' | |
| unauthenticated_message = 'User already logged in.' | |
| def user_passes_test(test_func, login_url=None, redirect_field_name=REDIRECT_FIELD_NAME, message=default_message): | |
| """ | |
| Decorator for views that checks that the user passes the given test, | |
| redirecting to the log-in page if necessary. The test should be a callable | |
| that takes the user object and returns True if the user passes. | |
| """ | |
| def decorator(view_func): | |
| @wraps(view_func) | |
| def _wrapped_view(request, *args, **kwargs): | |
| if not test_func(request.user): | |
| messages.add_message(request, messages.ERROR, message) | |
| if test_func(request.user): | |
| return view_func(request, *args, **kwargs) | |
| path = request.build_absolute_uri() | |
| resolved_login_url = resolve_url(login_url or settings.LOGIN_URL) | |
| # If the login url is the same scheme and net location then just | |
| # use the path as the "next" url. | |
| login_scheme, login_netloc = urlparse(resolved_login_url)[:2] | |
| current_scheme, current_netloc = urlparse(path)[:2] | |
| if ((not login_scheme or login_scheme == current_scheme) and | |
| (not login_netloc or login_netloc == current_netloc)): | |
| path = request.get_full_path() | |
| return redirect_to_login( | |
| path, resolved_login_url, redirect_field_name) | |
| return _wrapped_view | |
| return decorator |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment