moderation.py 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. from datetime import timedelta
  2. from django.contrib.auth import get_user_model
  3. from django.utils import timezone
  4. from django.utils.translation import ugettext_lazy as _
  5. from django.utils.translation import ungettext
  6. from misago.conf import settings
  7. from misago.core import forms
  8. from ..bans import ban_user
  9. class WarnUserForm(forms.Form):
  10. reason = forms.CharField(label=_("Warning Reason"),
  11. help_text=_("Optional message explaining why "
  12. "this warning was given."),
  13. widget=forms.Textarea(attrs={'rows': 8}),
  14. required=False)
  15. def clean_reason(self):
  16. data = self.cleaned_data['reason']
  17. if len(data) > 2000:
  18. message = _("Warning reason can't be longer than 2000 characters.")
  19. raise forms.ValidationError(message)
  20. return data
  21. class ModerateAvatarForm(forms.ModelForm):
  22. is_avatar_locked = forms.YesNoSwitch()
  23. avatar_lock_user_message = forms.CharField(required=False)
  24. avatar_lock_staff_message = forms.CharField(required=False)
  25. class Meta:
  26. model = get_user_model()
  27. fields = [
  28. 'is_avatar_locked',
  29. 'avatar_lock_user_message',
  30. 'avatar_lock_staff_message',
  31. ]
  32. class ModerateSignatureForm(forms.ModelForm):
  33. signature = forms.CharField(
  34. label=_("Signature contents"),
  35. widget=forms.Textarea(attrs={'rows': 3}),
  36. required=False)
  37. is_signature_locked = forms.YesNoSwitch(
  38. label=_("Lock signature"),
  39. help_text=_("Setting this to yes will stop user from "
  40. "making changes to his/her signature."))
  41. signature_lock_user_message = forms.CharField(
  42. label=_("User message"),
  43. help_text=_("Optional message to user explaining "
  44. "why his/hers signature is locked."),
  45. widget=forms.Textarea(attrs={'rows': 3}),
  46. required=False)
  47. signature_lock_staff_message = forms.CharField(
  48. label=_("Staff message"),
  49. help_text=_("Optional message to team members explaining "
  50. "why user signature is locked."),
  51. widget=forms.Textarea(attrs={'rows': 3}),
  52. required=False)
  53. class Meta:
  54. model = get_user_model()
  55. fields = [
  56. 'signature',
  57. 'is_signature_locked',
  58. 'signature_lock_user_message',
  59. 'signature_lock_staff_message'
  60. ]
  61. def clean_signature(self):
  62. data = self.cleaned_data['signature']
  63. length_limit = settings.signature_length_max
  64. if len(data) > length_limit:
  65. raise forms.ValidationError(ungettext(
  66. "Signature can't be longer than %(limit)s character.",
  67. "Signature can't be longer than %(limit)s characters.",
  68. length_limit) % {'limit': length_limit})
  69. return data
  70. class BanForm(forms.Form):
  71. user_message = forms.CharField(
  72. label=_("User message"), required=False, max_length=1000,
  73. help_text=_("Optional message displayed to user "
  74. "instead of default one."),
  75. widget=forms.Textarea(attrs={'rows': 3}),
  76. error_messages={
  77. 'max_length': _("Message can't be longer than 1000 characters.")
  78. })
  79. staff_message = forms.CharField(
  80. label=_("Team message"), required=False, max_length=1000,
  81. help_text=_("Optional ban message for moderators and administrators."),
  82. widget=forms.Textarea(attrs={'rows': 3}),
  83. error_messages={
  84. 'max_length': _("Message can't be longer than 1000 characters.")
  85. })
  86. expires_on = forms.DateTimeField(
  87. label=_("Expires on"),
  88. required=False, localize=True,
  89. help_text=_('Leave this field empty for this ban to never expire.'))
  90. def __init__(self, *args, **kwargs):
  91. self.user = kwargs.pop('user')
  92. super(BanForm, self).__init__(*args, **kwargs)
  93. if self.user.acl_['max_ban_length']:
  94. message = ungettext(
  95. "Required. Can't be longer than %(days)s day.",
  96. "Required. Can't be longer than %(days)s days.",
  97. self.user.acl_['max_ban_length'])
  98. message = message % {'days': self.user.acl_['max_ban_length']}
  99. self['expires_on'].field.help_text = message
  100. def clean_expires_on(self):
  101. data = self.cleaned_data['expires_on']
  102. if self.user.acl_['max_ban_length']:
  103. max_ban_length = timedelta(days=self.user.acl_['max_ban_length'])
  104. if not data or data > (timezone.now() + max_ban_length).date():
  105. message = ungettext(
  106. "You can't set bans longer than %(days)s day.",
  107. "You can't set bans longer than %(days)s days.",
  108. self.user.acl_['max_ban_length'])
  109. message = message % {'days': self.user.acl_['max_ban_length']}
  110. raise forms.ValidationError(message)
  111. elif data and data < timezone.now().date():
  112. raise forms.ValidationError(_("Expiration date is in past."))
  113. return data
  114. def ban_user(self):
  115. ban_user(self.user,
  116. user_message=self.cleaned_data['user_message'],
  117. staff_message=self.cleaned_data['staff_message'],
  118. expires_on=self.cleaned_data['expires_on'])