validators.py 3.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  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.models import THREADS_ROOT_NAME, Category
  5. from misago.categories.permissions import can_browse_category, can_see_category
  6. from misago.conf import settings
  7. from misago.core.validators import validate_sluggable
  8. from .threadtypes import trees_map
  9. def validate_category(user, category_id, allow_root=False):
  10. try:
  11. threads_tree_id = trees_map.get_tree_id_for_root(THREADS_ROOT_NAME)
  12. category = Category.objects.get(
  13. tree_id=threads_tree_id,
  14. id=category_id,
  15. )
  16. except Category.DoesNotExist:
  17. category = None
  18. # Skip ACL validation for root category?
  19. if allow_root and category and not category.level:
  20. return category
  21. if not category or not can_see_category(user, category):
  22. raise ValidationError(_("Requested category could not be found."))
  23. if not can_browse_category(user, category):
  24. raise ValidationError(_("You don't have permission to access this category."))
  25. return category
  26. def validate_post(post):
  27. post_len = len(post)
  28. if not post_len:
  29. raise ValidationError(_("You have to enter a message."))
  30. if post_len < settings.post_length_min:
  31. message = ungettext(
  32. "Posted message should be at least %(limit_value)s character long (it has %(show_value)s).",
  33. "Posted message should be at least %(limit_value)s characters long (it has %(show_value)s).",
  34. settings.post_length_min)
  35. raise ValidationError(message % {
  36. 'limit_value': settings.post_length_min,
  37. 'show_value': post_len
  38. })
  39. if settings.post_length_max and post_len > settings.post_length_max:
  40. message = ungettext(
  41. "Posted message cannot be longer than %(limit_value)s character (it has %(show_value)s).",
  42. "Posted message cannot be longer than %(limit_value)s characters (it has %(show_value)s).",
  43. settings.post_length_max)
  44. raise ValidationError(message % {
  45. 'limit_value': settings.post_length_max,
  46. 'show_value': post_len
  47. })
  48. def validate_title(title):
  49. title_len = len(title)
  50. if not title_len:
  51. raise ValidationError(_("You have to enter thread title."))
  52. if title_len < settings.thread_title_length_min:
  53. message = ungettext(
  54. "Thread title should be at least %(limit_value)s character long (it has %(show_value)s).",
  55. "Thread title should be at least %(limit_value)s characters long (it has %(show_value)s).",
  56. settings.thread_title_length_min)
  57. raise ValidationError(message % {
  58. 'limit_value': settings.thread_title_length_min,
  59. 'show_value': title_len
  60. })
  61. if title_len > settings.thread_title_length_max:
  62. message = ungettext(
  63. "Thread title cannot be longer than %(limit_value)s character (it has %(show_value)s).",
  64. "Thread title cannot be longer than %(limit_value)s characters (it has %(show_value)s).",
  65. settings.thread_title_length_max)
  66. raise ValidationError(message % {
  67. 'limit_value': settings.thread_title_length_max,
  68. 'show_value': title_len
  69. })
  70. error_not_sluggable = _("Thread title should contain alpha-numeric characters.")
  71. error_slug_too_long = _("Thread title is too long.")
  72. validate_sluggable(error_not_sluggable, error_slug_too_long)(title)
  73. return title