validators.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. from django.core.exceptions import ValidationError
  2. from django.utils.module_loading import import_string
  3. from django.utils.translation import ugettext as _
  4. from django.utils.translation import ungettext
  5. from misago.categories.models import THREADS_ROOT, Category
  6. from misago.categories.permissions import can_browse_category, can_see_category
  7. from misago.conf import settings
  8. from misago.core.validators import validate_sluggable
  9. from .threadtypes import trees_map
  10. def validate_category(user, category_id, allow_root=False):
  11. try:
  12. threads_tree_id = trees_map.get_tree_id_for_root(THREADS_ROOT)
  13. category = Category.objects.get(
  14. tree_id=threads_tree_id,
  15. id=category_id,
  16. )
  17. except Category.DoesNotExist:
  18. category = None
  19. # Skip ACL validation for root category?
  20. if allow_root and category and not category.level:
  21. return category
  22. if not category or not can_see_category(user, category):
  23. raise ValidationError(_("Requested category could not be found."))
  24. if not can_browse_category(user, category):
  25. raise ValidationError(_("You don't have permission to access this category."))
  26. return category
  27. def validate_title(title):
  28. title_len = len(title)
  29. if not title_len:
  30. raise ValidationError(_("You have to enter thread title."))
  31. if title_len < settings.thread_title_length_min:
  32. message = ungettext(
  33. "Thread title should be at least %(limit_value)s character long (it has %(show_value)s).",
  34. "Thread title should be at least %(limit_value)s characters long (it has %(show_value)s).",
  35. settings.thread_title_length_min,
  36. )
  37. raise ValidationError(
  38. message % {
  39. 'limit_value': settings.thread_title_length_min,
  40. 'show_value': title_len,
  41. }
  42. )
  43. if title_len > settings.thread_title_length_max:
  44. message = ungettext(
  45. "Thread title cannot be longer than %(limit_value)s character (it has %(show_value)s).",
  46. "Thread title cannot be longer than %(limit_value)s characters (it has %(show_value)s).",
  47. settings.thread_title_length_max,
  48. )
  49. raise ValidationError(
  50. message % {
  51. 'limit_value': settings.thread_title_length_max,
  52. 'show_value': title_len,
  53. }
  54. )
  55. error_not_sluggable = _("Thread title should contain alpha-numeric characters.")
  56. error_slug_too_long = _("Thread title is too long.")
  57. validate_sluggable(error_not_sluggable, error_slug_too_long)(title)
  58. return title
  59. def validate_post_length(post):
  60. post_len = len(post)
  61. if not post_len:
  62. raise ValidationError(_("You have to enter a message."))
  63. if post_len < settings.post_length_min:
  64. message = ungettext(
  65. "Posted message should be at least %(limit_value)s character long (it has %(show_value)s).",
  66. "Posted message should be at least %(limit_value)s characters long (it has %(show_value)s).",
  67. settings.post_length_min,
  68. )
  69. raise ValidationError(
  70. message % {
  71. 'limit_value': settings.post_length_min,
  72. 'show_value': post_len,
  73. }
  74. )
  75. if settings.post_length_max and post_len > settings.post_length_max:
  76. message = ungettext(
  77. "Posted message cannot be longer than %(limit_value)s character (it has %(show_value)s).",
  78. "Posted message cannot be longer than %(limit_value)s characters (it has %(show_value)s).",
  79. settings.post_length_max,
  80. )
  81. raise ValidationError(
  82. message % {
  83. 'limit_value': settings.post_length_max,
  84. 'show_value': post_len,
  85. }
  86. )
  87. # Post validation framework
  88. validators_list = settings.MISAGO_POST_VALIDATORS
  89. POST_VALIDATORS = list(map(import_string, validators_list))
  90. def validate_post(context, data, validators=None):
  91. validators = validators or POST_VALIDATORS
  92. for validator in validators:
  93. data = validator(context, data) or data
  94. return data