moderation.py 2.9 KB

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