-
Notifications
You must be signed in to change notification settings - Fork 1
/
forms.py
153 lines (115 loc) · 5.07 KB
/
forms.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
from flask_wtf import FlaskForm
from wtforms import (
StringField, TextAreaField, PasswordField, HiddenField)
from wtforms.fields import URLField, EmailField
from flask_wtf.file import FileField
from wtforms.validators import (
InputRequired, Length, Email,
Optional, URL, ValidationError, Regexp)
from models import User
from flask import g
class UserBaseForm(FlaskForm):
email = EmailField("Email", validators=[
InputRequired(message="Email cannot be blank."),
Length(min=5, max=320),
Email(check_deliverability=True,
message="Invalid Email address")])
username = StringField("Username", validators=[
InputRequired(message="Username cannot be blank."),
Length(min=2, max=30)])
class AddUserForm(UserBaseForm):
password = PasswordField("Password", validators=[
InputRequired(message="Password cannot be blank."),
Length(min=8, max=60),
Regexp("^(?=.*[A-Za-z])(?=.*\d)(?=.*[$@$!%*#?&])[A-Za-z\d$@$!%*#?&]{8,}$", message='Please match the given requirements for password.')], # noqa e501
description="Minimum one each - uppercase letter, lowercase letter, number, special character.") # noqa e501
def validate_email(form, field):
"""Make sure email not in use."""
if User.query.filter_by(email=form.email.data).first():
form.email.errors.append(
"Email already associated with account!")
raise ValidationError
def validate_username(form, field):
"""Make sure username not in use."""
if User.query.filter_by(username=form.username.data).first():
form.username.errors.append("Username already taken!")
raise ValidationError
class EditUserForm(UserBaseForm):
"""Edit User Form."""
avatar_url = URLField("Avatar Image URL", validators=[
Length(min=6, max=255), Optional()],
description="Online image address")
banner_url = URLField("Banner Image URL", validators=[
Length(min=6, max=255), Optional()],
description="Online image address")
byline = StringField("User Byline", validators=[
Length(min=2, max=200), Optional()],
description="A short snippet shown under your username")
bio = TextAreaField("User Bio", validators=[
Length(min=2, max=500), Optional()],
description="500 character max")
city = StringField("City", validators=[Length(min=2, max=50), Optional()])
state = StringField("State", validators=[
Length(min=2, max=50), Optional()])
country = StringField("Country", validators=[
Length(min=2, max=50), Optional()])
def validate_email(form, field):
"""Make sure email is not in use
unless it's the current user's email."""
user = User.query.filter_by(email=form.email.data).first()
if user and not user == g.user:
form.email.errors = [
"Email already associated with account!",
*form.email.errors
]
raise ValidationError
def validate_username(form, field):
"""Make sure username is not in use
unless it's the current user's username."""
user = User.query.filter_by(username=form.username.data).first()
if user and not user == g.user:
form.username.errors = [
"Username already taken!",
*form.username.errors
]
raise ValidationError
class LoginForm(FlaskForm):
email = EmailField("Email", validators=[
InputRequired(message="Email cannot be blank."),
Length(min=5, max=320),
Email(check_deliverability=True,
message="Invalid Email address")])
password = PasswordField("Password", validators=[
InputRequired(
message="Password cannot be blank."),
Length(min=8, max=60)])
class ReportBaseForm(FlaskForm):
"""Form for adding new report."""
text = TextAreaField("Report", validators=[
InputRequired(message="Report cannot be blank."),
Length(min=2)])
photo_url = URLField(
"Photo URL", validators=[URL(), Optional()],
description="""
Either enter a photo URL or
choose an image file to include an image.""")
photo_file = FileField(
"Upload Photo", validators=[Optional()],
description="""
Either enter a photo URL or
choose an image file to include an image. 4MB max.""")
def validate(self, **kwargs):
if not super().validate(kwargs):
return False
if self.photo_url.data and self.photo_file.data:
msg = 'Please specify Photo URL or upload a photo, not both'
self.photo_url.errors.append(msg)
self.photo_file.errors.append(msg)
return False
return True
class AddReportForm(ReportBaseForm):
"""Form for adding new report."""
pass
class EditReportForm(ReportBaseForm):
"""Form for editing a report."""
cleared_file = HiddenField('cleared_file')