views.py 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. from django import forms
  2. from django.forms import ValidationError
  3. from django.template import RequestContext
  4. from django.utils.translation import ugettext as _
  5. from misago.acl.exceptions import ACLError403, ACLError404
  6. from misago.apps.errors import error403, error404
  7. from misago.forms import Form, FormFields
  8. from misago.models import Forum, Thread, Post
  9. from misago.readstrackers import ForumsTracker
  10. class ThreadsListBaseView(object):
  11. def _fetch_forum(self):
  12. self.fetch_forum()
  13. self.proxy = Forum.objects.parents_aware_forum(self.forum)
  14. self.request.acl.forums.allow_forum_view(self.forum)
  15. if self.forum.level:
  16. self.parents = Forum.objects.forum_parents(self.forum.pk)
  17. if self.forum.lft + 1 != self.forum.rght:
  18. self.forum.subforums = Forum.objects.treelist(self.request.acl.forums, self.forum, tracker=ForumsTracker(self.request.user))
  19. def threads_actions(self):
  20. pass
  21. def make_form(self):
  22. self.form = None
  23. list_choices = self.threads_actions();
  24. if (not self.request.user.is_authenticated()
  25. or not list_choices):
  26. return
  27. form_fields = {}
  28. form_fields['list_action'] = forms.ChoiceField(choices=list_choices)
  29. list_choices = []
  30. for item in self.threads:
  31. if item.forum_id == self.forum.pk:
  32. list_choices.append((item.pk, None))
  33. if not list_choices:
  34. return
  35. form_fields['list_items'] = forms.MultipleChoiceField(choices=list_choices, widget=forms.CheckboxSelectMultiple)
  36. self.form = type('ThreadsViewForm', (Form,), form_fields)
  37. def handle_form(self):
  38. if self.request.method == 'POST':
  39. self.form = self.form(self.request.POST, request=self.request)
  40. if self.form.is_valid():
  41. checked_items = []
  42. posts = []
  43. for thread in self.threads:
  44. if str(thread.pk) in self.form.cleaned_data['list_items'] and thread.forum_id == self.forum.pk:
  45. posts.append(thread.start_post_id)
  46. if thread.start_post_id != thread.last_post_id:
  47. posts.append(thread.last_post_id)
  48. checked_items.append(thread.pk)
  49. if checked_items:
  50. if posts:
  51. for post in Post.objects.filter(id__in=posts).prefetch_related('user'):
  52. for thread in self.threads:
  53. if thread.start_post_id == post.pk:
  54. thread.start_post = post
  55. if thread.last_post_id == post.pk:
  56. thread.last_post = post
  57. if thread.start_post_id == post.pk or thread.last_post_id == post.pk:
  58. break
  59. form_action = getattr(self, 'action_' + self.form.cleaned_data['list_action'])
  60. try:
  61. response = form_action(checked_items)
  62. if response:
  63. return response
  64. return redirect(self.request.path)
  65. except forms.ValidationError as e:
  66. self.message = Message(e.messages[0], 'error')
  67. else:
  68. self.message = Message(_("You have to select at least one thread."), 'error')
  69. else:
  70. if 'list_action' in self.form.errors:
  71. self.message = Message(_("Action requested is incorrect."), 'error')
  72. else:
  73. self.message = Message(form.non_field_errors()[0], 'error')
  74. else:
  75. self.form = self.form(request=self.request)
  76. def __new__(cls, request, **kwargs):
  77. obj = super(ThreadsListBaseView, cls).__new__(cls)
  78. return obj(request, **kwargs)
  79. def __call__(self, request, **kwargs):
  80. self.request = request
  81. self.kwargs = kwargs
  82. self.pagination = {}
  83. self.parents = []
  84. self.threads = []
  85. self.message = request.messages.get_message('threads')
  86. try:
  87. self._fetch_forum()
  88. self.fetch_threads()
  89. self.form = None
  90. self.make_form()
  91. if self.form:
  92. response = self.handle_form()
  93. if response:
  94. return response
  95. except Forum.DoesNotExist:
  96. return error404(request)
  97. except ACLError403 as e:
  98. return error403(request, unicode(e))
  99. except ACLError404 as e:
  100. return error404(request, unicode(e))
  101. # Merge proxy into forum
  102. self.forum.closed = self.proxy.closed
  103. return request.theme.render_to_response(('%s/list.html' % self.templates_prefix),
  104. {
  105. 'message': self.message,
  106. 'forum': self.forum,
  107. 'parents': self.parents,
  108. 'count': self.count,
  109. 'list_form': FormFields(self.form).fields if self.form else None,
  110. 'threads': self.threads,
  111. 'pagination': self.pagination,
  112. },
  113. context_instance=RequestContext(request));