validators.py 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  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. from misago.users.bans import get_email_ban, get_username_ban
  8. USERNAME_RE = re.compile(r'^[0-9a-z]+$', re.IGNORECASE)
  9. """
  10. Email validators
  11. """
  12. def validate_email_available(value, exclude=None):
  13. User = get_user_model()
  14. try:
  15. user = User.objects.get_by_email(value)
  16. if not exclude or user.pk != exclude.pk:
  17. raise ValidationError(_("This e-mail address is not available."))
  18. except User.DoesNotExist:
  19. pass
  20. def validate_email_banned(value):
  21. ban = get_email_ban(value)
  22. if ban:
  23. if ban.user_message:
  24. raise ValidationError(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. ban = get_username_ban(value)
  56. if ban:
  57. if ban.user_message:
  58. raise ValidationError(ban.user_message)
  59. else:
  60. raise ValidationError(_("This username is not allowed."))
  61. def validate_username_content(value):
  62. if not USERNAME_RE.match(value):
  63. raise ValidationError(
  64. _("Username can only contain latin alphabet letters and digits."))
  65. def validate_username_length(value):
  66. if len(value) < settings.username_length_min:
  67. message = ungettext(
  68. 'Username must be at least one character long.',
  69. 'Username must be at least %(length)d characters long.',
  70. settings.username_length_min)
  71. message = message % {'length': settings.username_length_min}
  72. raise ValidationError(message)
  73. if len(value) > settings.username_length_max:
  74. message = ungettext(
  75. "Username cannot be longer than one characters.",
  76. "Username cannot be longer than %(length)d characters.",
  77. settings.username_length_max)
  78. message = message % {'length': settings.username_length_max}
  79. raise ValidationError(message)
  80. def validate_username(value, exclude=None):
  81. """shortcut function that does complete validation of username"""
  82. validate_username_content(value)
  83. validate_username_length(value)
  84. validate_username_available(value, exclude)
  85. validate_username_banned(value)