views.py 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261
  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, 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 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 self.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, model):
  58. return reverse('admin_roles_new')
  59. def get_edit_url(self, model):
  60. return reverse('admin_roles_edit', model)
  61. def submit_form(self, 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, model):
  78. return reverse('admin_roles_edit', model)
  79. def get_edit_url(self, model):
  80. return self.get_url(model)
  81. def get_initial_data(self, model):
  82. if self.request.user.is_god():
  83. return {'name': model.name, 'protected': model.protected}
  84. return {'name': model.name}
  85. def get_and_validate_target(self, target):
  86. result = super(Edit, self).get_and_validate_target(target)
  87. if result and result.protected and not self.request.user.is_god():
  88. self.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, form, target):
  92. target.name = form.cleaned_data['name']
  93. if self.request.user.is_god():
  94. target.protected = form.cleaned_data['protected']
  95. target.save(force_update=True)
  96. self.request.monitor['acl_version'] = int(self.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):
  109. return Forum.objects.get(token='root').get_descendants()
  110. def sort_items(self, page_items, sorting_method):
  111. final_items = []
  112. for forum in Forum.objects.filter(token__in=['annoucements', 'reports', 'private']).order_by('token'):
  113. if forum.token == 'annoucements':
  114. forum.name = _("Global Annoucements")
  115. if forum.token == 'reports':
  116. forum.name = _("Reports")
  117. if forum.token == 'private':
  118. forum.name = _("Private Discussions")
  119. final_items.append(forum)
  120. for forum in page_items.order_by('lft').all():
  121. final_items.append(forum)
  122. return final_items
  123. def add_template_variables(self, variables):
  124. variables['target'] = _(self.role.name)
  125. return variables
  126. def get_table_form(self, page_items):
  127. perms = {}
  128. try:
  129. forums = self.role.get_permissions()['forums']
  130. for fid in forums:
  131. perms[str(fid)] = str(forums[fid])
  132. except KeyError:
  133. pass
  134. perms_form = {}
  135. roles_select = [("0", _("No Access"))]
  136. for role in self.roles:
  137. roles_select.append((str(role.pk), _(role.name)))
  138. for item in page_items:
  139. perms_form['forum_' + str(item.pk)] = forms.ChoiceField(choices=roles_select,initial=(perms[str(item.pk)] if str(item.pk) in perms else "0"))
  140. # Turn dict into object
  141. return type('ChangeForumRolesForm', (Form,), perms_form)
  142. def table_action(self, page_items, cleaned_data):
  143. perms = {}
  144. for item in page_items:
  145. if cleaned_data['forum_' + str(item.pk)] != "0":
  146. perms[item.pk] = long(cleaned_data['forum_' + str(item.pk)])
  147. role_perms = self.role.get_permissions()
  148. role_perms['forums'] = perms
  149. self.role.set_permissions(role_perms)
  150. self.role.save(force_update=True)
  151. return Message(_('Forum permissions have been saved.'), 'success'), self.get_url()
  152. def __call__(self, request, slug, target):
  153. self.request = request
  154. try:
  155. self.role = Role.objects.get(id=target)
  156. if self.role and self.role.protected and not request.user.is_god():
  157. request.messages.set_flash(Message(_('Role "%(name)s" is protected, you cannot edit it.') % {'name': _(self.role.name)}), 'error', self.admin.id)
  158. return redirect(reverse('admin_roles'))
  159. except Role.DoesNotExist:
  160. request.messages.set_flash(Message(_('Requested Role could not be found.')), 'error', self.admin.id)
  161. return redirect(reverse('admin_roles'))
  162. self.roles = ForumRole.objects.order_by('name').all()
  163. if not self.roles:
  164. request.messages.set_flash(Message(_('No forum roles are currently set.')), 'error', self.admin.id)
  165. return redirect(reverse('admin_roles'))
  166. return super(Forums, self).__call__(request)
  167. class ACL(FormWidget):
  168. admin = site.get_action('roles')
  169. id = 'acl'
  170. name = _("Change Role Permissions")
  171. fallback = 'admin_roles'
  172. target_name = 'name'
  173. translate_target_name = True
  174. notfound_message = _('Requested Role could not be found.')
  175. submit_fallback = True
  176. template = 'acl_form'
  177. def get_form(self, target):
  178. self.form = build_form(self.request, target)
  179. return self.form
  180. def get_url(self, model):
  181. return reverse('admin_roles_acl', model)
  182. def get_edit_url(self, model):
  183. return self.get_url(model)
  184. def get_initial_data(self, model):
  185. raw_acl = model.get_permissions()
  186. initial = {}
  187. for field in self.form.base_fields:
  188. if field in raw_acl:
  189. initial[field] = raw_acl[field]
  190. return initial
  191. def get_and_validate_target(self, target):
  192. result = super(ACL, self).get_and_validate_target(target)
  193. if result and result.protected and not self.request.user.is_god():
  194. self.request.messages.set_flash(Message(_('Role "%(name)s" is protected, you cannot edit it.') % {'name': _(result.name)}), 'error', self.admin.id)
  195. return None
  196. return result
  197. def submit_form(self, form, target):
  198. raw_acl = target.get_permissions()
  199. for perm in form.cleaned_data:
  200. raw_acl[perm] = form.cleaned_data[perm]
  201. target.set_permissions(raw_acl)
  202. target.save(force_update=True)
  203. self.request.monitor['acl_version'] = int(self.request.monitor['acl_version']) + 1
  204. return target, Message(_('Role "%(name)s" permissions have been changed.') % {'name': self.original_name}, 'success')
  205. class Delete(ButtonWidget):
  206. admin = site.get_action('roles')
  207. id = 'delete'
  208. fallback = 'admin_roles'
  209. notfound_message = _('Requested Role could not be found.')
  210. def action(self, target):
  211. if target.token:
  212. return Message(_('You cannot delete system roles.'), 'error'), reverse('admin_roles')
  213. if target.protected and not self.request.user.is_god():
  214. return Message(_('This role is protected.'), 'error'), reverse('admin_roles')
  215. if target.user_set.count() > 0:
  216. return Message(_('This role is assigned to one or more users.'), 'error'), reverse('admin_roles')
  217. target.delete()
  218. return Message(_('Role "%(name)s" has been deleted.') % {'name': _(target.name)}, 'success'), False