delete.py 3.1 KB

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