posting.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  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, *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_data(self, data):
  50. errors = []
  51. if not data.get('title') and not data.get('post'):
  52. raise forms.ValidationError(_("Enter thread title and message."))
  53. try:
  54. validate_title(data.get('title', ''))
  55. except forms.ValidationError as e:
  56. errors.append(e)
  57. try:
  58. self.validate_post(data.get('post', ''))
  59. except forms.ValidationError as e:
  60. errors.append(e)
  61. if errors:
  62. raise forms.ValidationError(errors)
  63. class ThreadLabelFormBase(forms.Form):
  64. is_supporting = True
  65. legend = _("Label")
  66. template = "misago/posting/threadlabelform.html"
  67. def ThreadLabelForm(*args, **kwargs):
  68. labels = kwargs.pop('labels')
  69. choices = [(0, _("No label"))]
  70. choices.extend([(label.pk, label.name ) for label in labels])
  71. field = forms.TypedChoiceField(
  72. label=_("Thread label"),
  73. coerce=int,
  74. choices=choices)
  75. FormType = type("ThreadLabelFormFinal",
  76. (ThreadLabelFormBase,),
  77. {'label': field})
  78. return FormType(*args, **kwargs)
  79. class ThreadWeightForm(forms.Form):
  80. is_supporting = True
  81. legend = _("Weight")
  82. template = "misago/posting/threadweightform.html"
  83. weight = forms.TypedChoiceField(label=_("Thread weight"), initial=0,
  84. choices=(
  85. (0, _("Standard")),
  86. (1, _("Pinned")),
  87. (2, _("Announcement")),
  88. ))
  89. class ThreadCloseForm(forms.Form):
  90. is_supporting = True
  91. legend = _("Close thread")
  92. template = "misago/posting/threadcloseform.html"
  93. is_closed = forms.YesNoSwitch(label=_("Close thread"), initial=0)