moderation.py 4.7 KB

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