delete.py 3.1 KB

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