views.py 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  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.acl.builder import build_form
  6. from misago.admin import site
  7. from misago.admin.widgets import *
  8. from misago.utils import slugify
  9. from misago.forms import Form, YesNoSwitch
  10. from misago.forums.models import Forum
  11. from misago.forumroles.models import ForumRole
  12. from misago.roles.forms import RoleForm
  13. from misago.roles.models import Role
  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, request, page_items, sorting_method):
  32. return page_items.order_by('name')
  33. def get_item_actions(self, request, 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, request, items, checked):
  41. for item in items:
  42. if unicode(item.pk) in checked:
  43. if item.token:
  44. return Message(_('You cannot delete system roles.'), 'error'), reverse('admin_roles')
  45. if item.protected and not request.user.is_god():
  46. return Message(_('You cannot delete protected roles.'), 'error'), reverse('admin_roles')
  47. if item.user_set.count() > 0:
  48. return Message(_('You cannot delete roles that are assigned to users.'), 'error'), reverse('admin_roles')
  49. Role.objects.filter(id__in=checked).delete()
  50. return Message(_('Selected roles have been deleted successfully.'), '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_url(self, request, model):
  58. return reverse('admin_roles_new')
  59. def get_edit_url(self, request, model):
  60. return reverse('admin_roles_edit', model)
  61. def submit_form(self, request, form, target):
  62. new_role = Role(
  63. name = form.cleaned_data['name'],
  64. )
  65. new_role.save(force_insert=True)
  66. return new_role, Message(_('New Role has been created.'), 'success')
  67. class Edit(FormWidget):
  68. admin = site.get_action('roles')
  69. id = 'edit'
  70. name = _("Edit Role")
  71. fallback = 'admin_roles'
  72. form = RoleForm
  73. target_name = 'name'
  74. translate_target_name = True
  75. notfound_message = _('Requested Role could not be found.')
  76. submit_fallback = True
  77. def get_url(self, request, model):
  78. return reverse('admin_roles_edit', model)
  79. def get_edit_url(self, request, model):
  80. return self.get_url(request, model)
  81. def get_initial_data(self, request, model):
  82. if request.user.is_god():
  83. return {'name': model.name, 'protected': model.protected}
  84. return {'name': model.name}
  85. def get_and_validate_target(self, request, target):
  86. result = super(Edit, self).get_and_validate_target(request, target)
  87. if result and result.protected and not request.user.is_god():
  88. request.messages.set_flash(Message(_('Role "%(name)s" is protected, you cannot edit it.') % {'name': _(result.name)}), 'error', self.admin.id)
  89. return None
  90. return result
  91. def submit_form(self, request, form, target):
  92. target.name = form.cleaned_data['name']
  93. if request.user.is_god():
  94. target.protected = form.cleaned_data['protected']
  95. target.save(force_update=True)
  96. request.monitor['acl_version'] = int(request.monitor['acl_version']) + 1
  97. return target, Message(_('Changes in role "%(name)s" have been saved.') % {'name': self.original_name}, 'success')
  98. class Forums(ListWidget):
  99. admin = site.get_action('roles')
  100. id = 'forums'
  101. hide_actions = True
  102. name = _('Role Forums Permissions')
  103. table_form_button = _('Change Permissions')
  104. empty_message = _('No forums are currently defined.')
  105. template = 'forums'
  106. def get_url(self):
  107. return reverse('admin_roles_masks', self.role)
  108. def get_items(self, request):
  109. return Forum.objects.get(token='root').get_descendants()
  110. def sort_items(self, request, page_items, sorting_method):
  111. return page_items.order_by('lft')
  112. def add_template_variables(self, variables):
  113. variables['target'] = _(self.role.name)
  114. return variables
  115. def get_table_form(self, request, page_items):
  116. perms = {}
  117. try:
  118. forums = self.role.get_permissions()['forums']
  119. for fid in forums:
  120. perms[str(fid)] = str(forums[fid])
  121. except KeyError:
  122. pass
  123. perms_form = {}
  124. roles_select = [("0", _("No Access"))]
  125. for role in self.roles:
  126. roles_select.append((str(role.pk), _(role.name)))
  127. for item in page_items:
  128. perms_form['forum_' + str(item.pk)] = forms.ChoiceField(choices=roles_select,initial=(perms[str(item.pk)] if str(item.pk) in perms else "0"))
  129. # Turn dict into object
  130. return type('ChangeForumRolesForm', (Form,), perms_form)
  131. def table_action(self, request, page_items, cleaned_data):
  132. perms = {}
  133. for item in page_items:
  134. if cleaned_data['forum_' + str(item.pk)] != "0":
  135. perms[item.pk] = long(cleaned_data['forum_' + str(item.pk)])
  136. print perms
  137. role_perms = self.role.get_permissions()
  138. role_perms['forums'] = perms
  139. self.role.set_permissions(role_perms)
  140. self.role.save(force_update=True)
  141. return Message(_('Forum permissions have been saved.'), 'success'), self.get_url()
  142. def __call__(self, request, slug, target):
  143. try:
  144. self.role = Role.objects.get(id=target)
  145. if self.role and self.role.protected and not request.user.is_god():
  146. request.messages.set_flash(Message(_('Role "%(name)s" is protected, you cannot edit it.') % {'name': _(self.role.name)}), 'error', self.admin.id)
  147. return redirect(reverse('admin_roles'))
  148. except Role.DoesNotExist:
  149. request.set_flash(Message(_('Requested Role could not be found.')), 'error', self.admin.id)
  150. return redirect(reverse('admin_roles'))
  151. self.roles = ForumRole.objects.order_by('name').all()
  152. if not self.roles:
  153. request.set_flash(Message(_('No forum roles are currently set.')), 'error', self.admin.id)
  154. return redirect(reverse('admin_roles'))
  155. return super(Forums, self).__call__(request)
  156. class ACL(FormWidget):
  157. admin = site.get_action('roles')
  158. id = 'acl'
  159. name = _("Change Role Permissions")
  160. fallback = 'admin_roles'
  161. target_name = 'name'
  162. translate_target_name = True
  163. notfound_message = _('Requested Role could not be found.')
  164. submit_fallback = True
  165. template = 'acl_form'
  166. def get_form(self, request, target):
  167. self.form = build_form(request, target)
  168. return self.form
  169. def get_url(self, request, model):
  170. return reverse('admin_roles_acl', model)
  171. def get_edit_url(self, request, model):
  172. return self.get_url(request, model)
  173. def get_initial_data(self, request, model):
  174. raw_acl = model.get_permissions()
  175. initial = {}
  176. for field in self.form.base_fields:
  177. if field in raw_acl:
  178. initial[field] = raw_acl[field]
  179. return initial
  180. def get_and_validate_target(self, request, target):
  181. result = super(ACL, self).get_and_validate_target(request, target)
  182. if result and result.protected and not request.user.is_god():
  183. request.messages.set_flash(Message(_('Role "%(name)s" is protected, you cannot edit it.') % {'name': _(result.name)}), 'error', self.admin.id)
  184. return None
  185. return result
  186. def submit_form(self, request, form, target):
  187. raw_acl = target.get_permissions()
  188. for perm in form.cleaned_data:
  189. raw_acl[perm] = form.cleaned_data[perm]
  190. target.set_permissions(raw_acl)
  191. target.save(force_update=True)
  192. request.monitor['acl_version'] = int(request.monitor['acl_version']) + 1
  193. return target, Message(_('Role "%(name)s" permissions have been changed.') % {'name': self.original_name}, '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, request, target):
  200. if target.token:
  201. return Message(_('You cannot delete system roles.'), 'error'), reverse('admin_roles')
  202. if target.protected and not request.user.is_god():
  203. return Message(_('This role is protected.'), 'error'), reverse('admin_roles')
  204. if target.user_set.count() > 0:
  205. return Message(_('This role is assigned to one or more users.'), 'error'), reverse('admin_roles')
  206. target.delete()
  207. return Message(_('Role "%(name)s" has been deleted.') % {'name': _(target.name)}, 'success'), False