forms.py 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  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 (TextField, PasswordField, DateField, TextAreaField,
  12. SelectField, ValidationError)
  13. from wtforms.validators import (Length, Required, Email, EqualTo, regexp,
  14. Optional, URL)
  15. from flaskbb.user.models import User, PrivateMessage
  16. from flaskbb.extensions import db
  17. from flaskbb.utils.widgets import SelectDateWidget
  18. IMG_RE = r'^[^/\\]\.(?:jpg|gif|png)'
  19. is_image = regexp(IMG_RE,
  20. message=("Only jpg, jpeg, png and gifs are allowed!"))
  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. class ChangeEmailForm(Form):
  27. old_email = TextField("Old E-Mail Address", validators=[
  28. Required(message="Email adress required"),
  29. Email(message="This email is invalid")])
  30. new_email = TextField("New E-Mail Address", validators=[
  31. Required(message="Email adress required"),
  32. Email(message="This email is invalid")])
  33. confirm_new_email = TextField("Confirm E-Mail Address", validators=[
  34. Required(message="Email adress required"),
  35. Email(message="This email is invalid"),
  36. EqualTo("new_email", message="E-Mails do not match")])
  37. def __init__(self, user, *args, **kwargs):
  38. self.user = user
  39. kwargs['obj'] = self.user
  40. super(ChangeEmailForm, self).__init__(*args, **kwargs)
  41. def validate_email(self, field):
  42. user = User.query.filter(db.and_(
  43. User.email.like(field.data),
  44. db.not_(User.id == self.user.id))).first()
  45. if user:
  46. raise ValidationError("This email is taken")
  47. class ChangePasswordForm(Form):
  48. old_password = PasswordField("Old Password", validators=[
  49. Required(message="Password required")])
  50. new_password = PasswordField("New Password", validators=[
  51. Required(message="Password required")])
  52. confirm_new_password = PasswordField("Confirm New Password", validators=[
  53. Required(message="Password required"),
  54. EqualTo("new_password", message="Passwords do not match")])
  55. class ChangeUserDetailsForm(Form):
  56. # TODO: Better birthday field
  57. birthday = DateField("Your Birthday", format="%d %m %Y",
  58. widget=SelectDateWidget(), validators=[Optional()])
  59. gender = SelectField("Gender", default="None", choices=[
  60. ("None", ""),
  61. ("Male", "Male"),
  62. ("Female", "Female")])
  63. location = TextField("Location", validators=[
  64. Optional()])
  65. website = TextField("Website", validators=[
  66. Optional(), URL()])
  67. avatar = TextField("Avatar", validators=[
  68. Optional(), URL()])
  69. signature = TextAreaField("Forum Signature", validators=[
  70. Optional()])
  71. notes = TextAreaField("Notes", validators=[
  72. Optional(), Length(min=0, max=5000)])
  73. class NewMessage(Form):
  74. to_user = TextField("To User", validators=[
  75. Required(message="A username is required.")])
  76. subject = TextField("Subject", validators=[
  77. Required(message="A subject is required.")])
  78. message = TextAreaField("Message", validators=[
  79. Required(message="A message is required.")])
  80. def validate_to_user(self, field):
  81. user = User.query.filter_by(username=field.data).first()
  82. if not user:
  83. raise ValidationError("The username you have entered doesn't exist")
  84. if user.id == current_user.id:
  85. raise ValidationError("You cannot send a PM to yourself.")
  86. def save(self, from_user, to_user, user_id, unread, as_draft=False):
  87. message = PrivateMessage(
  88. subject=self.subject.data,
  89. message=self.message.data,
  90. unread=unread)
  91. if as_draft:
  92. return message.save(from_user, to_user, user_id, draft=True)
  93. return message.save(from_user, to_user, user_id)