profiles.py 4.5 KB

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