views.py 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. import copy
  2. from django.core.urlresolvers import reverse as django_reverse
  3. from django.utils.translation import ugettext as _
  4. from misago.acl.builder import build_forum_form
  5. from misago.admin import site
  6. from misago.admin.widgets import *
  7. from misago.utils import slugify
  8. from misago.forms import Form, YesNoSwitch
  9. from misago.forumroles.forms import ForumRoleForm
  10. from misago.forumroles.models import ForumRole
  11. def reverse(route, target=None):
  12. if target:
  13. return django_reverse(route, kwargs={'target': target.pk, 'slug': slugify(target.name)})
  14. return django_reverse(route)
  15. """
  16. Views
  17. """
  18. class List(ListWidget):
  19. admin = site.get_action('roles_forums')
  20. id = 'list'
  21. columns=(
  22. ('role', _("Role")),
  23. )
  24. nothing_checked_message = _('You have to check at least one role.')
  25. actions=(
  26. ('delete', _("Delete selected forum roles"), _("Are you sure you want to delete selected roles?")),
  27. )
  28. def sort_items(self, request, page_items, sorting_method):
  29. return page_items.order_by('name')
  30. def get_item_actions(self, request, item):
  31. return (
  32. self.action('adjust', _("Role Permissions"), reverse('admin_roles_forums_acl', item)),
  33. self.action('pencil', _("Edit Role"), reverse('admin_roles_forums_edit', item)),
  34. self.action('remove', _("Delete Role"), reverse('admin_roles_forums_delete', item), post=True, prompt=_("Are you sure you want to delete this role?")),
  35. )
  36. def action_delete(self, request, items, checked):
  37. request.monitor['acl_version'] = int(request.monitor['acl_version']) + 1
  38. Role.objects.filter(id__in=checked).delete()
  39. return Message(_('Selected forum roles have been deleted successfully.'), 'success'), reverse('admin_roles_forums')
  40. class New(FormWidget):
  41. admin = site.get_action('roles_forums')
  42. id = 'new'
  43. fallback = 'admin_roles_forums'
  44. form = ForumRoleForm
  45. submit_button = _("Save Role")
  46. def get_new_url(self, request, model):
  47. return reverse('admin_roles_forums_new')
  48. def get_edit_url(self, request, model):
  49. return reverse('admin_roles_forums_edit', model)
  50. def submit_form(self, request, form, target):
  51. new_role = ForumRole(
  52. name = form.cleaned_data['name'],
  53. )
  54. new_role.save(force_insert=True)
  55. return new_role, Message(_('New Forum Role has been created.'), 'success')
  56. class Edit(FormWidget):
  57. admin = site.get_action('roles_forums')
  58. id = 'edit'
  59. name = _("Edit Forum Role")
  60. fallback = 'admin_roles_forums'
  61. form = ForumRoleForm
  62. target_name = 'name'
  63. notfound_message = _('Requested Forum Role could not be found.')
  64. submit_fallback = True
  65. def get_url(self, request, model):
  66. return reverse('admin_roles_forums_edit', model)
  67. def get_edit_url(self, request, model):
  68. return self.get_url(request, model)
  69. def get_initial_data(self, request, model):
  70. return {
  71. 'name': model.name,
  72. }
  73. def submit_form(self, request, form, target):
  74. target.name = form.cleaned_data['name']
  75. target.save(force_update=True)
  76. return target, Message(_('Changes in forum role "%(name)s" have been saved.') % {'name': self.original_name}, 'success')
  77. class ACL(FormWidget):
  78. admin = site.get_action('roles_forums')
  79. id = 'acl'
  80. name = _("Change Forum Role Permissions")
  81. fallback = 'admin_roles_forums'
  82. target_name = 'name'
  83. notfound_message = _('Requested Forum Role could not be found.')
  84. submit_fallback = True
  85. def get_form(self, request, target):
  86. self.form = build_forum_form(request, target)
  87. return self.form
  88. def get_url(self, request, model):
  89. return reverse('admin_roles_forums_acl', model)
  90. def get_edit_url(self, request, model):
  91. return self.get_url(request, model)
  92. def get_initial_data(self, request, model):
  93. raw_acl = model.get_permissions()
  94. initial = {}
  95. for field in self.form.base_fields:
  96. if field in raw_acl:
  97. initial[field] = raw_acl[field]
  98. return initial
  99. def submit_form(self, request, form, target):
  100. raw_acl = target.get_permissions()
  101. for perm in form.cleaned_data:
  102. raw_acl[perm] = form.cleaned_data[perm]
  103. target.set_permissions(raw_acl)
  104. target.save(force_update=True)
  105. request.monitor['acl_version'] = int(request.monitor['acl_version']) + 1
  106. return target, Message(_('Forum Role "%(name)s" permissions have been changed.') % {'name': self.original_name}, 'success')
  107. class Delete(ButtonWidget):
  108. admin = site.get_action('roles_forums')
  109. id = 'delete'
  110. fallback = 'admin_roles_forums'
  111. notfound_message = _('Requested Forum Role could not be found.')
  112. def action(self, request, target):
  113. target.delete()
  114. request.monitor['acl_version'] = int(request.monitor['acl_version']) + 1
  115. return Message(_('Forum Role "%(name)s" has been deleted.') % {'name': _(target.name)}, 'success'), False