validators.py 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  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. raise ValidationError(message % {
  37. 'limit_value': settings.post_length_min,
  38. 'show_value': post_len
  39. })
  40. if settings.post_length_max and post_len > settings.post_length_max:
  41. message = ungettext(
  42. "Posted message cannot be longer than %(limit_value)s character (it has %(show_value)s).",
  43. "Posted message cannot be longer than %(limit_value)s characters (it has %(show_value)s).",
  44. settings.post_length_max)
  45. raise ValidationError(message % {
  46. 'limit_value': settings.post_length_max,
  47. 'show_value': post_len
  48. })
  49. def validate_title(title):
  50. title_len = len(title)
  51. if not title_len:
  52. raise ValidationError(_("You have to enter thread title."))
  53. if title_len < settings.thread_title_length_min:
  54. message = ungettext(
  55. "Thread title should be at least %(limit_value)s character long (it has %(show_value)s).",
  56. "Thread title should be at least %(limit_value)s characters long (it has %(show_value)s).",
  57. settings.thread_title_length_min)
  58. raise ValidationError(message % {
  59. 'limit_value': settings.thread_title_length_min,
  60. 'show_value': title_len
  61. })
  62. if title_len > settings.thread_title_length_max:
  63. message = ungettext(
  64. "Thread title cannot be longer than %(limit_value)s character (it has %(show_value)s).",
  65. "Thread title cannot be longer than %(limit_value)s characters (it has %(show_value)s).",
  66. settings.thread_title_length_max)
  67. raise ValidationError(message % {
  68. 'limit_value': settings.thread_title_length_max,
  69. 'show_value': title_len
  70. })
  71. error_not_sluggable = _("Thread title should contain alpha-numeric characters.")
  72. error_slug_too_long = _("Thread title is too long.")
  73. validate_sluggable(error_not_sluggable, error_slug_too_long)(title)
  74. return title