forms.py 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. import floppyforms as forms
  2. from django.utils.translation import ugettext_lazy as _
  3. from misago.apps.threadtype.posting.forms import (NewThreadForm as NewThreadBaseForm,
  4. EditThreadForm as EditThreadBaseForm,
  5. NewReplyForm as NewReplyBaseForm,
  6. EditReplyForm as EditReplyBaseForm)
  7. from misago.forms import Form
  8. from misago.models import User
  9. from misago.utils.strings import slugify
  10. class InviteUsersMixin(object):
  11. def type_fields(self):
  12. self.fields['invite_users'] = forms.CharField(label=_("Invite members to thread"),
  13. max_length=255,
  14. required=False)
  15. def clean_invite_users(self):
  16. self.invite_users = []
  17. usernames = []
  18. slugs = [self.request.user.username_slug]
  19. for username in self.cleaned_data['invite_users'].split(','):
  20. username = username.strip()
  21. slug = slugify(username)
  22. if len(slug) >= 3 and not slug in slugs:
  23. slugs.append(slug)
  24. usernames.append(username)
  25. try:
  26. user = User.objects.get(username_slug=slug)
  27. if not user.acl(self.request).private_threads.can_participate():
  28. raise forms.ValidationError(_('%(user)s cannot participate in private threads.') % {'user': user.username})
  29. if (not self.request.acl.private_threads.can_invite_ignoring() and
  30. not user.allow_pd_invite(self.request.user)):
  31. raise forms.ValidationError(_('%(user)s restricts who can invite him to private threads.') % {'user': user.username})
  32. self.invite_users.append(user)
  33. except User.DoesNotExist:
  34. raise forms.ValidationError(_('User "%(username)s" could not be found.') % {'username': username})
  35. if len(usernames) > 8:
  36. raise forms.ValidationError(_('You cannot invite more than 8 members at single time. Post thread and then invite additional members.'))
  37. return ', '.join(usernames)
  38. class NewThreadForm(NewThreadBaseForm, InviteUsersMixin):
  39. include_thread_weight = False
  40. include_close_thread = False
  41. class EditThreadForm(EditThreadBaseForm):
  42. include_thread_weight = False
  43. include_close_thread = False
  44. class NewReplyForm(NewReplyBaseForm, InviteUsersMixin):
  45. include_thread_weight = False
  46. include_close_thread = False
  47. class EditReplyForm(EditReplyBaseForm):
  48. include_thread_weight = False
  49. include_close_thread = False
  50. class InviteMemberForm(Form):
  51. username = forms.CharField(max_length=200)