mixins.py 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  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. class ThreadsFormMixin(object):
  7. def make_form(self):
  8. self.form = None
  9. list_choices = self.get_thread_actions();
  10. if (not self.request.user.is_authenticated()
  11. or not list_choices):
  12. return
  13. form_fields = {}
  14. form_fields['list_action'] = forms.ChoiceField(choices=list_choices)
  15. list_choices = []
  16. for item in self.threads:
  17. list_choices.append((item.pk, None))
  18. if not list_choices:
  19. return
  20. form_fields['list_items'] = forms.MultipleChoiceField(choices=list_choices,widget=forms.CheckboxSelectMultiple)
  21. self.form = type('ThreadsViewForm', (Form,), form_fields)
  22. def handle_form(self):
  23. if self.request.method == 'POST':
  24. self.form = self.form(self.request.POST, request=self.request)
  25. if self.form.is_valid():
  26. checked_items = []
  27. checked_ids = []
  28. for thread in self.threads:
  29. if str(thread.pk) in self.form.cleaned_data['list_items']:
  30. checked_ids.append(thread.pk)
  31. checked_items.append(thread)
  32. if checked_items:
  33. form_action = getattr(self, 'action_' + self.form.cleaned_data['list_action'])
  34. response = form_action(checked_ids, checked_items)
  35. if response:
  36. return response
  37. return redirect(self.request.path)
  38. else:
  39. self.message = Message(_("You have to select at least one thread."), 'error')
  40. else:
  41. if 'list_action' in self.form.errors:
  42. self.message = Message(_("Action requested is incorrect."), 'error')
  43. else:
  44. self.message = Message(form.non_field_errors()[0], 'error')
  45. else:
  46. self.form = self.form(request=self.request)