signature.py 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. from django.core.exceptions import PermissionDenied
  2. from django.utils.translation import gettext as _
  3. from rest_framework import status
  4. from rest_framework.response import Response
  5. from ....core.utils import format_plaintext_for_html
  6. from ...serializers import EditSignatureSerializer
  7. from ...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 = {"signature": None, "limit": settings.signature_length_max}
  29. if user.signature:
  30. options["signature"] = {"plain": user.signature, "html": user.signature_parsed}
  31. if not is_user_signature_valid(user):
  32. options["signature"]["html"] = None
  33. return Response(options)
  34. def edit_signature(request, user):
  35. serializer = EditSignatureSerializer(
  36. user, data=request.data, context={"settings": request.settings}
  37. )
  38. if serializer.is_valid():
  39. signature = serializer.validated_data["signature"]
  40. set_user_signature(request, user, request.user_acl, signature)
  41. user.save(update_fields=["signature", "signature_parsed", "signature_checksum"])
  42. return get_signature_options(request.settings, user)
  43. return Response(
  44. {"detail": serializer.errors["non_field_errors"][0]},
  45. status=status.HTTP_400_BAD_REQUEST,
  46. )