users.py 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. from django.contrib.auth.password_validation import validate_password
  2. from rest_framework import serializers
  3. from desecapi.models import User, validate_domain_name
  4. from .captcha import CaptchaSolutionSerializer
  5. from .domains import DomainSerializer
  6. class EmailSerializer(serializers.Serializer):
  7. email = serializers.EmailField()
  8. class EmailPasswordSerializer(EmailSerializer):
  9. password = serializers.CharField()
  10. class ChangeEmailSerializer(serializers.Serializer):
  11. new_email = serializers.EmailField()
  12. def validate_new_email(self, value):
  13. if value == self.context["request"].user.email:
  14. raise serializers.ValidationError("Email address unchanged.")
  15. return value
  16. class ResetPasswordSerializer(EmailSerializer):
  17. captcha = CaptchaSolutionSerializer(required=True)
  18. class UserSerializer(serializers.ModelSerializer):
  19. class Meta:
  20. model = User
  21. fields = (
  22. "created",
  23. "email",
  24. "id",
  25. "limit_domains",
  26. "outreach_preference",
  27. )
  28. read_only_fields = (
  29. "created",
  30. "email",
  31. "id",
  32. "limit_domains",
  33. )
  34. def validate_password(self, value):
  35. if value is not None:
  36. validate_password(value)
  37. return value
  38. def create(self, validated_data):
  39. return User.objects.create_user(**validated_data)
  40. class RegisterAccountSerializer(UserSerializer):
  41. domain = serializers.CharField(required=False, validators=validate_domain_name)
  42. captcha = CaptchaSolutionSerializer(required=False)
  43. class Meta:
  44. model = UserSerializer.Meta.model
  45. fields = (
  46. "email",
  47. "password",
  48. "domain",
  49. "captcha",
  50. "outreach_preference",
  51. )
  52. extra_kwargs = {
  53. "password": {
  54. "write_only": True, # Do not expose password field
  55. "allow_null": True,
  56. }
  57. }
  58. def validate_domain(self, value):
  59. serializer = DomainSerializer(data=dict(name=value), context=self.context)
  60. try:
  61. serializer.is_valid(raise_exception=True)
  62. except serializers.ValidationError:
  63. raise serializers.ValidationError(
  64. serializer.default_error_messages["name_unavailable"],
  65. code="name_unavailable",
  66. )
  67. return value
  68. def create(self, validated_data):
  69. validated_data.pop("domain", None)
  70. # If validated_data['captcha'] exists, the captcha was also validated, so we can set the user to verified
  71. if "captcha" in validated_data:
  72. validated_data.pop("captcha")
  73. validated_data["needs_captcha"] = False
  74. return super().create(validated_data)