moderation.py 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  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(label=_("Can rename users"))
  14. can_ban_users = forms.YesNoSwitch(label=_("Can ban users"))
  15. max_ban_length = forms.IntegerField(
  16. label=_("Max length, in days, of imposed ban"),
  17. help_text=_("Enter zero to let moderators impose permanent bans."),
  18. min_value=0,
  19. initial=0)
  20. def change_permissions_form(role):
  21. if isinstance(role, Role) and role.special_role != 'anonymous':
  22. return PermissionsForm
  23. else:
  24. return None
  25. """
  26. ACL Builder
  27. """
  28. def build_acl(acl, roles, key_name):
  29. new_acl = {
  30. 'can_rename_users': 0,
  31. 'can_ban_users': 0,
  32. 'max_ban_length': 2,
  33. }
  34. new_acl.update(acl)
  35. return algebra.sum_acls(
  36. new_acl, roles=roles, key=key_name,
  37. can_rename_users=algebra.greater,
  38. can_ban_users=algebra.greater,
  39. max_ban_length=algebra.greater_or_zero
  40. )
  41. """
  42. ACL's for targets
  43. """
  44. @require_target_type(get_user_model())
  45. def add_acl_to_target(user, acl, target):
  46. target.acl_['can_rename'] = can_rename_user(user, target)
  47. target.acl_['can_ban'] = can_ban_user(user, target)
  48. target.acl_['max_ban_length'] = user.acl['max_ban_length']
  49. for permission in ('can_rename', 'can_ban'):
  50. if target.acl_[permission]:
  51. target.acl_['can_moderate'] = True
  52. break
  53. """
  54. ACL tests
  55. """
  56. def allow_rename_user(user, target):
  57. if not user.acl['can_rename_users']:
  58. raise PermissionDenied(_("You can't rename users."))
  59. if not user.is_superuser and (target.is_staff or target.is_superuser):
  60. raise PermissionDenied(_("You can't rename administrators."))
  61. can_rename_user = return_boolean(allow_rename_user)
  62. def allow_ban_user(user, target):
  63. if not user.acl['can_ban_users']:
  64. raise PermissionDenied(_("You can't ban users."))
  65. if target.is_staff or target.is_superuser:
  66. raise PermissionDenied(_("You can't ban administrators."))
  67. can_ban_user = return_boolean(allow_ban_user)