views.py 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  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.core.admin.widgets import *
  7. from misago.forms import Form, YesNoSwitch
  8. from misago.models import ForumRole
  9. from misago.utils.strings import slugify
  10. from misago.core.admin.forumroles.forms import ForumRoleForm
  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, page_items, sorting_method):
  29. return page_items.order_by('name')
  30. def get_item_actions(self, 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, items, checked):
  37. self.request.monitor['acl_version'] = int(self.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, model):
  47. return reverse('admin_roles_forums_new')
  48. def get_edit_url(self, model):
  49. return reverse('admin_roles_forums_edit', model)
  50. def submit_form(self, 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, model):
  66. return reverse('admin_roles_forums_edit', model)
  67. def get_edit_url(self, model):
  68. return self.get_url(model)
  69. def get_initial_data(self, model):
  70. return {
  71. 'name': model.name,
  72. }
  73. def submit_form(self, 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. template = 'acl_form'
  86. def get_form(self, target):
  87. self.form = build_forum_form(self.request, target)
  88. return self.form
  89. def get_url(self, model):
  90. return reverse('admin_roles_forums_acl', model)
  91. def get_edit_url(self, model):
  92. return self.get_url(model)
  93. def get_initial_data(self, model):
  94. raw_acl = model.permissions
  95. initial = {}
  96. for field in self.form.base_fields:
  97. if field in raw_acl:
  98. initial[field] = raw_acl[field]
  99. return initial
  100. def submit_form(self, form, target):
  101. raw_acl = target.permissions
  102. for perm in form.cleaned_data:
  103. raw_acl[perm] = form.cleaned_data[perm]
  104. target.permissions = raw_acl
  105. target.save(force_update=True)
  106. self.request.monitor['acl_version'] = int(self.request.monitor['acl_version']) + 1
  107. return target, Message(_('Forum Role "%(name)s" permissions have been changed.') % {'name': self.original_name}, 'success')
  108. class Delete(ButtonWidget):
  109. admin = site.get_action('roles_forums')
  110. id = 'delete'
  111. fallback = 'admin_roles_forums'
  112. notfound_message = _('Requested Forum Role could not be found.')
  113. def action(self, target):
  114. target.delete()
  115. self.request.monitor['acl_version'] = int(self.request.monitor['acl_version']) + 1
  116. return Message(_('Forum Role "%(name)s" has been deleted.') % {'name': _(target.name)}, 'success'), False