Skip to content

Commit 0f588df

Browse files
Implements TVSerieForm using Flask-WTF
1 parent fcff27c commit 0f588df

File tree

6 files changed

+128
-22
lines changed

6 files changed

+128
-22
lines changed

requirements.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,4 @@ Flask-Collect==1.3.2
88
ansible==2.2.0.0
99
Flask-Migrate==2.0.1
1010
psycopg2==2.6.2
11+
Flask-WTF==0.13.1

tvseries/core/forms.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
from flask_wtf import FlaskForm
2+
from wtforms import StringField, DateField
3+
4+
5+
class TVSerieForm(FlaskForm):
6+
name = StringField('name')
7+
description = StringField('description')
8+
episodies_number = StringField('episodies_number')
9+
author = StringField('author')
10+
year = DateField('year')

tvseries/core/templates/add.html

Lines changed: 47 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,68 @@
11
{% extends 'base.html' %}
22
{% block content %}
3-
<form action="" method="post" id="form">
3+
<form action="" method="post" id="form">
4+
{{ form.csrf_token }}
45
<div class="panel panel-default form">
56
<div class="panel-heading">Adicionar série de TV</div>
67
<div class="panel-body">
78
<div class="row">
89
<div class="col-md-6">
910
<div class="form-group">
1011
<label>Nome:</label>
11-
<input type="text" name="serie-name" id="id_serie-name">
12+
{{ form.name }}
13+
{% if form.name.errors %}
14+
<ul>
15+
{% for error in form.name.errors %}
16+
<li>{{ error }}</li>
17+
{% endfor %}
18+
</ul>
19+
{% endif %}
1220
</div>
1321
<div class="form-group">
1422
<label>Descrição:</label>
15-
<input type="text" name="serie-description" id="id_serie-description">
23+
{{ form.description }}
24+
{% if form.description.errors %}
25+
<ul>
26+
{% for error in form.description.errors %}
27+
<li>{{ error }}</li>
28+
{% endfor %}
29+
</ul>
30+
{% endif %}
1631
</div>
1732
<div class="form-group">
1833
<label>Autor:</label>
19-
<input type="text" name="serie-author" id="id_serie-author">
34+
{{ form.author }}
35+
{% if form.author.errors %}
36+
<ul>
37+
{% for error in form.author.errors %}
38+
<li>{{ error }}</li>
39+
{% endfor %}
40+
</ul>
41+
{% endif %}
2042
</div>
2143
<div class="form-group">
2244
<label>Número de episódios:</label>
23-
<input type="text" name="serie-episodies_number" id="id_serie-episodies_number">
24-
</div>
45+
{{ form.episodies_number }}
46+
{% if form.episodies_number.errors %}
47+
<ul>
48+
{% for error in form.episodies_number.errors %}
49+
<li>{{ error }}</li>
50+
{% endfor %}
51+
</ul>
52+
{% endif %}
53+
</div>
54+
<div class="form-group">
55+
<label>Ano:</label>
56+
{{ form.year }}
57+
<small>* formato: YYYY-MM-DD</small>
58+
{% if form.year.errors %}
59+
<ul>
60+
{% for error in form.year.errors %}
61+
<li>{{ error }}</li>
62+
{% endfor %}
63+
</ul>
64+
{% endif %}
65+
</div>
2566
</div>
2667
</div>
2768
</div>

tvseries/core/views.py

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
import os
22
from random import choice
33

4-
from flask import render_template, url_for, redirect, request
4+
from flask import render_template, url_for, redirect
55

66
from tvseries.ext import db
77
from tvseries.core import core_blueprint
88
from tvseries.core.models import TVSerie
9+
from tvseries.core.forms import TVSerieForm
910

1011

1112
@core_blueprint.route('')
@@ -20,16 +21,17 @@ def home(name=None):
2021

