forms.py 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  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.ext.login import current_user
  10. from flask.ext.wtf import Form
  11. from wtforms import (StringField, PasswordField, DateField, TextAreaField,
  12. SelectField, ValidationError)
  13. from wtforms.validators import (Length, DataRequired, Email, EqualTo, regexp,
  14. Optional, URL)
  15. from flask.ext.babel 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. class ChangeEmailForm(Form):
  28. old_email = StringField(_("Old E-Mail Address"), validators=[
  29. DataRequired(message=_("E-Mail address required")),
  30. Email(message=_("This E-Mail is invalid"))])
  31. new_email = StringField(_("New E-Mail Address"), validators=[
  32. DataRequired(message=_("E-Mail address required")),
  33. Email(message=_("This E-Mail is invalid"))])
  34. confirm_new_email = StringField(_("Confirm E-Mail Address"), validators=[
  35. DataRequired(message=_("E-Mail adress required")),
  36. Email(message=_("This E-Mail is invalid")),
  37. EqualTo("new_email", message=_("E-Mails do not match"))])
  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 email is taken"))
  48. class ChangePasswordForm(Form):
  49. old_password = PasswordField(_("Old Password"), validators=[
  50. DataRequired(message=_("Password required"))])
  51. new_password = PasswordField(_("New Password"), validators=[
  52. DataRequired(message=_("Password required"))])
  53. confirm_new_password = PasswordField(_("Confirm New Password"), validators=[
  54. DataRequired(message=_("Password required")),
  55. EqualTo("new_password", message=_("Passwords do not match"))])
  56. class ChangeUserDetailsForm(Form):
  57. # TODO: Better birthday field
  58. birthday = DateField(_("Your Birthday"), format="%d %m %Y",
  59. widget=SelectDateWidget(), validators=[Optional()])
  60. gender = SelectField(_("Gender"), default="None", choices=[
  61. ("None", ""),
  62. ("Male", _("Male")),
  63. ("Female", _("Female"))])
  64. location = StringField(_("Location"), validators=[
  65. Optional()])
  66. website = StringField(_("Website"), validators=[
  67. Optional(), URL()])
  68. avatar = StringField(_("Avatar"), validators=[
  69. Optional(), URL()])
  70. signature = TextAreaField(_("Forum Signature"), validators=[
  71. Optional()])
  72. notes = TextAreaField(_("Notes"), validators=[
  73. Optional(), Length(min=0, max=5000)])
  74. class NewMessageForm(Form):
  75. to_user = StringField(_("To User"), validators=[
  76. DataRequired(message=_("A username is required."))])
  77. subject = StringField(_("Subject"), validators=[
  78. DataRequired(message=_("A subject is required."))])
  79. message = TextAreaField(_("Message"), validators=[
  80. DataRequired(message=_("A message is required."))])
  81. def validate_to_user(self, field):
  82. user = User.query.filter_by(username=field.data).first()
  83. if not user:
  84. raise ValidationError(_("The username you entered doesn't exist"))
  85. if user.id == current_user.id:
  86. raise ValidationError(_("You cannot send a PM to yourself."))
  87. def save(self, from_user, to_user, user_id, unread, as_draft=False):
  88. message = PrivateMessage(
  89. subject=self.subject.data,
  90. message=self.message.data,
  91. unread=unread)
  92. if as_draft:
  93. return message.save(from_user, to_user, user_id, draft=True)
  94. return message.save(from_user, to_user, user_id)
  95. class EditMessageForm(NewMessageForm):
  96. pass