delete.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. from datetime import timedelta
  2. from django import forms
  3. from django.contrib.auth import get_user_model
  4. from django.core.exceptions import PermissionDenied
  5. from django.utils import timezone
  6. from django.utils.translation import ugettext_lazy as _
  7. from django.utils.translation import ungettext
  8. from misago.acl import algebra
  9. from misago.acl.decorators import return_boolean
  10. from misago.acl.models import Role
  11. __all__ = [
  12. 'allow_delete_user',
  13. 'can_delete_user',
  14. ]
  15. """
  16. Admin Permissions Form
  17. """
  18. class PermissionsForm(forms.Form):
  19. legend = _("Deleting users")
  20. can_delete_users_newer_than = forms.IntegerField(
  21. label=_("Maximum age of deleted account (in days)"),
  22. help_text=_("Enter zero to disable this check."),
  23. min_value=0,
  24. initial=0
  25. )
  26. can_delete_users_with_less_posts_than = forms.IntegerField(
  27. label=_("Maximum number of posts on deleted account"),
  28. help_text=_("Enter zero to disable this check."),
  29. min_value=0,
  30. initial=0
  31. )
  32. def change_permissions_form(role):
  33. if isinstance(role, Role) and role.special_role != 'anonymous':
  34. return PermissionsForm
  35. else:
  36. return None
  37. """
  38. ACL Builder
  39. """
  40. def build_acl(acl, roles, key_name):
  41. new_acl = {
  42. 'can_delete_users_newer_than': 0,
  43. 'can_delete_users_with_less_posts_than': 0,
  44. }
  45. new_acl.update(acl)
  46. return algebra.sum_acls(
  47. new_acl,
  48. roles=roles,
  49. key=key_name,
  50. can_delete_users_newer_than=algebra.greater,
  51. can_delete_users_with_less_posts_than=algebra.greater
  52. )
  53. """
  54. ACL's for targets
  55. """
  56. def add_acl_to_user(user, target):
  57. target.acl['can_delete'] = can_delete_user(user, target)
  58. if target.acl['can_delete']:
  59. target.acl['can_moderate'] = True
  60. def register_with(registry):
  61. registry.acl_annotator(get_user_model(), add_acl_to_user)
  62. """
  63. ACL tests
  64. """
  65. def allow_delete_user(user, target):
  66. newer_than = user.acl_cache['can_delete_users_newer_than']
  67. less_posts_than = user.acl_cache['can_delete_users_with_less_posts_than']
  68. if not newer_than and not less_posts_than:
  69. raise PermissionDenied(_("You can't delete users."))
  70. if user.pk == target.pk:
  71. raise PermissionDenied(_("You can't delete yourself."))
  72. if target.is_staff or target.is_superuser:
  73. raise PermissionDenied(_("You can't delete administrators."))
  74. if newer_than:
  75. if target.joined_on < timezone.now() - timedelta(days=newer_than):
  76. message = ungettext(
  77. "You can't delete users that are "
  78. "members for more than %(days)s day.", "You can't delete users that are "
  79. "members for more than %(days)s days.", newer_than
  80. ) % {
  81. 'days': newer_than
  82. }
  83. raise PermissionDenied(message)
  84. if less_posts_than:
  85. if target.posts > less_posts_than:
  86. message = ungettext(
  87. "You can't delete users that made more than %(posts)s post.",
  88. "You can't delete users that made more than %(posts)s posts.", less_posts_than
  89. ) % {
  90. 'posts': less_posts_than
  91. }
  92. raise PermissionDenied(message)
  93. can_delete_user = return_boolean(allow_delete_user)