decorators.py 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. from functools import wraps
  2. from django.conf import settings
  3. from django.core.exceptions import PermissionDenied
  4. from django.shortcuts import redirect
  5. from django.utils.translation import gettext as _
  6. from ..core.exceptions import Banned
  7. from .bans import get_request_ip_ban
  8. from .models import Ban
  9. def deny_authenticated(f):
  10. @wraps(f)
  11. def decorator(request, *args, **kwargs):
  12. if request.user.is_authenticated:
  13. raise PermissionDenied(_("This page is not available to signed in users."))
  14. else:
  15. return f(request, *args, **kwargs)
  16. return decorator
  17. def deny_guests(f):
  18. @wraps(f)
  19. def decorator(request, *args, **kwargs):
  20. if request.user.is_anonymous:
  21. if request.GET.get("ref") == "login":
  22. return redirect(settings.LOGIN_REDIRECT_URL)
  23. raise PermissionDenied(_("You have to sign in to access this page."))
  24. else:
  25. return f(request, *args, **kwargs)
  26. return decorator
  27. def deny_banned_ips(f):
  28. @wraps(f)
  29. def decorator(request, *args, **kwargs):
  30. ban = get_request_ip_ban(request)
  31. if ban:
  32. hydrated_ban = Ban(
  33. check_type=Ban.IP,
  34. user_message=ban["message"],
  35. expires_on=ban["expires_on"],
  36. )
  37. raise Banned(hydrated_ban)
  38. else:
  39. return f(request, *args, **kwargs)
  40. return decorator