forms.py 4.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. from django import forms
  2. from django.utils.translation import ugettext_lazy as _
  3. from misago.forms import Form, ForumChoiceField
  4. from misago.models import Forum
  5. from misago.validators import validate_sluggable
  6. from misago.apps.forumbase.mixins import ValidateThreadNameMixin
  7. class MoveThreadsForm(Form):
  8. error_source = 'new_forum'
  9. def __init__(self, data=None, request=None, forum=None, *args, **kwargs):
  10. self.forum = forum
  11. super(MoveThreadsForm, self).__init__(data, request=request, *args, **kwargs)
  12. def finalize_form(self):
  13. self.fields['new_forum'] = ForumChoiceField(queryset=Forum.tree.get(special='root').get_descendants().filter(pk__in=self.request.acl.forums.acl['can_browse']))
  14. self.layout = [
  15. [
  16. None,
  17. [
  18. ('new_forum', {'label': _("Move Threads to"), 'help_text': _("Select forum you want to move threads to.")}),
  19. ],
  20. ],
  21. ]
  22. def clean_new_forum(self):
  23. new_forum = self.cleaned_data['new_forum']
  24. # Assert its forum and its not current forum
  25. if new_forum.type != 'forum':
  26. raise forms.ValidationError(_("This is not forum."))
  27. if new_forum.pk == self.forum.pk:
  28. raise forms.ValidationError(_("New forum is same as current one."))
  29. return new_forum
  30. class MergeThreadsForm(Form, ValidateThreadNameMixin):
  31. def __init__(self, data=None, request=None, threads=[], *args, **kwargs):
  32. self.threads = threads
  33. super(MergeThreadsForm, self).__init__(data, request=request, *args, **kwargs)
  34. def finalize_form(self):
  35. self.fields['new_forum'] = ForumChoiceField(queryset=Forum.tree.get(special='root').get_descendants().filter(pk__in=self.request.acl.forums.acl['can_browse']), initial=self.threads[0].forum)
  36. self.fields['thread_name'] = forms.CharField(
  37. max_length=self.request.settings['thread_name_max'],
  38. initial=self.threads[0].name,
  39. validators=[validate_sluggable(
  40. _("Thread name must contain at least one alpha-numeric character."),
  41. _("Thread name is too long. Try shorter name.")
  42. )])
  43. self.layout = [
  44. [
  45. None,
  46. [
  47. ('thread_name', {'label': _("Thread Name"), 'help_text': _("Name of new thread that will be created as result of merge.")}),
  48. ('new_forum', {'label': _("Thread Forum"), 'help_text': _("Select forum you want to put new thread in.")}),
  49. ],
  50. ],
  51. [
  52. _("Merge Order"),
  53. [
  54. ],
  55. ],
  56. ]
  57. choices = []
  58. for i, thread in enumerate(self.threads):
  59. choices.append((str(i), i + 1))
  60. for i, thread in enumerate(self.threads):
  61. self.fields['thread_%s' % thread.pk] = forms.ChoiceField(choices=choices, initial=str(i))
  62. self.layout[1][1].append(('thread_%s' % thread.pk, {'label': thread.name}))
  63. def clean_new_forum(self):
  64. new_forum = self.cleaned_data['new_forum']
  65. # Assert its forum
  66. if new_forum.type != 'forum':
  67. raise forms.ValidationError(_("This is not forum."))
  68. return new_forum
  69. def clean(self):
  70. cleaned_data = super(MergeThreadsForm, self).clean()
  71. self.merge_order = {}
  72. lookback = []
  73. for thread in self.threads:
  74. order = int(cleaned_data['thread_%s' % thread.pk])
  75. if order in lookback:
  76. raise forms.ValidationError(_("One or more threads have same position in merge order."))
  77. lookback.append(order)
  78. self.merge_order[order] = thread
  79. return cleaned_data