update urls_utils.py

This commit is contained in:
Frédéric Péters 2020-04-12 11:11:50 +02:00
parent d8ee61f0a9
commit 6520901aad
1 changed files with 20 additions and 11 deletions

View File

@ -16,43 +16,52 @@
# Decorating URL includes, <https://djangosnippets.org/snippets/2532/>
import django
from django.contrib.auth.decorators import user_passes_test
from django.core.exceptions import PermissionDenied
from django.urls import RegexURLPattern, RegexURLResolver
class DecoratedURLPattern(RegexURLPattern):
if django.VERSION < (2, 0, 0):
from django.urls.resolvers import RegexURLPattern as URLPattern
from django.urls.resolvers import RegexURLResolver as URLResolver
else:
from django.urls.resolvers import URLPattern, URLResolver
class DecoratedURLPattern(URLPattern):
def resolve(self, *args, **kwargs):
result = super(DecoratedURLPattern, self).resolve(*args, **kwargs)
if result:
result.func = self._decorate_with(result.func)
return result
class DecoratedRegexURLResolver(RegexURLResolver):
class DecoratedURLResolver(URLResolver):
def resolve(self, *args, **kwargs):
result = super(DecoratedRegexURLResolver, self).resolve(*args, **kwargs)
result = super(DecoratedURLResolver, self).resolve(*args, **kwargs)
if result:
result.func = self._decorate_with(result.func)
return result
def decorated_includes(func, includes, *args, **kwargs):
urlconf_module, app_name, namespace = includes
for item in urlconf_module:
if isinstance(item, RegexURLPattern):
if isinstance(item, URLResolver):
item.__class__ = DecoratedURLResolver
else:
item.__class__ = DecoratedURLPattern
item._decorate_with = func
elif isinstance(item, RegexURLResolver):
item.__class__ = DecoratedRegexURLResolver
item._decorate_with = func
item._decorate_with = func
return urlconf_module, app_name, namespace
def manager_required(function=None, login_url=None):
def check_manager(user):
if user and user.is_staff:
return True
if user and not user.is_anonymous():
if user and not user.is_anonymous:
raise PermissionDenied()
# As the last resort, show the login form
return False