users.py 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. from django.contrib.auth import get_user_model
  2. from django.core.exceptions import PermissionDenied
  3. from django.utils.translation import ugettext as _
  4. from rest_framework import status, viewsets
  5. from rest_framework.decorators import detail_route
  6. from rest_framework.parsers import JSONParser, MultiPartParser
  7. from rest_framework.response import Response
  8. from misago.users.rest_permissions import (BasePermission,
  9. IsAuthenticatedOrReadOnly, UnbannedAnonOnly)
  10. from misago.users.forms.options import ForumOptionsForm
  11. from misago.users.serializers import UserSerializer
  12. from misago.users.api.userendpoints.avatar import avatar_endpoint
  13. from misago.users.api.userendpoints.create import create_endpoint
  14. from misago.users.api.userendpoints.signature import signature_endpoint
  15. from misago.users.api.userendpoints.username import username_endpoint
  16. class UserViewSetPermission(BasePermission):
  17. def has_permission(self, request, view):
  18. if view.action == 'create':
  19. policy = UnbannedAnonOnly()
  20. else:
  21. policy = IsAuthenticatedOrReadOnly()
  22. return policy.has_permission(request, view)
  23. def allow_self_only(user, pk, message):
  24. if user.is_anonymous():
  25. raise PermissionDenied(
  26. _("You have to sign in to perform this action."))
  27. if user.pk != int(pk):
  28. raise PermissionDenied(message)
  29. class UserViewSet(viewsets.GenericViewSet):
  30. permission_classes = (UserViewSetPermission,)
  31. parser_classes=(JSONParser, MultiPartParser)
  32. serializer_class = UserSerializer
  33. queryset = get_user_model().objects.all()
  34. def list(self, request):
  35. pass
  36. def create(self, request):
  37. return create_endpoint(request)
  38. @detail_route(methods=['get', 'post'])
  39. def avatar(self, request, pk=None):
  40. allow_self_only(
  41. request.user, pk, _("You can't change other users avatars."))
  42. return avatar_endpoint(request)
  43. @detail_route(methods=['post'])
  44. def forum_options(self, request, pk=None):
  45. allow_self_only(
  46. request.user, pk, _("You can't change other users options."))
  47. form = ForumOptionsForm(request.data, instance=request.user)
  48. if form.is_valid():
  49. form.save()
  50. return Response({
  51. 'detail': _("Your forum options have been changed.")
  52. })
  53. else:
  54. return Response(form.errors, status=status.HTTP_400_BAD_REQUEST)
  55. @detail_route(methods=['get', 'post'])
  56. def username(self, request, pk=None):
  57. allow_self_only(
  58. request.user, pk, _("You can't change other users names."))
  59. return username_endpoint(request)
  60. @detail_route(methods=['get', 'post'])
  61. def signature(self, request, pk=None):
  62. allow_self_only(
  63. request.user, pk, _("You can't change other users signatures."))
  64. return signature_endpoint(request)