mixins.py 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. from django import forms
  2. from django.shortcuts import redirect
  3. from django.utils.translation import ugettext as _
  4. from misago.forms import Form
  5. from misago.messages import Message
  6. from misago.threads.models import Post
  7. class ThreadsFormMixin(object):
  8. def make_form(self):
  9. self.form = None
  10. list_choices = self.get_thread_actions();
  11. if (not self.request.user.is_authenticated()
  12. or not list_choices):
  13. return
  14. form_fields = {}
  15. form_fields['list_action'] = forms.ChoiceField(choices=list_choices)
  16. list_choices = []
  17. for item in self.threads:
  18. if item.forum_id == self.forum.pk:
  19. list_choices.append((item.pk, None))
  20. if not list_choices:
  21. return
  22. form_fields['list_items'] = forms.MultipleChoiceField(choices=list_choices,widget=forms.CheckboxSelectMultiple)
  23. self.form = type('ThreadsViewForm', (Form,), form_fields)
  24. def handle_form(self):
  25. if self.request.method == 'POST':
  26. self.form = self.form(self.request.POST, request=self.request)
  27. if self.form.is_valid():
  28. checked_items = []
  29. posts = []
  30. for thread in self.threads:
  31. if str(thread.pk) in self.form.cleaned_data['list_items'] and thread.forum_id == self.forum.pk:
  32. posts.append(thread.start_post_id)
  33. if thread.start_post_id != thread.last_post_id:
  34. posts.append(thread.last_post_id)
  35. checked_items.append(thread.pk)
  36. if checked_items:
  37. if posts:
  38. for post in Post.objects.filter(id__in=posts).prefetch_related('user'):
  39. for thread in self.threads:
  40. if thread.start_post_id == post.pk:
  41. thread.start_post = post
  42. if thread.last_post_id == post.pk:
  43. thread.last_post = post
  44. if thread.start_post_id == post.pk or thread.last_post_id == post.pk:
  45. break
  46. form_action = getattr(self, 'action_' + self.form.cleaned_data['list_action'])
  47. try:
  48. response = form_action(checked_items)
  49. if response:
  50. return response
  51. return redirect(self.request.path)
  52. except forms.ValidationError as e:
  53. self.message = Message(e.messages[0], 'error')
  54. else:
  55. self.message = Message(_("You have to select at least one thread."), 'error')
  56. else:
  57. if 'list_action' in self.form.errors:
  58. self.message = Message(_("Action requested is incorrect."), 'error')
  59. else:
  60. self.message = Message(form.non_field_errors()[0], 'error')
  61. else:
  62. self.form = self.form(request=self.request)