signature.py 2.1 KB

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