moderation.py 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. from django.contrib.auth import get_user_model
  2. from django.core.exceptions import PermissionDenied
  3. from django.utils.translation import ugettext_lazy as _
  4. from misago.acl import algebra
  5. from misago.acl.decorators import require_target_type, return_boolean
  6. from misago.acl.models import Role
  7. from misago.core import forms
  8. """
  9. Admin Permissions Form
  10. """
  11. class PermissionsForm(forms.Form):
  12. legend = _("Users moderation")
  13. can_rename_users = forms.YesNoSwitch(
  14. label=_("Can rename users"))
  15. def change_permissions_form(role):
  16. if isinstance(role, Role) and role.special_role != 'anonymous':
  17. return PermissionsForm
  18. else:
  19. return None
  20. """
  21. ACL Builder
  22. """
  23. def build_acl(acl, roles, key_name):
  24. new_acl = {
  25. 'can_rename_users': 0,
  26. }
  27. new_acl.update(acl)
  28. return algebra.sum_acls(
  29. new_acl, roles=roles, key=key_name,
  30. can_rename_users=algebra.greater
  31. )
  32. """
  33. ACL's for targets
  34. """
  35. @require_target_type(get_user_model())
  36. def add_acl_to_target(user, acl, target):
  37. target.acl_['can_rename'] = can_rename_user(user, target)
  38. if target.acl_['can_rename']:
  39. target.acl_['can_moderate'] = True
  40. """
  41. ACL tests
  42. """
  43. def allow_rename_user(user, target):
  44. if not user.acl['can_rename_users']:
  45. raise PermissionDenied(_("You can't rename users."))
  46. if not user.is_superuser and (target.is_staff or target.is_superuser):
  47. raise PermissionDenied(_("You can't rename administrators."))
  48. can_rename_user = return_boolean(allow_rename_user)