validators.py 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. import re
  2. from django.core.exceptions import ValidationError
  3. from django.core.validators import validate_email as validate_email_content
  4. from django.utils.translation import ungettext, ugettext_lazy as _
  5. from django.contrib.auth import get_user_model
  6. from misago.conf import settings
  7. USERNAME_RE = re.compile(r'^[0-9a-z]+$', re.IGNORECASE)
  8. """
  9. Email validators
  10. """
  11. def validate_email_available(value, exclude=None):
  12. User = get_user_model()
  13. try:
  14. user = User.objects.get_by_email(value)
  15. if not exclude or user.pk != exclude.pk:
  16. raise ValidationError(_("This e-mail address is not available."))
  17. except User.DoesNotExist:
  18. pass
  19. def validate_email_banned(value):
  20. from misago.users.models import Ban
  21. email_ban = Ban.objects.find_ban(email=value)
  22. if email_ban:
  23. if email_ban.user_message:
  24. raise ValidationError(email_ban.user_message)
  25. else:
  26. raise ValidationError(_("This e-mail address is not allowed."))
  27. def validate_email(value, exclude=None):
  28. """shortcut function that does complete validation of email"""
  29. validate_email_content(value)
  30. validate_email_available(value, exclude)
  31. validate_email_banned(value)
  32. """
  33. Password validators
  34. """
  35. def validate_password(value):
  36. if len(value) < settings.password_length_min:
  37. message = ungettext(
  38. 'Valid password must be at least one character long.',
  39. 'Valid password must be at least %(length)d characters long.',
  40. settings.password_length_min)
  41. message = message % {'length': settings.password_length_min}
  42. raise ValidationError(message)
  43. """
  44. Username validators
  45. """
  46. def validate_username_available(value, exclude=None):
  47. User = get_user_model()
  48. try:
  49. user = User.objects.get_by_username(value)
  50. if not exclude or user.pk != exclude.pk:
  51. raise ValidationError(_("This username is not available."))
  52. except User.DoesNotExist:
  53. pass
  54. def validate_username_banned(value):
  55. from misago.users.models import Ban
  56. username_ban = Ban.objects.find_ban(username=value)
  57. if username_ban:
  58. if username_ban.user_message:
  59. raise ValidationError(username_ban.user_message)
  60. else:
  61. raise ValidationError(_("This username is not allowed."))
  62. def validate_username_content(value):
  63. if not USERNAME_RE.match(value):
  64. raise ValidationError(
  65. _("Username can only contain latin alphabet letters and digits."))
  66. def validate_username_length(value):
  67. if len(value) < settings.username_length_min:
  68. message = ungettext(
  69. 'Username must be at least one character long.',
  70. 'Username must be at least %(length)d characters long.',
  71. settings.username_length_min)
  72. message = message % {'length': settings.username_length_min}
  73. raise ValidationError(message)
  74. if len(value) > settings.username_length_max:
  75. message = ungettext(
  76. "Username cannot be longer than one characters.",
  77. "Username cannot be longer than %(length)d characters.",
  78. settings.username_length_max)
  79. message = message % {'length': settings.username_length_max}
  80. raise ValidationError(message)
  81. def validate_username(value, exclude=None):
  82. """shortcut function that does complete validation of username"""
  83. validate_username_content(value)
  84. validate_username_length(value)
  85. validate_username_available(value, exclude)
  86. validate_username_banned(value)