validators.py 3.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. from django.core.exceptions import ValidationError
  2. from django.utils.translation import ugettext as _
  3. from django.utils.translation import ungettext
  4. from misago.categories import THREADS_ROOT_NAME
  5. from misago.categories.models import 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_NAME)
  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_post(post):
  28. post_len = len(post)
  29. if not post_len:
  30. raise ValidationError(_("You have to enter a message."))
  31. if post_len < settings.post_length_min:
  32. message = ungettext(
  33. "Posted message should be at least %(limit_value)s character long (it has %(show_value)s).",
  34. "Posted message should be at least %(limit_value)s characters long (it has %(show_value)s).",
  35. settings.post_length_min
  36. )
  37. raise ValidationError(
  38. message % {'limit_value': settings.post_length_min,
  39. 'show_value': post_len}
  40. )
  41. if settings.post_length_max and post_len > settings.post_length_max:
  42. message = ungettext(
  43. "Posted message cannot be longer than %(limit_value)s character (it has %(show_value)s).",
  44. "Posted message cannot be longer than %(limit_value)s characters (it has %(show_value)s).",
  45. settings.post_length_max
  46. )
  47. raise ValidationError(
  48. message % {'limit_value': settings.post_length_max,
  49. 'show_value': post_len}
  50. )
  51. def validate_title(title):
  52. title_len = len(title)
  53. if not title_len:
  54. raise ValidationError(_("You have to enter thread title."))
  55. if title_len < settings.thread_title_length_min:
  56. message = ungettext(
  57. "Thread title should be at least %(limit_value)s character long (it has %(show_value)s).",
  58. "Thread title should be at least %(limit_value)s characters long (it has %(show_value)s).",
  59. settings.thread_title_length_min
  60. )
  61. raise ValidationError(
  62. message % {'limit_value': settings.thread_title_length_min,
  63. 'show_value': title_len}
  64. )
  65. if title_len > settings.thread_title_length_max:
  66. message = ungettext(
  67. "Thread title cannot be longer than %(limit_value)s character (it has %(show_value)s).",
  68. "Thread title cannot be longer than %(limit_value)s characters (it has %(show_value)s).",
  69. settings.thread_title_length_max
  70. )
  71. raise ValidationError(
  72. message % {'limit_value': settings.thread_title_length_max,
  73. 'show_value': title_len}
  74. )
  75. error_not_sluggable = _("Thread title should contain alpha-numeric characters.")
  76. error_slug_too_long = _("Thread title is too long.")
  77. validate_sluggable(error_not_sluggable, error_slug_too_long)(title)
  78. return title