warnings.py 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. from django.utils import timezone
  2. from django.utils.translation import ugettext_lazy as _
  3. import floppyforms as forms
  4. from misago.acl.builder import BaseACL
  5. from misago.acl.exceptions import ACLError403, ACLError404
  6. from misago.forms import YesNoSwitch
  7. def make_form(request, role, form):
  8. if role.special != 'guest':
  9. form.base_fields['can_warn_members'] = forms.BooleanField(label=_("Can warn other members"),
  10. widget=YesNoSwitch, initial=False, required=False)
  11. form.base_fields['can_see_other_members_warns'] = forms.BooleanField(label=_("Can see other members warnings"),
  12. widget=YesNoSwitch, initial=False, required=False)
  13. form.base_fields['can_cancel_warnings'] = forms.TypedChoiceField(label=_("Can cancel warnings"),
  14. widget=forms.Select, initial=0, coerce=int,
  15. choices=(
  16. (0, _("No")),
  17. (1, _("If is warning giver")),
  18. (2, _("Yes, all warnings")),
  19. ))
  20. form.base_fields['can_cancel_warnings_newer_than'] = forms.IntegerField(label=_("Maximum age of warning that can be canceled (in minutes)"),
  21. help_text=_("Enter zero to disable this limitation."),
  22. min_value=0, initial=15)
  23. form.base_fields['can_delete_warnings'] = forms.BooleanField(label=_("Can delete warnings"),
  24. widget=YesNoSwitch, initial=False, required=False)
  25. form.base_fields['can_be_warned'] = forms.BooleanField(label=_("Can be warned"),
  26. widget=YesNoSwitch, initial=False, required=False)
  27. form.fieldsets.append((
  28. _("Warning Members"),
  29. ('can_warn_members', 'can_see_other_members_warns',
  30. 'can_cancel_warnings', 'can_cancel_warnings_newer_than',
  31. 'can_delete_warnings', 'can_be_warned',)
  32. ))
  33. class WarningsACL(BaseACL):
  34. def allow_warning_members(self):
  35. if not self.acl['can_warn_members']:
  36. raise ACLError403(_("You can't warn other members."))
  37. def can_warn_members(self):
  38. try:
  39. self.allow_warning_members()
  40. return True
  41. except ACLError403:
  42. return False
  43. def allow_member_warns_view(self, user, other_user):
  44. try:
  45. if user.pk == other_user.pk:
  46. return
  47. except AttributeError:
  48. pass
  49. if not self.acl['can_see_other_members_warns']:
  50. raise ACLError403(_("You don't have permission to see this member warnings."))
  51. def can_see_member_warns(self, user, other_user):
  52. try:
  53. self.allow_member_warns_view(user, other_user)
  54. return True
  55. except ACLError403:
  56. return False
  57. def allow_warning(self):
  58. if not self.acl['can_be_warned']:
  59. raise ACLError403(_("This member can't be warned."))
  60. def can_be_warned(self):
  61. try:
  62. self.allow_warning()
  63. return True
  64. except ACLError403:
  65. return False
  66. def allow_cancel_warning(self, user, owner, warning):
  67. if not self.acl['can_cancel_warnings']:
  68. raise ACLError403(_("You can't cancel warnings."))
  69. if warning.canceled:
  70. raise ACLError403(_("This warning is already canceled."))
  71. if not owner.is_warning_active(warning):
  72. raise ACLError403(_("This warning is no longer in effect."))
  73. try:
  74. if (self.acl['can_cancel_warnings'] == 1 and
  75. user.id != warning.giver_id):
  76. raise ACLError403(_("You can't cancel other moderators warnings."))
  77. except AttributeError:
  78. pass
  79. warning_age = timezone.now() - warning.given_on
  80. warning_age = warning_age.seconds + warning_age.days * 86400
  81. warning_age /= 60
  82. if (self.acl['can_cancel_warnings_newer_than'] > 0 and
  83. self.acl['can_cancel_warnings_newer_than'] < warning_age):
  84. raise ACLError403(_("This warning can no longer be canceled."))
  85. def can_cancel_warning(self, user, owner, warning):
  86. try:
  87. self.allow_cancel_warning(user, owner, warning)
  88. return True
  89. except ACLError403:
  90. return False
  91. def allow_delete_warning(self):
  92. if not self.acl['can_delete_warnings']:
  93. raise ACLError403(_("You can't delete user warnings."))
  94. def can_delete_warnings(self):
  95. try:
  96. self.allow_delete_warning()
  97. return True
  98. except ACLError403:
  99. return False
  100. def build(acl, roles):
  101. acl.warnings = WarningsACL()
  102. acl.warnings.acl['can_warn_members'] = False
  103. acl.warnings.acl['can_see_other_members_warns'] = False
  104. acl.warnings.acl['can_be_warned'] = True
  105. acl.warnings.acl['can_cancel_warnings'] = 0
  106. acl.warnings.acl['can_cancel_warnings_newer_than'] = 5
  107. acl.warnings.acl['can_delete_warnings'] = False
  108. for role in roles:
  109. try:
  110. if role['can_warn_members']:
  111. acl.warnings.acl['can_warn_members'] = True
  112. if role['can_see_other_members_warns']:
  113. acl.warnings.acl['can_see_other_members_warns'] = True
  114. if not role['can_be_warned']:
  115. acl.warnings.acl['can_be_warned'] = False
  116. if role['can_cancel_warnings'] > acl.warnings.acl['can_cancel_warnings']:
  117. acl.warnings.acl['can_cancel_warnings'] = role['can_cancel_warnings']
  118. if (role['can_cancel_warnings_newer_than'] == 0
  119. or role['can_cancel_warnings_newer_than'] > acl.warnings.acl['can_cancel_warnings_newer_than']):
  120. acl.warnings.acl['can_cancel_warnings_newer_than'] = role['can_cancel_warnings_newer_than']
  121. if role['can_delete_warnings']:
  122. acl.warnings.acl['can_delete_warnings'] = True
  123. except KeyError:
  124. pass