views.py 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. import copy
  2. from django.core.urlresolvers import reverse as django_reverse
  3. from django.shortcuts import redirect
  4. from django.utils.translation import ugettext as _
  5. from misago import messages
  6. from misago.acl.builder import build_form
  7. from misago.admin import site
  8. from misago.apps.admin.widgets import *
  9. from misago.forms import Form, YesNoSwitch
  10. from misago.models import Forum, ForumRole, Role
  11. from misago.monitor import monitor, UpdatingMonitor
  12. from misago.utils.strings import slugify
  13. from misago.apps.admin.roles.forms import RoleForm
  14. def reverse(route, target=None):
  15. if target:
  16. return django_reverse(route, kwargs={'target': target.pk, 'slug': slugify(target.name)})
  17. return django_reverse(route)
  18. """
  19. Views
  20. """
  21. class List(ListWidget):
  22. admin = site.get_action('roles')
  23. id = 'list'
  24. columns=(
  25. ('role', _("Role")),
  26. )
  27. nothing_checked_message = _('You have to check at least one role.')
  28. actions=(
  29. ('delete', _("Delete selected roles"), _("Are you sure you want to delete selected roles?")),
  30. )
  31. def sort_items(self, page_items, sorting_method):
  32. return page_items.order_by('name')
  33. def get_item_actions(self, item):
  34. return (
  35. self.action('list', _("Forums Permissions"), reverse('admin_roles_masks', item)),
  36. self.action('adjust', _("Role Permissions"), reverse('admin_roles_acl', item)),
  37. self.action('pencil', _("Edit Role"), reverse('admin_roles_edit', item)),
  38. self.action('remove', _("Delete Role"), reverse('admin_roles_delete', item), post=True, prompt=_("Are you sure you want to delete this role?")),
  39. )
  40. def action_delete(self, items, checked):
  41. for item in items:
  42. if item.pk in checked:
  43. if item.special:
  44. return Message(_('You cannot delete system roles.'), messages.ERROR), reverse('admin_roles')
  45. if item.protected and not self.request.user.is_god():
  46. return Message(_('You cannot delete protected roles.'), messages.ERROR), reverse('admin_roles')
  47. if item.user_set.count() > 0:
  48. return Message(_('You cannot delete roles that are assigned to users.'), messages.ERROR), reverse('admin_roles')
  49. Role.objects.filter(id__in=checked).delete()
  50. return Message(_('Selected roles have been deleted successfully.'), messages.SUCCESS), reverse('admin_roles')
  51. class New(FormWidget):
  52. admin = site.get_action('roles')
  53. id = 'new'
  54. fallback = 'admin_roles'
  55. form = RoleForm
  56. submit_button = _("Save Role")
  57. def get_new_link(self, model):
  58. return reverse('admin_roles_new')
  59. def get_edit_link(self, model):
  60. return reverse('admin_roles_edit', model)
  61. def submit_form(self, form, target):
  62. new_role = Role(name=form.cleaned_data['name'])
  63. new_role.save(force_insert=True)
  64. return new_role, Message(_('New Role has been created.'), messages.SUCCESS)
  65. class Edit(FormWidget):
  66. admin = site.get_action('roles')
  67. id = 'edit'
  68. name = _("Edit Role")
  69. fallback = 'admin_roles'
  70. form = RoleForm
  71. target_name = 'name'
  72. translate_target_name = True
  73. notfound_message = _('Requested Role could not be found.')
  74. submit_fallback = True
  75. def get_link(self, model):
  76. return reverse('admin_roles_edit', model)
  77. def get_edit_link(self, model):
  78. return self.get_link(model)
  79. def get_initial_data(self, model):
  80. if self.request.user.is_god():
  81. return {'name': model.name, 'protected': model.protected}
  82. return {'name': model.name}
  83. def get_and_validate_target(self, target):
  84. result = super(Edit, self).get_and_validate_target(target)
  85. if result and result.protected and not self.request.user.is_god():
  86. messages.error(self.request, _('Role "%(name)s" is protected, you cannot edit it.') % {'name': _(result.name)}, self.admin.id)
  87. return None
  88. return result
  89. def submit_form(self, form, target):
  90. target.name = form.cleaned_data['name']
  91. if self.request.user.is_god():
  92. target.protected = form.cleaned_data['protected']
  93. target.save(force_update=True)
  94. with UpdatingMonitor() as cm:
  95. monitor.increase('acl_version')
  96. return target, Message(_('Changes in role "%(name)s" have been saved.') % {'name': self.original_name}, messages.SUCCESS)
  97. class Forums(ListWidget):
  98. admin = site.get_action('roles')
  99. id = 'forums'
  100. hide_actions = True
  101. name = _('Role Forums Permissions')
  102. table_form_button = _('Change Permissions')
  103. empty_message = _('No forums are currently defined.')
  104. template = 'forums'
  105. def get_link(self):
  106. return reverse('admin_roles_masks', self.role)
  107. def get_items(self):
  108. return Forum.objects.get(special='root').get_descendants()
  109. def sort_items(self, page_items, sorting_method):
  110. return page_items.order_by('lft').all()
  111. def add_template_variables(self, variables):
  112. variables['target'] = _(self.role.name)
  113. return variables
  114. def get_table_form(self, page_items):
  115. perms = {}
  116. try:
  117. forums = self.role.permissions['forums']
  118. for fid in forums:
  119. perms[str(fid)] = str(forums[fid])
  120. except KeyError:
  121. pass
  122. perms_form = {}
  123. roles_select = [("0", _("No Access"))]
  124. for role in self.roles:
  125. roles_select.append((str(role.pk), _(role.name)))
  126. for item in page_items:
  127. perms_form['forum_' + str(item.pk)] = forms.ChoiceField(choices=roles_select,initial=(perms[str(item.pk)] if str(item.pk) in perms else "0"))
  128. # Turn dict into object
  129. return type('ChangeForumRolesForm', (Form,), perms_form)
  130. def table_action(self, page_items, cleaned_data):
  131. perms = {}
  132. for item in page_items:
  133. if cleaned_data['forum_' + str(item.pk)] != "0":
  134. perms[item.pk] = long(cleaned_data['forum_' + str(item.pk)])
  135. role_perms = self.role.permissions
  136. role_perms['forums'] = perms
  137. self.role.permissions = role_perms
  138. self.role.save(force_update=True)
  139. return Message(_('Forum permissions have been saved.'), messages.SUCCESS), self.get_link()
  140. def __call__(self, request, slug, target):
  141. self.request = request
  142. try:
  143. self.role = Role.objects.get(id=target)
  144. if self.role and self.role.protected and not request.user.is_god():
  145. messages.error(request, _('Role "%(name)s" is protected, you cannot edit it.') % {'name': _(self.role.name)}, self.admin.id)
  146. return redirect(reverse('admin_roles'))
  147. except Role.DoesNotExist:
  148. messages.error(request, _('Requested Role could not be found.'), self.admin.id)
  149. return redirect(reverse('admin_roles'))
  150. self.roles = ForumRole.objects.order_by('name').all()
  151. if not self.roles:
  152. messages.error(request, _('No forum roles are currently set.'), self.admin.id)
  153. return redirect(reverse('admin_roles'))
  154. return super(Forums, self).__call__(request)
  155. class ACL(FormWidget):
  156. admin = site.get_action('roles')
  157. id = 'acl'
  158. name = _("Change Role Permissions")
  159. fallback = 'admin_roles'
  160. target_name = 'name'
  161. translate_target_name = True
  162. notfound_message = _('Requested Role could not be found.')
  163. submit_fallback = True
  164. template = 'acl_form'
  165. def get_form(self, target):
  166. self.form = build_form(self.request, target)
  167. return self.form
  168. def get_link(self, model):
  169. return reverse('admin_roles_acl', model)
  170. def get_edit_link(self, model):
  171. return self.get_link(model)
  172. def get_initial_data(self, model):
  173. raw_acl = model.permissions
  174. initial = {}
  175. for field in self.form.base_fields:
  176. if field in raw_acl:
  177. initial[field] = raw_acl[field]
  178. return initial
  179. def get_and_validate_target(self, target):
  180. result = super(ACL, self).get_and_validate_target(target)
  181. if result and result.protected and not self.request.user.is_god():
  182. messages.error(self.request, _('Role "%(name)s" is protected, you cannot edit it.') % {'name': _(result.name)}, self.admin.id)
  183. return None
  184. return result
  185. def submit_form(self, form, target):
  186. raw_acl = target.permissions
  187. for perm in form.cleaned_data:
  188. raw_acl[perm] = form.cleaned_data[perm]
  189. target.permissions = raw_acl
  190. target.save(force_update=True)
  191. with UpdatingMonitor() as cm:
  192. monitor.increase('acl_version')
  193. return target, Message(_('Role "%(name)s" permissions have been changed.') % {'name': self.original_name}, messages.SUCCESS)
  194. class Delete(ButtonWidget):
  195. admin = site.get_action('roles')
  196. id = 'delete'
  197. fallback = 'admin_roles'
  198. notfound_message = _('Requested Role could not be found.')
  199. def action(self, target):
  200. if target.special:
  201. return Message(_('You cannot delete system roles.'), messages.ERROR), reverse('admin_roles')
  202. if target.protected and not self.request.user.is_god():
  203. return Message(_('This role is protected.'), messages.ERROR), reverse('admin_roles')
  204. if target.user_set.count() > 0:
  205. return Message(_('This role is assigned to one or more users.'), messages.ERROR), reverse('admin_roles')
  206. target.delete()
  207. return Message(_('Role "%(name)s" has been deleted.') % {'name': _(target.name)}, messages.SUCCESS), False