reply.py 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. from django.utils.translation import ugettext_lazy as _, ungettext
  2. from misago.conf import settings
  3. from misago.core import forms
  4. from misago.core.validators import validate_sluggable
  5. from misago.markup import common_flavour
  6. class ReplyForm(forms.Form):
  7. is_main = True
  8. legend = _("Reply")
  9. template = "misago/threads/replyform.html"
  10. js_template = "misago/threads/replyform_js.html"
  11. post = forms.CharField(label=_("Message body"), required=False)
  12. def __init__(self, post=None, *args, **kwargs):
  13. self.post_instance = post
  14. self.parsing_result = {}
  15. super(ReplyForm, self).__init__(*args, **kwargs)
  16. def validate_post(self, post):
  17. post_len = len(post)
  18. if not post_len:
  19. raise forms.ValidationError(_("Enter message."))
  20. if post_len < settings.post_length_min:
  21. message = ungettext(
  22. "Posted message should be at least %(limit)s character long.",
  23. "Posted message should be at least %(limit)s characters long.",
  24. settings.post_length_min)
  25. message = message % {'limit': settings.post_length_min}
  26. raise forms.ValidationError(message)
  27. if settings.post_length_max and post_len > settings.post_length_max:
  28. message = ungettext(
  29. "Posted message can't be longer than %(limit)s character.",
  30. "Posted message can't be longer than %(limit)s characters.",
  31. settings.post_length_max,)
  32. message = message % {'limit': settings.post_length_max}
  33. raise forms.ValidationError(message)
  34. self.parsing_result = common_flavour(post, self.post_instance.poster)
  35. self.post_instance.original = self.parsing_result['original_text']
  36. self.post_instance.parsed = self.parsing_result['parsed_text']
  37. def validate_data(self, data):
  38. self.validate_post(data.get('post', ''))
  39. def clean(self):
  40. data = super(ReplyForm, self).clean()
  41. self.validate_data(data)
  42. return data
  43. class ThreadForm(ReplyForm):
  44. legend = _("Thread ")
  45. title = forms.CharField(label=_("Thread title"), required=False)
  46. def __init__(self, thread=None, *args, **kwargs):
  47. self.thread_instance = thread
  48. super(ThreadForm, self).__init__(*args, **kwargs)
  49. def validate_title(self, title):
  50. title_len = len(title)
  51. if not title_len:
  52. raise forms.ValidationError(_("Enter thread title."))
  53. if title_len < settings.thread_title_length_min:
  54. message = ungettext(
  55. "Thread title should be at least %(limit)s character long.",
  56. "Thread title should be at least %(limit)s characters long.",
  57. settings.thread_title_length_min)
  58. message = message % {'limit': settings.thread_title_length_min}
  59. raise forms.ValidationError(message)
  60. if title_len > settings.thread_title_length_max:
  61. message = ungettext(
  62. "Thread title can't be longer than %(limit)s character.",
  63. "Thread title can't be longer than %(limit)s characters.",
  64. settings.thread_title_length_max,)
  65. message = message % {'limit': settings.thread_title_length_max}
  66. raise forms.ValidationError(message)
  67. error_not_sluggable = _("Thread title should contain "
  68. "alpha-numeric characters.")
  69. error_slug_too_long = _("Thread title is too long.")
  70. slug_validator = validate_sluggable(error_not_sluggable,
  71. error_slug_too_long)
  72. slug_validator(title)
  73. def validate_data(self, data):
  74. errors = []
  75. if not data.get('title') and not data.get('post'):
  76. raise forms.ValidationError(_("Enter thread title and message."))
  77. try:
  78. self.validate_title(data.get('title', ''))
  79. except forms.ValidationError as e:
  80. errors.append(e)
  81. try:
  82. self.validate_post(data.get('post', ''))
  83. except forms.ValidationError as e:
  84. errors.append(e)
  85. if errors:
  86. raise forms.ValidationError(errors)
  87. class PrefixedThreadForm(ThreadForm):
  88. pass