forms.py 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  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, DateField, TextAreaField,
  12. SelectField, 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 SelectDateWidget
  19. IMG_RE = r'^[^/\\]\.(?:jpg|gif|png)'
  20. is_image = regexp(IMG_RE,
  21. message=_("Only jpg, jpeg, png and gifs are allowed!"))
  22. class GeneralSettingsForm(Form):
  23. # The choices for those fields will be generated in the user view
  24. # because we cannot access the current_app outside of the context
  25. language = SelectField(_("Language"))
  26. theme = SelectField(_("Theme"))
  27. submit = SubmitField(_("Save"))
  28. class ChangeEmailForm(Form):
  29. old_email = StringField(_("Old E-Mail Address"), validators=[
  30. DataRequired(message=_("A E-Mail Address is required.")),
  31. Email(message=_("Invalid E-Mail Address."))])
  32. new_email = StringField(_("New E-Mail Address"), validators=[
  33. InputRequired(),
  34. EqualTo('confirm_new_email', message=_("E-Mails must match.")),
  35. Email(message=_("Invalid E-Mail Address."))])
  36. confirm_new_email = StringField(_("Confirm E-Mail Address"), validators=[
  37. Email(message=_("Invalid E-Mail Address."))])
  38. submit = SubmitField(_("Save"))
  39. def __init__(self, user, *args, **kwargs):
  40. self.user = user
  41. kwargs['obj'] = self.user
  42. super(ChangeEmailForm, self).__init__(*args, **kwargs)
  43. def validate_email(self, field):
  44. user = User.query.filter(db.and_(
  45. User.email.like(field.data),
  46. db.not_(User.id == self.user.id))).first()
  47. if user:
  48. raise ValidationError(_("This E-Mail Address is already taken."))
  49. class ChangePasswordForm(Form):
  50. old_password = PasswordField(_("Old Password"), validators=[
  51. DataRequired(message=_("Password required"))])
  52. new_password = PasswordField(_('Password'), validators=[
  53. InputRequired(),
  54. EqualTo('confirm_new_password', message=_('Passwords must match.'))])
  55. confirm_new_password = PasswordField(_('Confirm New Password'))
  56. submit = SubmitField(_("Save"))
  57. class ChangeUserDetailsForm(Form):
  58. # TODO: Better birthday field
  59. birthday = DateField(_("Your Birthday"), format="%d %m %Y",
  60. widget=SelectDateWidget(), validators=[Optional()])
  61. gender = SelectField(_("Gender"), default="None", choices=[
  62. ("None", ""),
  63. ("Male", _("Male")),
  64. ("Female", _("Female"))])
  65. location = StringField(_("Location"), validators=[
  66. Optional()])
  67. website = StringField(_("Website"), validators=[
  68. Optional(), URL()])
  69. avatar = StringField(_("Avatar"), validators=[
  70. Optional(), URL()])
  71. signature = TextAreaField(_("Forum Signature"), validators=[
  72. Optional()])
  73. notes = TextAreaField(_("Notes"), validators=[
  74. Optional(), Length(min=0, max=5000)])
  75. submit = SubmitField(_("Save"))
  76. class NewMessageForm(Form):
  77. to_user = StringField(_("To User"), validators=[
  78. DataRequired(message=_("A Username is required."))])
  79. subject = StringField(_("Subject"), validators=[
  80. DataRequired(message=_("A Subject is required."))])
  81. message = TextAreaField(_("Message"), validators=[
  82. DataRequired(message=_("A Message is required."))])
  83. send_message = SubmitField(_("Send Message"))
  84. save_message = SubmitField(_("Save Message"))
  85. def validate_to_user(self, field):
  86. user = User.query.filter_by(username=field.data).first()
  87. if not user:
  88. raise ValidationError(_("The Username you entered doesn't exist"))
  89. if user.id == current_user.id:
  90. raise ValidationError(_("You cannot send a PM to yourself."))
  91. def save(self, from_user, to_user, user_id, unread, as_draft=False):
  92. message = PrivateMessage(
  93. subject=self.subject.data,
  94. message=self.message.data,
  95. unread=unread)
  96. if as_draft:
  97. return message.save(from_user, to_user, user_id, draft=True)
  98. return message.save(from_user, to_user, user_id)
  99. class EditMessageForm(NewMessageForm):
  100. pass