forumsadmin.py 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. from django.contrib import messages
  2. from django.shortcuts import redirect
  3. from django.utils.translation import ugettext_lazy as _
  4. from misago.admin.views import generic
  5. from misago.acl import version as acl_version
  6. from misago.forums.models import FORUMS_TREE_ID, Forum, RoleForumACL
  7. from misago.forums.forms import ForumFormFactory, DeleteFormFactory
  8. class ForumAdmin(generic.AdminBaseMixin):
  9. root_link = 'misago:admin:forums:nodes:index'
  10. Model = Forum
  11. templates_dir = 'misago/admin/forums'
  12. message_404 = _("Requested forum does not exist.")
  13. def get_target(self, kwargs):
  14. target = super(ForumAdmin, self).get_target(kwargs)
  15. target_is_special = bool(target.special_role)
  16. target_not_in_forums_tree = target.tree_id != FORUMS_TREE_ID
  17. if target.pk and (target_is_special or target_not_in_forums_tree):
  18. raise Forum.DoesNotExist()
  19. else:
  20. return target
  21. class ForumsList(ForumAdmin, generic.ListView):
  22. def get_queryset(self):
  23. return Forum.objects.all_forums()
  24. def process_context(self, request, context):
  25. context['items'] = [f for f in context['items']]
  26. children_lists = {}
  27. for i, item in enumerate(context['items']):
  28. item.level_range = range(item.level - 1)
  29. item.first = False
  30. item.last = False
  31. children_lists.setdefault(item.parent_id, []).append(item)
  32. for level_items in children_lists.values():
  33. level_items[0].first = True
  34. level_items[-1].last = True
  35. return context
  36. class ForumFormMixin(object):
  37. def create_form_type(self, request, target):
  38. return ForumFormFactory(target)
  39. def handle_form(self, form, request, target):
  40. if form.instance.pk:
  41. if form.instance.parent_id != form.cleaned_data['new_parent'].pk:
  42. form.instance.move_to(form.cleaned_data['new_parent'],
  43. position='last-child')
  44. form.instance.save()
  45. if form.instance.parent_id != form.cleaned_data['new_parent'].pk:
  46. Forum.objects.clear_cache()
  47. else:
  48. form.instance.insert_at(form.cleaned_data['new_parent'],
  49. position='last-child',
  50. save=True)
  51. Forum.objects.clear_cache()
  52. if form.cleaned_data.get('copy_permissions'):
  53. form.instance.forum_role_set.all().delete()
  54. copy_from = form.cleaned_data['copy_permissions']
  55. copied_acls = []
  56. for acl in copy_from.forum_role_set.all():
  57. copied_acls.append(RoleForumACL(
  58. role_id=acl.role_id,
  59. forum=form.instance,
  60. forum_role_id=acl.forum_role_id))
  61. if copied_acls:
  62. RoleForumACL.objects.bulk_create(copied_acls)
  63. acl_version.invalidate()
  64. messages.success(request, self.message_submit % {'name': target.name})
  65. class NewForum(ForumFormMixin, ForumAdmin, generic.ModelFormView):
  66. message_submit = _('New forum "%(name)s" has been saved.')
  67. class EditForum(ForumFormMixin, ForumAdmin, generic.ModelFormView):
  68. message_submit = _('Forum "%(name)s" has been edited.')
  69. class DeleteForum(ForumAdmin, generic.ModelFormView):
  70. message_submit = _('Forum "%(name)s" has been deleted.')
  71. template = 'delete.html'
  72. def create_form_type(self, request, target):
  73. return DeleteFormFactory(target)
  74. def handle_form(self, form, request, target):
  75. move_children_to = form.cleaned_data.get('move_children_to')
  76. move_threads_to = form.cleaned_data.get('move_threads_to')
  77. if move_children_to:
  78. for child in target.get_children():
  79. Forum.objects.move_node(child, move_children_to, 'last-child')
  80. if move_threads_to and child.pk == move_threads_to.pk:
  81. move_threads_to = child
  82. else:
  83. for child in target.get_descendants().order_by('-lft'):
  84. child.delete_content()
  85. child.delete()
  86. if move_threads_to:
  87. target.move_content(move_threads_to)
  88. move_threads_to.synchronize()
  89. move_threads_to.save()
  90. else:
  91. target.delete_content()
  92. form.instance.delete()
  93. messages.success(request, self.message_submit % {'name': target.name})
  94. return redirect(self.root_link)
  95. class MoveDownForum(ForumAdmin, generic.ButtonView):
  96. def button_action(self, request, target):
  97. try:
  98. other_target = target.get_next_sibling()
  99. except Forum.DoesNotExist:
  100. other_target = None
  101. if other_target:
  102. Forum.objects.move_node(target, other_target, 'right')
  103. Forum.objects.clear_cache()
  104. message = _('Forum "%(name)s" has been moved below "%(other)s".')
  105. targets_names = {'name': target.name, 'other': other_target.name}
  106. messages.success(request, message % targets_names)
  107. class MoveUpForum(ForumAdmin, generic.ButtonView):
  108. def button_action(self, request, target):
  109. try:
  110. other_target = target.get_previous_sibling()
  111. except Forum.DoesNotExist:
  112. other_target = None
  113. if other_target:
  114. Forum.objects.move_node(target, other_target, 'left')
  115. Forum.objects.clear_cache()
  116. message = _('Forum "%(name)s" has been moved above "%(other)s".')
  117. targets_names = {'name': target.name, 'other': other_target.name}
  118. messages.success(request, message % targets_names)