views.py 5.7 KB

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