moderation.py 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. from urlparse import urlparse
  2. from django.core.urlresolvers import resolve
  3. from django.http import Http404
  4. from django.utils.translation import ugettext_lazy as _
  5. from misago.acl import add_acl
  6. from misago.categories.forms import CategoryChoiceField
  7. from misago.categories.permissions import (allow_see_category,
  8. allow_browse_category)
  9. from misago.core import forms
  10. from misago.threads.models import Thread
  11. from misago.threads.permissions import allow_see_thread
  12. from misago.threads.validators import validate_title
  13. class MergeThreadsForm(forms.Form):
  14. merged_thread_title = forms.CharField(label=_("Merged thread title"),
  15. required=False)
  16. def clean(self):
  17. data = super(MergeThreadsForm, self).clean()
  18. merged_thread_title = data.get('merged_thread_title')
  19. if merged_thread_title:
  20. validate_title(merged_thread_title)
  21. else:
  22. message = _("You have to enter merged thread title.")
  23. raise forms.ValidationError(message)
  24. return data
  25. class MoveThreadsForm(forms.Form):
  26. new_category = CategoryChoiceField(label=_("Move threads to category"),
  27. empty_label=None)
  28. def __init__(self, *args, **kwargs):
  29. self.category = kwargs.pop('category')
  30. acl = kwargs.pop('acl')
  31. super(MoveThreadsForm, self).__init__(*args, **kwargs)
  32. self.fields['new_category'].set_acl(acl)
  33. def clean(self):
  34. data = super(MoveThreadsForm, self).clean()
  35. new_category = data.get('new_category')
  36. if new_category:
  37. if new_category.is_category:
  38. message = _("You can't move threads to category.")
  39. raise forms.ValidationError(message)
  40. if new_category.is_redirect:
  41. message = _("You can't move threads to redirect.")
  42. raise forms.ValidationError(message)
  43. if new_category.pk == self.category.pk:
  44. message = _("New category is same as current one.")
  45. raise forms.ValidationError(message)
  46. else:
  47. raise forms.ValidationError(_("You have to select category."))
  48. return data
  49. class MoveThreadForm(MoveThreadsForm):
  50. new_category = CategoryChoiceField(label=_("Move thread to category"),
  51. empty_label=None)
  52. class MovePostsForm(forms.Form):
  53. new_thread_url = forms.CharField(
  54. label=_("New thread link"),
  55. help_text=_("Paste link to thread you want selected posts moved to."))
  56. def __init__(self, *args, **kwargs):
  57. self.user = kwargs.pop('user')
  58. self.thread = kwargs.pop('thread')
  59. self.new_thread = None
  60. super(MovePostsForm, self).__init__(*args, **kwargs)
  61. def clean(self):
  62. data = super(MovePostsForm, self).clean()
  63. new_thread_url = data.get('new_thread_url')
  64. try:
  65. if not new_thread_url:
  66. raise Http404()
  67. resolution = resolve(urlparse(new_thread_url).path)
  68. if not 'thread_id' in resolution.kwargs:
  69. raise Http404()
  70. queryset = Thread.objects.select_related('category')
  71. self.new_thread = queryset.get(id=resolution.kwargs['thread_id'])
  72. add_acl(self.user, self.new_thread.category)
  73. add_acl(self.user, self.new_thread)
  74. allow_see_category(self.user, self.new_thread.category)
  75. allow_browse_category(self.user, self.new_thread.category)
  76. allow_see_thread(self.user, self.new_thread)
  77. except (Http404, Thread.DoesNotExist):
  78. message = _("You have to enter valid link to thread.")
  79. raise forms.ValidationError(message)
  80. if self.thread == self.new_thread:
  81. message = _("New thread is same as current one.")
  82. raise forms.ValidationError(message)
  83. if self.new_thread.category.special_role:
  84. message = _("You can't move posts to special threads.")
  85. raise forms.ValidationError(message)
  86. return data
  87. class SplitThreadForm(forms.Form):
  88. category = CategoryChoiceField(label=_("New thread category"),
  89. empty_label=None)
  90. thread_title = forms.CharField(label=_("New thread title"),
  91. required=False)
  92. def __init__(self, *args, **kwargs):
  93. acl = kwargs.pop('acl')
  94. super(SplitThreadForm, self).__init__(*args, **kwargs)
  95. self.fields['category'].set_acl(acl)
  96. def clean(self):
  97. data = super(SplitThreadForm, self).clean()
  98. category = data.get('category')
  99. if category:
  100. if category.is_category:
  101. message = _("You can't start threads in category.")
  102. raise forms.ValidationError(message)
  103. if category.is_redirect:
  104. message = _("You can't start threads in redirect.")
  105. raise forms.ValidationError(message)
  106. else:
  107. raise forms.ValidationError(_("You have to select category."))
  108. thread_title = data.get('thread_title')
  109. if thread_title:
  110. validate_title(thread_title)
  111. else:
  112. message = _("You have to enter new thread title.")
  113. raise forms.ValidationError(message)
  114. return data