warnings.py 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. from django.utils.translation import ugettext_lazy as _
  2. import floppyforms as forms
  3. from misago.acl.builder import BaseACL
  4. from misago.acl.exceptions import ACLError403, ACLError404
  5. from misago.forms import YesNoSwitch
  6. def make_form(request, role, form):
  7. if role.special != 'guest':
  8. form.base_fields['can_warn_members'] = forms.BooleanField(label=_("Can warn other members"),
  9. widget=YesNoSwitch, initial=False, required=False)
  10. form.base_fields['can_see_other_members_warns'] = forms.BooleanField(label=_("Can see other members warnings"),
  11. widget=YesNoSwitch, initial=False, required=False)
  12. form.base_fields['can_cancel_warnings'] = forms.BooleanField(label=_("Can cancel warnings"),
  13. widget=forms.Select, initial=0, coerce=int,
  14. choices=(
  15. (0, _("No")),
  16. (1, _("If is warning giver")),
  17. (2, _("Yes, all warnings")),
  18. ))
  19. form.base_fields['can_cancel_warnings_newer_than'] = forms.IntegerField(label=_("Maximum age of warning that can be canceled (in minutes)"),
  20. help_text=_("Enter zero to disable this limitation."),
  21. min_value=0, initial=15)
  22. form.base_fields['can_delete_warnings'] = forms.BooleanField(label=_("Can delete warnings"),
  23. widget=YesNoSwitch, initial=False, required=False)
  24. form.base_fields['can_be_warned'] = forms.BooleanField(label=_("Can be warned"),
  25. widget=YesNoSwitch, initial=False, required=False)
  26. form.fieldsets.append((
  27. _("Warning Members"),
  28. ('can_warn_members', 'can_see_other_members_warns',
  29. 'can_cancel_warnings', 'can_cancel_warnings_newer_than',
  30. 'can_delete_warnings', 'can_be_warned',)
  31. ))
  32. class WarningsACL(BaseACL):
  33. def allow_warning_members(self):
  34. if not self.acl['can_warn_members']:
  35. raise ACLError403(_("You can't warn other members."))
  36. def can_warn_members(self):
  37. try:
  38. self.allow_warning_members()
  39. return True
  40. except ACLError403:
  41. return False
  42. def allow_member_warns_view(self, user, other_user):
  43. try:
  44. if user.pk == other_user.pk:
  45. return
  46. except AttributeError:
  47. pass
  48. if not self.acl['can_see_other_members_warns']:
  49. raise ACLError403(_("You don't have permission to see this member warnings."))
  50. def can_see_member_warns(self, user, other_user):
  51. try:
  52. self.allow_member_warns_view(user, other_user)
  53. return True
  54. except ACLError403:
  55. return False
  56. def allow_warning(self):
  57. if not self.acl['can_be_warned']:
  58. raise ACLError403(_("This member can't be warned."))
  59. def can_be_warned(self):
  60. try:
  61. self.allow_warning()
  62. return True
  63. except ACLError403:
  64. return False
  65. def build(acl, roles):
  66. acl.warnings = WarningsACL()
  67. acl.warnings.acl['can_warn_members'] = False
  68. acl.warnings.acl['can_see_other_members_warns'] = False
  69. acl.warnings.acl['can_be_warned'] = True
  70. acl.warnings.acl['can_cancel_warnings'] = 1
  71. acl.warnings.acl['can_cancel_warnings_newer_than'] = 5
  72. acl.warnings.acl['can_delete_warnings'] = False
  73. for role in roles:
  74. try:
  75. if role['can_warn_members']:
  76. acl.warnings.acl['can_warn_members'] = True
  77. if role['can_see_other_members_warns']:
  78. acl.warnings.acl['can_see_other_members_warns'] = True
  79. if role['can_be_warned']:
  80. acl.warnings.acl['can_be_warned'] = True
  81. if role['can_cancel_warnings'] > acl.warnings.acl['can_cancel_warnings']:
  82. acl.warnings.acl['can_cancel_warnings'] = role['can_cancel_warnings']
  83. if (role['can_cancel_warnings_newer_than'] == 0
  84. or role['can_cancel_warnings_newer_than'] > acl.warnings.acl['can_cancel_warnings_newer_than']):
  85. acl.warnings.acl['can_cancel_warnings_newer_than'] = role['can_cancel_warnings_newer_than']
  86. if role['can_delete_warnings']:
  87. acl.warnings.acl['can_delete_warnings'] = True
  88. except KeyError:
  89. pass