posting.py 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  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.markup import common_flavour
  5. from misago.threads.validators import validate_title
  6. class ReplyForm(forms.Form):
  7. is_main = True
  8. legend = _("Reply")
  9. template = "misago/posting/replyform.html"
  10. js_template = "misago/posting/replyform_js.html"
  11. post = forms.CharField(label=_("Message body"), required=False)
  12. def __init__(self, post=None, request=None, *args, **kwargs):
  13. self.request = request
  14. self.post_instance = post
  15. self.parsing_result = {}
  16. super(ReplyForm, self).__init__(*args, **kwargs)
  17. def validate_post(self, post):
  18. if self.post_instance.original != post:
  19. self._validate_post(post)
  20. self.parse_post(post)
  21. def _validate_post(self, post):
  22. post_len = len(post)
  23. if not post_len:
  24. raise forms.ValidationError(_("Enter message."))
  25. if post_len < settings.post_length_min:
  26. message = ungettext(
  27. "Posted message should be at least %(limit)s character long.",
  28. "Posted message should be at least %(limit)s characters long.",
  29. settings.post_length_min)
  30. message = message % {'limit': settings.post_length_min}
  31. raise forms.ValidationError(message)
  32. if settings.post_length_max and post_len > settings.post_length_max:
  33. message = ungettext(
  34. "Posted message can't be longer than %(limit)s character.",
  35. "Posted message can't be longer than %(limit)s characters.",
  36. settings.post_length_max,)
  37. message = message % {'limit': settings.post_length_max}
  38. raise forms.ValidationError(message)
  39. def parse_post(self, post):
  40. self.parsing_result = common_flavour(
  41. self.request, self.post_instance.poster, post)
  42. self.post_instance.original = self.parsing_result['original_text']
  43. self.post_instance.parsed = self.parsing_result['parsed_text']
  44. def validate_data(self, data):
  45. self.validate_post(data.get('post', ''))
  46. def clean(self):
  47. data = super(ReplyForm, self).clean()
  48. self.validate_data(data)
  49. return data
  50. class ThreadForm(ReplyForm):
  51. legend = _("Thread ")
  52. title = forms.CharField(label=_("Thread title"), required=False)
  53. def __init__(self, thread=None, *args, **kwargs):
  54. self.thread_instance = thread
  55. super(ThreadForm, self).__init__(*args, **kwargs)
  56. def validate_data(self, data):
  57. errors = []
  58. if not data.get('title') and not data.get('post'):
  59. raise forms.ValidationError(_("Enter thread title and message."))
  60. try:
  61. validate_title(data.get('title', ''))
  62. except forms.ValidationError as e:
  63. errors.append(e)
  64. try:
  65. self.validate_post(data.get('post', ''))
  66. except forms.ValidationError as e:
  67. errors.append(e)
  68. if errors:
  69. raise forms.ValidationError(errors)
  70. class ThreadLabelFormBase(forms.Form):
  71. is_supporting = True
  72. location = 'after_title'
  73. template = "misago/posting/threadlabelform.html"
  74. def ThreadLabelForm(*args, **kwargs):
  75. labels = kwargs.pop('labels')
  76. choices = [(0, _("No label"))]
  77. choices.extend([(label.pk, label.name ) for label in labels])
  78. field = forms.TypedChoiceField(
  79. label=_("Thread label"),
  80. coerce=int,
  81. choices=choices)
  82. FormType = type("ThreadLabelFormFinal",
  83. (ThreadLabelFormBase,),
  84. {'label': field})
  85. return FormType(*args, **kwargs)
  86. class ThreadPinForm(forms.Form):
  87. is_supporting = True
  88. location = 'lefthand'
  89. template = "misago/posting/threadpinform.html"
  90. is_pinned = forms.YesNoSwitch(
  91. label=_("Pin thread"),
  92. yes_label=_("Pinned thread"),
  93. no_label=_("Unpinned thread"))
  94. class ThreadCloseForm(forms.Form):
  95. is_supporting = True
  96. location = 'lefthand'
  97. template = "misago/posting/threadcloseform.html"
  98. is_closed = forms.YesNoSwitch(
  99. label=_("Close thread"),
  100. yes_label=_("Closed thread"),
  101. no_label=_("Open thread"))