validators.py 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  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. except User.DoesNotExist:
  16. pass
  17. else:
  18. if not exclude or user.pk != exclude.pk:
  19. raise ValidationError(_("This e-mail address is not available."))
  20. def validate_email_banned(value):
  21. from misago.users.models import Ban
  22. email_ban = Ban.objects.find_ban(email=value)
  23. if email_ban:
  24. if email_ban.user_message:
  25. raise ValidationError(email_ban.user_message)
  26. else:
  27. raise ValidationError(_("This e-mail address is not allowed."))
  28. def validate_email(value, exclude=None):
  29. """shortcut function that does complete validation of email"""
  30. validate_email_content(value)
  31. validate_email_available(value, exclude)
  32. validate_email_banned(value)
  33. """
  34. Password validators
  35. """
  36. def validate_password(value):
  37. if len(value) < settings.password_length_min:
  38. message = ungettext(
  39. 'Valid password must be at least one character long.',
  40. 'Valid password must be at least %(length)d characters long.',
  41. settings.password_length_min)
  42. message = message % {'length': settings.password_length_min}
  43. raise ValidationError(message)
  44. """
  45. Username validators
  46. """
  47. def validate_username_available(value, exclude=None):
  48. User = get_user_model()
  49. try:
  50. user = User.objects.get_by_username(value)
  51. except User.DoesNotExist:
  52. pass
  53. else:
  54. if not exclude or user.pk != exclude.pk:
  55. raise ValidationError(_("This username is not available."))
  56. def validate_username_banned(value):
  57. from misago.users.models import Ban
  58. username_ban = Ban.objects.find_ban(username=value)
  59. if username_ban:
  60. if username_ban.user_message:
  61. raise ValidationError(username_ban.user_message)
  62. else:
  63. raise ValidationError(_("This username is not allowed."))
  64. def validate_username_content(value):
  65. if not USERNAME_RE.match(value):
  66. raise ValidationError(
  67. _("Username can only contain latin alphabet letters and digits."))
  68. def validate_username_length(value):
  69. if len(value) < settings.username_length_min:
  70. message = ungettext(
  71. 'Username must be at least one character long.',
  72. 'Username must be at least %(length)d characters long.',
  73. settings.username_length_min)
  74. message = message % {'length': settings.username_length_min}
  75. raise ValidationError(message)
  76. if len(value) > settings.username_length_max:
  77. message = ungettext(
  78. "Username cannot be longer than one characters.",
  79. "Username cannot be longer than %(length)d characters.",
  80. settings.username_length_max)
  81. message = message % {'length': settings.username_length_max}
  82. raise ValidationError(message)
  83. def validate_username(value, exclude=None):
  84. """shortcut function that does complete validation of username"""
  85. validate_username_content(value)
  86. validate_username_length(value)
  87. validate_username_available(value, exclude)
  88. validate_username_banned(value)