forms.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. from django import forms
  2. from django.utils.translation import ungettext, ugettext_lazy as _
  3. from misago.forms import Form
  4. from misago.utils import slugify
  5. class ThreadNameMixin(object):
  6. def clean_thread_name(self):
  7. data = self.cleaned_data['thread_name']
  8. slug = slugify(data)
  9. if len(slug) < self.request.settings['thread_name_min']:
  10. raise forms.ValidationError(ungettext(
  11. "Thread name must contain at least one alpha-numeric character.",
  12. "Thread name must contain at least %(count)d alpha-numeric characters.",
  13. self.request.settings['thread_name_min']
  14. ) % {'count': self.request.settings['thread_name_min']})
  15. return data
  16. class PostForm(Form, ThreadNameMixin):
  17. thread_name = forms.CharField(max_length=255)
  18. post = forms.CharField(widget=forms.Textarea)
  19. def __init__(self, data=None, file=None, request=None, mode=None, *args, **kwargs):
  20. self.mode = mode
  21. super(PostForm, self).__init__(data, file, request=request, *args, **kwargs)
  22. def finalize_form(self):
  23. self.layout = [
  24. [
  25. None,
  26. [
  27. ('thread_name', {'label': _("Thread Name")}),
  28. ('post', {'label': _("Post Content")}),
  29. ],
  30. ],
  31. ]
  32. if self.mode not in ['edit_thread', 'new_thread']:
  33. del self.fields['thread_name']
  34. del self.layout[0][1][0]
  35. def clean_post(self):
  36. data = self.cleaned_data['post']
  37. if len(data) < self.request.settings['post_length_min']:
  38. raise forms.ValidationError(ungettext(
  39. "Post content cannot be empty.",
  40. "Post content cannot be shorter than %(count)d characters.",
  41. self.request.settings['post_length_min']
  42. ) % {'count': self.request.settings['post_length_min']})
  43. return data
  44. class QuickReplyForm(Form):
  45. post = forms.CharField(widget=forms.Textarea)
  46. class MergeThreadsForm(Form, ThreadNameMixin):
  47. def __init__(self, data=None, request=None, threads=[], *args, **kwargs):
  48. self.threads = threads
  49. super(MergeThreadsForm, self).__init__(data, request=request, *args, **kwargs)
  50. def finalize_form(self):
  51. self.fields['thread_name'] = forms.CharField(max_length=255, initial=self.threads[0].name)
  52. self.layout = [
  53. [
  54. _("Thread Options"),
  55. [
  56. ('thread_name', {'label': _("Thread Name"), 'help_text': _("Name of new thread that will be created as result of merge.")}),
  57. ],
  58. ],
  59. [
  60. _("Merge Order"),
  61. [
  62. ],
  63. ],
  64. ]
  65. choices = []
  66. for i, thread in enumerate(self.threads):
  67. choices.append((str(i), i + 1))
  68. for i, thread in enumerate(self.threads):
  69. self.fields['thread_%s' % thread.pk] = forms.ChoiceField(choices=choices,initial=str(i))
  70. self.layout[1][1].append(('thread_%s' % thread.pk, {'label': thread.name}))
  71. def clean(self):
  72. cleaned_data = super(MergeThreadsForm, self).clean()
  73. self.merge_order = {}
  74. lookback = []
  75. for thread in self.threads:
  76. order = int(cleaned_data['thread_%s' % thread.pk])
  77. if order in lookback:
  78. raise forms.ValidationError(_("One or more threads have same position in merge order."))
  79. lookback.append(order)
  80. self.merge_order[order] = thread
  81. return cleaned_data