register.py 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. from rest_framework import serializers
  2. from django.contrib.auth import get_user_model
  3. from django.contrib.auth.password_validation import validate_password
  4. from django.core.exceptions import ValidationError
  5. from django.utils.translation import ugettext as _
  6. from misago.users import captcha, validators
  7. from misago.users.bans import get_email_ban, get_ip_ban, get_username_ban
  8. UserModel = get_user_model()
  9. __all__ = ['RegisterUserSerializer']
  10. class RegisterUserSerializer(serializers.Serializer):
  11. username = serializers.CharField(
  12. max_length=255,
  13. validators=[validators.validate_username],
  14. )
  15. email = serializers.CharField(
  16. max_length=255,
  17. validators=[validators.validate_email],
  18. )
  19. password = serializers.CharField(
  20. max_length=255,
  21. trim_whitespace=False,
  22. )
  23. def validate_username(self, data):
  24. ban = get_username_ban(data, registration_only=True)
  25. if ban:
  26. if ban.user_message:
  27. raise ValidationError(ban.user_message)
  28. else:
  29. raise ValidationError(_("This usernane is not allowed."))
  30. return data
  31. def validate_email(self, data):
  32. ban = get_email_ban(data, registration_only=True)
  33. if ban:
  34. if ban.user_message:
  35. raise ValidationError(ban.user_message)
  36. else:
  37. raise ValidationError(_("This e-mail address is not allowed."))
  38. return data
  39. def validate(self, data):
  40. request = self.context['request']
  41. ban = get_ip_ban(request.user_ip, registration_only=True)
  42. if ban:
  43. if ban.user_message:
  44. raise ValidationError(ban.user_message)
  45. else:
  46. raise ValidationError(_("New registrations from this IP address are not allowed."))
  47. self._added_errors = {}
  48. try:
  49. self.full_clean_password(data)
  50. except ValidationError as e:
  51. self._added_errors['password'] = [e]
  52. validators.validate_new_registration(request, self, data)
  53. if self._added_errors:
  54. # fail registration with additional errors
  55. raise serializers.ValidationError(self._added_errors)
  56. # run test for captcha
  57. try:
  58. captcha.test_request(self.context['request'])
  59. except ValidationError as e:
  60. raise serializers.ValidationError({'captcha': [e.args[0]]})
  61. return data
  62. def full_clean_password(self, data):
  63. if data.get('password'):
  64. validate_password(
  65. data['password'],
  66. user=UserModel(
  67. username=data.get('username'),
  68. email=data.get('email'),
  69. ),
  70. )
  71. def add_error(self, field, error):
  72. """we are using custom implementation so custom validators work"""
  73. self._added_errors.setdefault(field, []).append(error)