rest_permissions.py 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. from rest_framework.permissions import BasePermission, AllowAny, SAFE_METHODS
  2. from django.core.exceptions import PermissionDenied
  3. from django.utils.translation import ugettext as _
  4. from misago.users.bans import get_request_ip_ban
  5. __all__ = [
  6. 'AllowAny',
  7. 'IsAuthenticatedOrReadOnly',
  8. 'UnbannedOnly',
  9. 'UnbannedAnonOnly'
  10. ]
  11. class IsAuthenticatedOrReadOnly(BasePermission):
  12. def has_permission(self, request, view):
  13. if request.user.is_anonymous() and request.method not in SAFE_METHODS:
  14. raise PermissionDenied(
  15. _("This action is not available to guests."))
  16. else:
  17. return True
  18. class UnbannedOnly(BasePermission):
  19. def is_request_banned(self, request):
  20. ban = get_request_ip_ban(request)
  21. if ban:
  22. raise PermissionDenied(
  23. _("Your IP address is banned from performing this action."),
  24. {'ban': ban.get_serialized_message()})
  25. def has_permission(self, request, view):
  26. if request.user.is_authenticated():
  27. raise PermissionDenied(
  28. _("This action is not available to signed in users."))
  29. return True
  30. class UnbannedAnonOnly(UnbannedOnly):
  31. def has_permission(self, request, view):
  32. if request.user.is_authenticated():
  33. raise PermissionDenied(
  34. _("This action is not available to signed in users."))
  35. self.is_request_banned(request)
  36. return True