2122
@core_blueprint.route('add', methods=['GET', 'POST'])
2223
def add():
23-
if request.method == 'POST':
24-
name = request.form.to_dict().get('serie-name')
25-
description = request.form.to_dict().get('serie-description')
26-
author = request.form.to_dict().get('serie-author')
27-
episodies_number = request.form.to_dict().get('serie-episodes_number')
28-
24+
form = TVSerieForm()
25+
if form.validate_on_submit():
26+
name = form.name.data
27+
description = form.description.data
28+
author = form.author.data
29+
episodies_number = form.episodies_number.data
30+
year = form.year.data
2931
serie = TVSerie(name=name, description=description, author=author,
30-
episodies_number=episodies_number)
32+
episodies_number=episodies_number, year=year)
3133
db.session.add(serie)
3234
db.session.commit()
3335
return redirect('/')
3436

35-
return render_template('add.html')
37+
return render_template('add.html', form=form)

tvseries/tests/test_core.py

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,23 +26,37 @@ def test_get_add_status_code(self):
2626
def test_get_add_content(self):
2727
response = self.client.get("/add")
2828
expected = (
29-
'name="serie-name" id="id_serie-name"',
30-
'name="serie-description" id="id_serie-description"',
31-
'name="serie-author" id="id_serie-author"',
32-
'name="serie-episodies_number" id="id_serie-episodies_number"',
29+
'<input id="name" name="name" type="text" value="">',
30+
'<input id="description" name="description" type="text" value="">',
31+
'<input id="author" name="author" type="text" value="">',
32+
'<input id="episodies_number" name="episodies_number" type="text" value="">',
33+
'<input id="year" name="year" type="text" value="">',
3334
)
3435
for field in expected:
3536
assert field in response.data.decode('utf-8')
3637

3738
def test_post_add(self, db):
3839
response = self.client.post("/add", data={
39-
"serie-name": "Game of Thrones",
40-
"serie-author": "George R.R. Martin",
41-
"serie-description": "Teste",
40+
"name": "Game of Thrones",
41+
"description": "Teste",
42+
"author": "George R.R. Martin",
43+
"episodies_number": "60",
44+
"year": date(2011, 1, 1)
4245
})
4346
result = TVSerie.query.filter(TVSerie.name == 'Game of Thrones')
4447
assert response.status_code == 302 and result.count() == 1
4548

49+
def test_post_add_with_invalid_data(self, db):
50+
response = self.client.post("/add", data={
51+
"name": "Game of Thrones",
52+
"description": "Teste",
53+
"author": "George R.R. Martin",
54+
"episodies_number": "60",
55+
"year": "aaaaaaa"
56+
})
57+
result = TVSerie.query.filter(TVSerie.name == 'Game of Thrones')
58+
assert response.status_code == 200 and result.count() == 0
59+
4660
def test_navbar(self, db):
4761
response = self.client.get("/")
4862
assert ('<nav class="navbar navbar-default"' in

tvseries/tests/test_forms.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
from datetime import date
2+
3+
import pytest
4+
5+
from tvseries.core.forms import TVSerieForm
6+
from tvseries.config import TestConfig
7+
8+
9+
@pytest.mark.usefixtures('client_class')
10+
class TestCoreForms:
11+
12+
@pytest.fixture
13+
def app(self):
14+
from tvseries import create_app
15+
app = create_app(TestConfig)
16+
return app
17+
18+
def test_form_valid(self):
19+
description = (
20+
"Há muito tempo, em um tempo esquecido, uma força "
21+
"destruiu o equilíbrio das estações. Em uma terra "
22+
"onde os verões podem durar vários anos e o inverno "
23+
"toda uma vida, as reivindicações e as forças sobrenaturais "
24+
"correm as portas do Reino dos Sete Reinos. A irmandade "
25+
"da Patrulha da Noite busca proteger o reino de cada "
26+
"criatura que pode vir de lá da Muralha, mas já não tem "
27+
"os recursos necessários para garantir a segurança de "
28+
"todos. Depois de um verão de dez anos, um inverno "
29+
"rigoroso promete chegar com um futuro mais sombrio. "
30+
"Enquanto isso, conspirações e rivalidades correm no jogo "
31+
"político pela disputa do Trono de Ferro, o símbolo do "
32+
"poder absoluto."
33+
)
34+
form_serie = TVSerieForm(name="Game of Thrones",
35+
description=description,
36+
author="George R.R. Martin",
37+
year=date(2011, 1, 1))
38+
assert form_serie.validate()

0 commit comments

Comments
 (0)