views.py 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. import warnings
  2. from django.contrib import messages
  3. from django.shortcuts import redirect
  4. from django.utils.translation import ugettext_lazy as _
  5. from misago.acl import cachebuster
  6. from misago.admin.views import generic
  7. from misago.forums.models import Forum
  8. from misago.forums.forms import ForumFormFactory, DeleteFormFactory
  9. class ForumAdmin(generic.AdminBaseMixin):
  10. root_link = 'misago:admin:forums:nodes:index'
  11. Model = Forum
  12. templates_dir = 'misago/admin/forums'
  13. message_404 = _("Requested forum does not exist.")
  14. def get_target(self, kwargs):
  15. target = super(ForumAdmin, self).get_target(kwargs)
  16. if target.pk and target.tree_id != 1:
  17. raise Forum.DoesNotExist()
  18. else:
  19. return target
  20. class ForumsList(ForumAdmin, generic.ListView):
  21. def get_queryset(self):
  22. return Forum.objects.all_forums()
  23. def process_context(self, request, context):
  24. context['items'] = [f for f in context['items']]
  25. levels_lists = {}
  26. for i, item in enumerate(context['items']):
  27. item.level_range = range(item.level - 1)
  28. item.first = False
  29. item.last = False
  30. levels_lists.setdefault(item.level, []).append(item)
  31. for level_items in levels_lists.values():
  32. level_items[0].first = True
  33. level_items[-1].last = True
  34. return context
  35. class ForumFormMixin(object):
  36. def create_form_type(self, request, target):
  37. return ForumFormFactory(target)
  38. def handle_form(self, form, request, target):
  39. if form.instance.pk:
  40. if form.instance.parent_id != form.cleaned_data['new_parent'].pk:
  41. form.instance.move_to(form.cleaned_data['new_parent'],
  42. position='last-child')
  43. form.instance.save()
  44. else:
  45. form.instance.insert_at(form.cleaned_data['new_parent'],
  46. position='last-child',
  47. save=True)
  48. cachebuster.invalidate()
  49. messages.success(request, self.message_submit % target.name)
  50. class NewForum(ForumFormMixin, ForumAdmin, generic.ModelFormView):
  51. message_submit = _('New forum "%s" has been saved.')
  52. class EditForum(ForumFormMixin, ForumAdmin, generic.ModelFormView):
  53. message_submit = _('Forum "%s" has been edited.')
  54. class DeleteForum(ForumAdmin, generic.ModelFormView):
  55. message_submit = _('Forum "%s" has been deleted.')
  56. template = 'delete.html'
  57. def create_form_type(self, request, target):
  58. return DeleteFormFactory(target)
  59. def handle_form(self, form, request, target):
  60. move_children_to = form.cleaned_data.get('move_children_to')
  61. if move_children_to:
  62. for child in target.get_children():
  63. Forum.objects.move_node(child, move_children_to, 'last-child')
  64. else:
  65. for child in target.get_descendants().order_by('-lft'):
  66. child.delete()
  67. move_threads_to = form.cleaned_data.get('move_threads_to')
  68. if move_threads_to:
  69. warnings.warn("Not implemented yet! See #354 for details.",
  70. FutureWarning)
  71. form.instance.delete()
  72. cachebuster.invalidate()
  73. messages.success(request, self.message_submit % target.name)
  74. return redirect(self.root_link)
  75. class MoveUpForum(ForumAdmin, generic.ButtonView):
  76. def button_action(self, request, target):
  77. try:
  78. other_target = target.get_previous_sibling()
  79. except Forum.DoesNotExist:
  80. other_target = None
  81. if other_target:
  82. Forum.objects.move_node(target, other_target, 'left')
  83. message = _('Forum "%s" has been moved up.') % target.name
  84. messages.success(request, message)
  85. class MoveDownForum(ForumAdmin, generic.ButtonView):
  86. def button_action(self, request, target):
  87. try:
  88. other_target = target.get_next_sibling()
  89. except Forum.DoesNotExist:
  90. other_target = None
  91. if other_target:
  92. Forum.objects.move_node(target, other_target, 'right')
  93. message = _('Forum "%s" has been moved down.') % target.name
  94. messages.success(request, message)