signature.py 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. from rest_framework import status
  2. from rest_framework.response import Response
  3. from django.core.exceptions import PermissionDenied
  4. from django.utils.translation import ugettext as _
  5. from misago.conf import settings
  6. from misago.core.utils import format_plaintext_for_html
  7. from misago.users.serializers import EditSignatureSerializer
  8. from misago.users.signatures import is_user_signature_valid, set_user_signature
  9. def signature_endpoint(request):
  10. user = request.user
  11. if not user.acl_cache['can_have_signature']:
  12. raise PermissionDenied(_("You don't have permission to change signature."))
  13. if user.is_signature_locked:
  14. if user.signature_lock_user_message:
  15. reason = format_plaintext_for_html(user.signature_lock_user_message)
  16. else:
  17. reason = None
  18. return Response({
  19. 'detail': _("Your signature is locked. You can't change it."),
  20. 'reason': reason
  21. },
  22. status=status.HTTP_403_FORBIDDEN)
  23. if request.method == 'POST':
  24. return edit_signature(request, user)
  25. return get_signature_options(user)
  26. def get_signature_options(user):
  27. options = {
  28. 'signature': None,
  29. 'limit': settings.signature_length_max,
  30. }
  31. if user.signature:
  32. options['signature'] = {
  33. 'plain': user.signature,
  34. 'html': user.signature_parsed,
  35. }
  36. if not is_user_signature_valid(user):
  37. options['signature']['html'] = None
  38. return Response(options)
  39. def edit_signature(request, user):
  40. serializer = EditSignatureSerializer(user, data=request.data)
  41. if serializer.is_valid():
  42. set_user_signature(request, user, serializer.validated_data['signature'])
  43. user.save(update_fields=['signature', 'signature_parsed', 'signature_checksum'])
  44. return get_signature_options(user)
  45. else:
  46. return Response({
  47. 'detail': serializer.errors['non_field_errors'][0]
  48. },
  49. status=status.HTTP_400_BAD_REQUEST)