modusers.py 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  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.core.utils import clean_return_path
  8. from misago.users.forms.admin import BanUsersForm
  9. from misago.users.models import Ban, BAN_EMAIL, BAN_USERNAME
  10. class WarnUserForm(forms.Form):
  11. reason = forms.CharField(label=_("Warning Reason"),
  12. help_text=_("Optional message explaining why "
  13. "this warning was given."),
  14. widget=forms.Textarea(attrs={'rows': 8}),
  15. required=False)
  16. def clean_reason(self):
  17. data = self.cleaned_data['reason']
  18. if len(data) > 2000:
  19. message = _("Warning reason can't be longer than 2000 characters.")
  20. raise forms.ValidationError(message)
  21. return data
  22. class ModerateAvatarForm(forms.ModelForm):
  23. is_avatar_locked = forms.YesNoSwitch(
  24. label=_("Lock avatar"),
  25. help_text=_("Setting this to yes will stop user from "
  26. "changing his/her avatar, and will reset "
  27. "his/her avatar to procedurally generated one."))
  28. avatar_lock_user_message = forms.CharField(
  29. label=_("User message"),
  30. help_text=_("Optional message for user explaining "
  31. "why he/she is banned form changing avatar."),
  32. widget=forms.Textarea(attrs={'rows': 3}),
  33. required=False)
  34. avatar_lock_staff_message = forms.CharField(
  35. label=_("Staff message"),
  36. help_text=_("Optional message for forum team members explaining "
  37. "why user is banned form changing avatar."),
  38. widget=forms.Textarea(attrs={'rows': 3}),
  39. required=False)
  40. class Meta:
  41. model = get_user_model()
  42. fields = [
  43. 'is_avatar_locked',
  44. 'avatar_lock_user_message',
  45. 'avatar_lock_staff_message',
  46. ]
  47. class ModerateSignatureForm(forms.ModelForm):
  48. signature = forms.CharField(
  49. label=_("Signature contents"),
  50. widget=forms.Textarea(attrs={'rows': 3}),
  51. required=False)
  52. is_signature_locked = forms.YesNoSwitch(
  53. label=_("Lock signature"),
  54. help_text=_("Setting this to yes will stop user from "
  55. "making changes to his/her signature."))
  56. signature_lock_user_message = forms.CharField(
  57. label=_("User message"),
  58. help_text=_("Optional message to user explaining "
  59. "why his/hers signature is locked."),
  60. widget=forms.Textarea(attrs={'rows': 3}),
  61. required=False)
  62. signature_lock_staff_message = forms.CharField(
  63. label=_("Staff message"),
  64. help_text=_("Optional message to team members explaining "
  65. "why user signature is locked."),
  66. widget=forms.Textarea(attrs={'rows': 3}),
  67. required=False)
  68. class Meta:
  69. model = get_user_model()
  70. fields = [
  71. 'signature',
  72. 'is_signature_locked',
  73. 'signature_lock_user_message',
  74. 'signature_lock_staff_message'
  75. ]
  76. def clean_signature(self):
  77. data = self.cleaned_data['signature']
  78. length_limit = settings.signature_length_max
  79. if len(data) > length_limit:
  80. raise forms.ValidationError(ungettext(
  81. "Signature can't be longer than %(limit)s character.",
  82. "Signature can't be longer than %(limit)s characters.",
  83. length_limit) % {'limit': length_limit})
  84. return data
  85. class BanForm(BanUsersForm):
  86. def __init__(self, *args, **kwargs):
  87. self.user = kwargs.pop('user')
  88. super(BanForm, self).__init__(*args, **kwargs)
  89. if self.user.acl_['max_ban_length']:
  90. message = ungettext(
  91. "Required. Can't be longer than %(days)s day.",
  92. "Required. Can't be longer than %(days)s days.",
  93. self.user.acl_['max_ban_length'])
  94. message = message % {'days': self.user.acl_['max_ban_length']}
  95. self['valid_until'].field.help_text = message
  96. def clean_valid_until(self):
  97. data = self.cleaned_data['valid_until']
  98. if self.user.acl_['max_ban_length']:
  99. max_ban_length = timedelta(days=self.user.acl_['max_ban_length'])
  100. if not data or data > (timezone.now() + max_ban_length).date():
  101. message = ungettext(
  102. "You can't set bans longer than %(days)s day.",
  103. "You can't set bans longer than %(days)s days.",
  104. self.user.acl_['max_ban_length'])
  105. message = message % {'days': self.user.acl_['max_ban_length']}
  106. raise forms.ValidationError(message)
  107. elif data and data < timezone.now().date():
  108. raise forms.ValidationError(_("Expiration date is in past."))
  109. return data
  110. def ban_user(self):
  111. new_ban = Ban(banned_value=self.user.username,
  112. user_message=self.cleaned_data['user_message'],
  113. staff_message=self.cleaned_data['staff_message'],
  114. valid_until=self.cleaned_data['valid_until'])
  115. new_ban.save()
  116. Ban.objects.invalidate_cache()