profiles.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  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. from misago.users.permissions.decorators import authenticated_only
  9. """
  10. Admin Permissions Form
  11. """
  12. CAN_SEARCH_USERS = forms.YesNoSwitch(
  13. label=_("Can search user profiles"),
  14. initial=1)
  15. CAN_SEE_USER_NAME_HISTORY = forms.YesNoSwitch(
  16. label=_("Can see other members name history"))
  17. CAN_SEE_BAN_DETAILS = forms.YesNoSwitch(
  18. label=_("Can see members bans details"),
  19. help_text=_("Allows users with this permission to see user and "
  20. "staff ban messages."))
  21. class LimitedPermissionsForm(forms.Form):
  22. legend = _("User profiles")
  23. can_search_users = CAN_SEARCH_USERS
  24. can_see_users_name_history = CAN_SEE_USER_NAME_HISTORY
  25. can_see_ban_details = CAN_SEE_BAN_DETAILS
  26. class PermissionsForm(LimitedPermissionsForm):
  27. can_search_users = CAN_SEARCH_USERS
  28. can_follow_users = forms.YesNoSwitch(
  29. label=_("Can follow other users"),
  30. initial=1)
  31. can_be_blocked = forms.YesNoSwitch(
  32. label=_("Can be blocked by other users"),
  33. initial=0)
  34. can_see_users_name_history = CAN_SEE_USER_NAME_HISTORY
  35. can_see_ban_details = CAN_SEE_BAN_DETAILS
  36. can_see_users_emails = forms.YesNoSwitch(
  37. label=_("Can see members e-mails"))
  38. can_see_users_ips = forms.YesNoSwitch(
  39. label=_("Can see members IPs"))
  40. can_see_hidden_users = forms.YesNoSwitch(
  41. label=_("Can see members that hide their presence"))
  42. def change_permissions_form(role):
  43. if isinstance(role, Role):
  44. if role.special_role == 'anonymous':
  45. return LimitedPermissionsForm
  46. else:
  47. return PermissionsForm
  48. else:
  49. return None
  50. """
  51. ACL Builder
  52. """
  53. def build_acl(acl, roles, key_name):
  54. new_acl = {
  55. 'can_search_users': 0,
  56. 'can_follow_users': 1,
  57. 'can_be_blocked': 1,
  58. 'can_see_users_name_history': 0,
  59. 'can_see_ban_details': 0,
  60. 'can_see_users_emails': 0,
  61. 'can_see_users_ips': 0,
  62. 'can_see_hidden_users': 0,
  63. }
  64. new_acl.update(acl)
  65. return algebra.sum_acls(
  66. new_acl, roles=roles, key=key_name,
  67. can_search_users=algebra.greater,
  68. can_follow_users=algebra.greater,
  69. can_be_blocked=algebra.lower,
  70. can_see_users_name_history=algebra.greater,
  71. can_see_ban_details=algebra.greater,
  72. can_see_users_emails=algebra.greater,
  73. can_see_users_ips=algebra.greater,
  74. can_see_hidden_users=algebra.greater
  75. )
  76. """
  77. ACL's for targets
  78. """
  79. @require_target_type(get_user_model())
  80. def add_acl_to_target(user, target):
  81. target_acl = target.acl_
  82. target_acl['can_have_attitude'] = False
  83. target_acl['can_follow'] = can_follow_user(user, target)
  84. target_acl['can_block'] = can_block_user(user, target)
  85. mod_permissions = (
  86. 'can_have_attitude',
  87. 'can_follow',
  88. 'can_block',
  89. )
  90. for permission in mod_permissions:
  91. if target_acl[permission]:
  92. target_acl['can_have_attitude'] = True
  93. break
  94. """
  95. ACL tests
  96. """
  97. @authenticated_only
  98. def allow_follow_user(user, target):
  99. if not user.acl['can_follow_users']:
  100. raise PermissionDenied(_("You can't follow other users."))
  101. if user.pk == target.pk:
  102. raise PermissionDenied(_("You can't add yourself to followed."))
  103. can_follow_user = return_boolean(allow_follow_user)
  104. @authenticated_only
  105. def allow_block_user(user, target):
  106. if target.is_staff or target.is_superuser:
  107. raise PermissionDenied(_("You can't block administrators."))
  108. if user.pk == target.pk:
  109. raise PermissionDenied(_("You can't block yourself."))
  110. if not target.acl['can_be_blocked'] or target.is_superuser:
  111. message = _("%(user)s can't be blocked.") % {'user': target.username}
  112. raise PermissionDenied(message)
  113. can_block_user = return_boolean(allow_block_user)