users.py 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  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 = ('created', 'email', 'id', 'limit_domains', 'outreach_preference',)
  22. read_only_fields = ('created', 'email', 'id', 'limit_domains',)
  23. def validate_password(self, value):
  24. if value is not None:
  25. validate_password(value)
  26. return value
  27. def create(self, validated_data):
  28. return User.objects.create_user(**validated_data)
  29. class RegisterAccountSerializer(UserSerializer):
  30. domain = serializers.CharField(required=False, validators=validate_domain_name)
  31. captcha = CaptchaSolutionSerializer(required=False)
  32. class Meta:
  33. model = UserSerializer.Meta.model
  34. fields = ('email', 'password', 'domain', 'captcha', 'outreach_preference',)
  35. extra_kwargs = {
  36. 'password': {
  37. 'write_only': True, # Do not expose password field
  38. 'allow_null': True,
  39. }
  40. }
  41. def validate_domain(self, value):
  42. serializer = DomainSerializer(data=dict(name=value), context=self.context)
  43. try:
  44. serializer.is_valid(raise_exception=True)
  45. except serializers.ValidationError:
  46. raise serializers.ValidationError(serializer.default_error_messages['name_unavailable'],
  47. code='name_unavailable')
  48. return value
  49. def create(self, validated_data):
  50. validated_data.pop('domain', None)
  51. # If validated_data['captcha'] exists, the captcha was also validated, so we can set the user to verified
  52. if 'captcha' in validated_data:
  53. validated_data.pop('captcha')
  54. validated_data['needs_captcha'] = False
  55. return super().create(validated_data)