modusers.py 5.9 KB

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