· 6 years ago · Apr 03, 2019, 06:24 PM
1
2from flask import Flask, render_template, request, flash, redirect, url_for
3from flask_sqlalchemy import SQLAlchemy
4from flask_migrate import Migrate
5from flask_wtf import FlaskForm
6from werkzeug.security import generate_password_hash, check_password_hash
7from wtforms import StringField, PasswordField, SubmitField, IntegerField
8from wtforms.validators import InputRequired, Email, Length, ValidationError, EqualTo
9from flask_bootstrap import Bootstrap
10from flask_login import UserMixin, LoginManager, login_user, logout_user, login_required
11from datetime import timedelta, datetime
12
13app = Flask(__name__)
14app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///meudb.db'
15app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
16app.config['SECRET_KEY'] = '5fbc1554-8b78-4080-98b4-5035b8469fee-042c5b51-5024-4bd5-af69-d2ab00debd6b'
17# Gerar o secret-key com o UUID
18db = SQLAlchemy(app) # inicializa o ORM
19migrate = Migrate(app, db) # inicializa as migrations
20bootstrap = Bootstrap(app) # inicializa o Bootstrap
21
22login_manager = LoginManager(app)
23login_manager.login_view = 'login_get'
24
25@login_manager.user_loader
26def load_user(user_id):
27 return Usuario.query.filter_by(id=user_id).first()
28
29PERIODO_EMPRESTIMO = timedelta(days=7)
30
31emprestimo = db.Table('emprestimos',
32 db.Column('id',db.Integer, primary_key=True),
33 db.Column('usuario_id',db.Integer, db.ForeignKey('usuarios.id')),
34 db.Column('livro_id',db.Integer, db.ForeignKey('livros.id')),
35 db.Column('data_emprestimo',db.DateTime(),default=datetime.now),
36 db.Column('data_provavel_devolucao',db.DateTime(),default=datetime.now()+PERIODO_EMPRESTIMO),
37 db.Column('data_efetiva_devolucao',db.DateTime())
38 )
39
40class Usuario(db.Model, UserMixin):
41 __tablename__ = 'usuarios'
42 id = db.Column(db.Integer, primary_key=True)
43 nome = db.Column(db.String(250))
44 email = db.Column(db.String(250))
45 password_hash = db.Column(db.String(250))
46 telefone = db.Column(db.String(50))
47 cpf = db.Column(db.String(20))
48
49 def __repr__(self):
50 return '<Usuario: {}>'.format(self.nome)
51
52 def __init__(self, nome,email,password,telefone, cpf):
53 self.nome = nome
54 self.email = email
55 self.password_hash = generate_password_hash(password)
56 self.telefone = telefone
57 self.cpf = cpf
58
59class Livro(db.Model):
60 __tablename__ = 'livros'
61 id = db.Column(db.Integer, primary_key=True)
62 autor = db.Column(db.String(250))
63 titulo = db.Column(db.String(250))
64 isbn = db.Column(db.String(250))
65 editora = db.Column(db.String(150))
66 sinopse = db.Column(db.String(2048))
67 ano = db.Column(db.Integer)
68
69 def __repr__(self):
70 return '<Livro: {} /{} >'.format(self.titulo, self.ano)
71
72 def __init__(self, autor,titulo,isbn,editora,sinopse,ano):
73 self.autor = autor
74 self.titulo = titulo
75 self.isbn = isbn
76 self.editora = editora
77 self.sinopse = sinopse
78 self.ano = ano
79
80class InsereUsuarioForm(FlaskForm):
81 nome = StringField('Nome',validators=[InputRequired(),Length(min=3)])
82 email = StringField('Email',validators=[InputRequired(),Email(message='Insira um email válido.')])
83 password = PasswordField('Senha',validators=[InputRequired(),Length(min=6)])
84 password1 = PasswordField('Confirme a senha',validators=[InputRequired(), EqualTo('password')])
85 telefone = StringField('Telefone',validators=[InputRequired(),Length(min=6)])
86 cpf = StringField('CPF',validators=[InputRequired(),Length(min=11,max=11)])
87 enviar = SubmitField('Enviar')
88
89def check_year(form, field): # Validador WTF NOVO!
90 y = datetime.today().year
91 if field.data > y:
92 raise ValidationError('O campo deve estar com valor inferior ou igual ao ano corrente. ')
93
94class InsereLivroForm(FlaskForm):
95 autor = StringField('Autor',validators=[InputRequired(),Length(min=3)])
96 titulo = StringField('Titulo',validators=[InputRequired()])
97 isbn = StringField('ISBN',validators=[InputRequired(),Length(min=6)])
98 editora = StringField('Editora',validators=[InputRequired(),Length(min=6)])
99 ano = IntegerField('Ano',validators=[InputRequired(), check_year])
100 sinopse = StringField('Sinopse',validators=[InputRequired(),Length(min=20,max=2048)])
101 enviar = SubmitField('Enviar')
102
103class LoginForm(FlaskForm):
104 email = StringField('Email',validators=[InputRequired(),Email(message='Insira um email válido.')],render_kw={"placeholder": "Entre com seu email"})
105 senha = PasswordField('Senha',validators=[InputRequired()],render_kw={"placeholder": "Insira a sua senha"})
106 enviar = SubmitField('Login', render_kw={"_class": "btn btn-info"} )
107
108@app.errorhandler(404)
109def page_not_found(error):
110 return render_template('404.tpl'), 404
111
112@app.route('/')
113def index():
114 return render_template('index.tpl')
115
116@app.route('/usuarios')
117@login_required
118def lista_usuarios():
119 dados = Usuario.query.all()
120 return render_template('usuarios.tpl', dadostpl = dados)
121
122@app.route('/usuarioadd',methods=['GET'])
123@login_required
124def add_usuario_get():
125 form = InsereUsuarioForm()
126 return render_template('add_usuario.tpl', formtpl = form)
127
128
129@app.route('/usuarioadd',methods=['POST'])
130@login_required
131def add_usuario_post():
132 form = InsereUsuarioForm(request.form)
133 if form.validate_on_submit():
134 novo_usuario = Usuario( nome = form.nome.data,
135 email = form.email.data,
136 password = form.password.data,
137 telefone = form.telefone.data,
138 cpf = form.cpf.data)
139 db.session.add(novo_usuario)
140 db.session.commit()
141 flash('Usuário inserido com sucesso.','success')
142 else :
143 flash('Não inserido. Problemas nos dados.'+str(form.errors),'danger')
144 return redirect('/usuarios')
145
146@app.route('/usuarioedit/<_id>',methods=['GET'])
147@login_required
148def edit_usuario_get(_id):
149 u = Usuario.query.filter_by(id=_id).first()
150 form = InsereUsuarioForm(obj=u)
151 return render_template('edit_usuario.tpl', formtpl = form, _id = _id)
152
153
154@app.route('/usuarioedit/<_id>',methods=['POST'])
155@login_required
156def edit_usuario_post(_id):
157 form = InsereUsuarioForm(request.form)
158 u = Usuario.query.filter_by(id=_id).first()
159 if form.validate_on_submit():
160 form.populate_obj(u)
161 db.session.commit()
162 flash('Usuário alterado com sucesso.','success')
163 else :
164 flash('Não alterado. Problemas nos dados.'+str(form.errors),'danger')
165 return redirect('/usuarios')
166
167@app.route('/usuarioview/<_id>',methods=['GET'])
168@login_required
169def view_usuario_get(_id):
170 u = Usuario.query.filter_by(id=_id).first()
171 return render_template('view_usuario.tpl', d = u)
172
173@app.route('/usuariodel/<_id>',methods=['GET'])
174@login_required
175def del_usuario_get(_id):
176 u = Usuario.query.filter_by(id=_id).first()
177 return render_template('del_usuario.tpl', d = u)
178
179@app.route('/usuariodel/<_id>',methods=['POST'])
180@login_required
181def del_usuario_post(_id):
182 u = Usuario.query.filter_by(id=_id).first()
183 db.session.delete(u)
184 db.session.commit()
185 flash('Usuário excluÃdo com sucesso.','success')
186 return redirect('/usuarios')
187
188###################################
189
190@app.route('/livros')
191def lista_livros():
192 dados = Livro.query.all()
193 return render_template('livros.tpl', dadostpl = dados)
194
195@app.route('/livroadd',methods=['GET'])
196@login_required
197def add_livro_get():
198 form = InsereLivroForm()
199 return render_template('add_livro.tpl', formtpl = form)
200
201
202@app.route('/livroadd',methods=['POST'])
203@login_required
204def add_livro_post():
205 form = InsereLivroForm(request.form)
206 if form.validate_on_submit():
207 novo_livro = Livro( autor = form.autor.data,
208 titulo = form.titulo.data,
209 isbn = form.isbn.data,
210 editora = form.editora.data,
211 ano = form.ano.data,
212 sinopse = form.sinopse.data)
213 db.session.add(novo_livro)
214 db.session.commit()
215 flash('Livro inserido com sucesso.','success')
216 else :
217 flash('Não inserido. Problemas nos dados.'+str(form.errors),'danger')
218 return redirect('/livros')
219
220@app.route('/livroedit/<_id>',methods=['GET'])
221@login_required
222def edit_livro_get(_id):
223 u = Livro.query.filter_by(id=_id).first()
224 form = InsereLivroForm(obj=u)
225 return render_template('edit_livro.tpl', formtpl = form, _id = _id)
226
227
228@app.route('/livroedit/<_id>',methods=['POST'])
229@login_required
230def edit_livro_post(_id):
231 form = InsereLivroForm(request.form)
232 u = Livro.query.filter_by(id=_id).first()
233 if form.validate_on_submit():
234 form.populate_obj(u)
235 db.session.commit()
236 flash('Livro alterado com sucesso.','success')
237 else :
238 flash('Não alterado. Problemas nos dados.'+str(form.errors),'danger')
239 return redirect('/livros')
240
241@app.route('/livroview/<_id>',methods=['GET'])
242def view_livro_get(_id):
243 u = Livro.query.filter_by(id=_id).first()
244 return render_template('view_livro.tpl', d = u)
245
246@app.route('/livrodel/<_id>',methods=['GET'])
247@login_required
248def del_livro_get(_id):
249 u = Livro.query.filter_by(id=_id).first()
250 return render_template('del_livro.tpl', d = u)
251
252@app.route('/livrodel/<_id>',methods=['POST'])
253@login_required
254def del_livro_post(_id):
255 u = Livro.query.filter_by(id=_id).first()
256 db.session.delete(u)
257 db.session.commit()
258 flash('Livro excluÃdo com sucesso.','success')
259 return redirect('/livros')
260
261@app.route('/login',methods=['GET'])
262def login_get():
263 form = LoginForm()
264 return render_template('login.tpl', formtpl = form)
265
266@app.route('/login',methods=['POST'])
267def login_post():
268 form = LoginForm(request.form)
269 if form.validate_on_submit():
270 usuario = Usuario.query.filter_by(email=form.email.data).first() # None se não encontrar
271 if usuario is not None:
272 if check_password_hash(usuario.password_hash,form.senha.data):
273 login_user(usuario)
274 return redirect(url_for('index'))
275 print('Login OK')
276 else:
277 flash('Usuário ou senha incorretos.', 'danger')
278 print('Login NOK1')
279 else:
280 flash('Usuário ou senha incorretos.', 'danger')
281 print('Login NOK2')
282 else:
283 msg ='Dados incorretos.'+str(form.errors)
284 flash(msg , 'danger')
285 print('Login NOK3')
286 return redirect(url_for('login_get'))
287
288@app.route('/logout',methods=['GET'])
289def logout():
290 logout_user()
291 return redirect( url_for('login_get'))
292
293if __name__ == "__main__":
294 app.run()