forms.py 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. # -*- coding: utf-8 -*-
  2. """
  3. flaskbb.user.forms
  4. ~~~~~~~~~~~~~~~~~~~~
  5. It provides the forms that are needed for the user views.
  6. :copyright: (c) 2014 by the FlaskBB Team.
  7. :license: BSD, see LICENSE for more details.
  8. """
  9. from flask_login import current_user
  10. from flask_wtf import Form
  11. from wtforms import (StringField, PasswordField, TextAreaField, SelectField,
  12. ValidationError, SubmitField)
  13. from wtforms.validators import (Length, DataRequired, InputRequired, Email,
  14. EqualTo, regexp, Optional, URL)
  15. from flask_babelex import lazy_gettext as _
  16. from flaskbb.user.models import User, PrivateMessage
  17. from flaskbb.extensions import db
  18. from flaskbb.utils.widgets import SelectBirthdayWidget
  19. from flaskbb.utils.fields import BirthdayField
  20. from flaskbb.utils.helpers import check_image
  21. class GeneralSettingsForm(Form):
  22. # The choices for those fields will be generated in the user view
  23. # because we cannot access the current_app outside of the context
  24. language = SelectField(_("Language"))
  25. theme = SelectField(_("Theme"))
  26. submit = SubmitField(_("Save"))
  27. class ChangeEmailForm(Form):
  28. old_email = StringField(_("Old E-Mail Address"), validators=[
  29. DataRequired(message=_("A E-Mail Address is required.")),
  30. Email(message=_("Invalid E-Mail Address."))])
  31. new_email = StringField(_("New E-Mail Address"), validators=[
  32. InputRequired(),
  33. EqualTo('confirm_new_email', message=_("E-Mails must match.")),
  34. Email(message=_("Invalid E-Mail Address."))])
  35. confirm_new_email = StringField(_("Confirm E-Mail Address"), validators=[
  36. Email(message=_("Invalid E-Mail Address."))])
  37. submit = SubmitField(_("Save"))
  38. def __init__(self, user, *args, **kwargs):
  39. self.user = user
  40. kwargs['obj'] = self.user
  41. super(ChangeEmailForm, self).__init__(*args, **kwargs)
  42. def validate_email(self, field):
  43. user = User.query.filter(db.and_(
  44. User.email.like(field.data),
  45. db.not_(User.id == self.user.id))).first()
  46. if user:
  47. raise ValidationError(_("This E-Mail Address is already taken."))
  48. class ChangePasswordForm(Form):
  49. old_password = PasswordField(_("Old Password"), validators=[
  50. DataRequired(message=_("Password required"))])
  51. new_password = PasswordField(_('Password'), validators=[
  52. InputRequired(),
  53. EqualTo('confirm_new_password', message=_('Passwords must match.'))])
  54. confirm_new_password = PasswordField(_('Confirm New Password'))
  55. submit = SubmitField(_("Save"))
  56. def validate_old_password(self, field):
  57. if not current_user.check_password(field.data):
  58. raise ValidationError(_("Old Password is wrong."))
  59. class ChangeUserDetailsForm(Form):
  60. birthday = BirthdayField(_("Birthday"), format="%d %m %Y",
  61. validators=[Optional()],
  62. widget=SelectBirthdayWidget())
  63. gender = SelectField(_("Gender"), default="None", choices=[
  64. ("None", ""),
  65. ("Male", _("Male")),
  66. ("Female", _("Female"))])
  67. location = StringField(_("Location"), validators=[
  68. Optional()])
  69. website = StringField(_("Website"), validators=[
  70. Optional(), URL()])
  71. avatar = StringField(_("Avatar"), validators=[
  72. Optional(), URL()])
  73. signature = TextAreaField(_("Forum Signature"), validators=[
  74. Optional()])
  75. notes = TextAreaField(_("Notes"), validators=[
  76. Optional(), Length(min=0, max=5000)])
  77. submit = SubmitField(_("Save"))
  78. def validate_birthday(self, field):
  79. if field.data is None:
  80. return True
  81. def validate_avatar(self, field):
  82. if field.data is not None:
  83. error, status = check_image(field.data)
  84. if error is not None:
  85. raise ValidationError(error)
  86. return status
  87. class NewMessageForm(Form):
  88. to_user = StringField(_("To User"), validators=[
  89. DataRequired(message=_("A Username is required."))])
  90. subject = StringField(_("Subject"), validators=[
  91. DataRequired(message=_("A Subject is required."))])
  92. message = TextAreaField(_("Message"), validators=[
  93. DataRequired(message=_("A Message is required."))])
  94. send_message = SubmitField(_("Send Message"))
  95. save_message = SubmitField(_("Save Message"))
  96. def validate_to_user(self, field):
  97. user = User.query.filter_by(username=field.data).first()
  98. if not user:
  99. raise ValidationError(_("The Username you entered doesn't exist"))
  100. if user.id == current_user.id:
  101. raise ValidationError(_("You cannot send a PM to yourself."))
  102. def save(self, from_user, to_user, user_id, unread, as_draft=False):
  103. message = PrivateMessage(
  104. subject=self.subject.data,
  105. message=self.message.data,
  106. unread=unread)
  107. if as_draft:
  108. return message.save(from_user, to_user, user_id, draft=True)
  109. return message.save(from_user, to_user, user_id)
  110. class EditMessageForm(NewMessageForm):
  111. pass