mixins.py 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. from django import forms
  2. from django.utils import timezone
  3. from django.utils.translation import ungettext_lazy, ugettext_lazy as _
  4. from misago.utils.strings import slugify
  5. class FloodProtectionMixin(object):
  6. def clean(self):
  7. cleaned_data = super(FloodProtectionMixin, self).clean()
  8. if self.request.user.last_post:
  9. diff = timezone.now() - self.request.user.last_post
  10. diff = diff.seconds + (diff.days * 86400)
  11. flood_limit = 35
  12. wait_for = flood - diff
  13. if wait_for > 0:
  14. if wait_for < 5:
  15. raise forms.ValidationError(_("You can't post one message so quickly after another. Please wait a moment and try again."))
  16. else:
  17. raise forms.ValidationError(ungettext(
  18. "You can't post one message so quickly after another. Please wait %(seconds)d second and try again.",
  19. "You can't post one message so quickly after another. Please wait %(seconds)d seconds and try again.",
  20. wait_for) % {
  21. 'seconds': wait_for,
  22. })
  23. return cleaned_data
  24. class ValidateThreadNameMixin(object):
  25. def clean_thread_name(self):
  26. data = self.cleaned_data['thread_name']
  27. slug = slugify(data)
  28. if len(slug) < self.request.settings['thread_name_min']:
  29. raise forms.ValidationError(ungettext_laxy(
  30. "Thread name must contain at least one alpha-numeric character.",
  31. "Thread name must contain at least %(count)d alpha-numeric characters.",
  32. self.request.settings['thread_name_min']
  33. ) % {'count': self.request.settings['thread_name_min']})
  34. if len(data) > self.request.settings['thread_name_max']:
  35. raise forms.ValidationError(ungettext_laxy(
  36. "Thread name cannot be longer than %(count)d character.",
  37. "Thread name cannot be longer than %(count)d characters.",
  38. self.request.settings['thread_name_max']
  39. ) % {'count': self.request.settings['thread_name_max']})
  40. return data
  41. class ValidatePostLengthMixin(object):
  42. def clean_post(self):
  43. data = self.cleaned_data['post']
  44. if len(data) < self.request.settings['post_length_min']:
  45. raise forms.ValidationError(ungettext_laxy(
  46. "Post content cannot be empty.",
  47. "Post content cannot be shorter than %(count)d characters.",
  48. self.request.settings['post_length_min']
  49. ) % {'count': self.request.settings['post_length_min']})
  50. return data