-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathapp.py
163 lines (140 loc) · 6.25 KB
/
app.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
154
155
156
157
158
159
160
161
162
163
from flask_openapi3 import OpenAPI, Info, Tag
from flask import redirect
from urllib.parse import unquote
from sqlalchemy.exc import IntegrityError
from sqlalchemy import func
from model import Session, Planta, Estrato
from schemas import *
from logger import logger
from flask_cors import CORS
info = Info(title="Minha API", version="1.0.0")
app = OpenAPI(__name__, info=info)
CORS(app)
# definindo tags
home_tag = Tag(name="Documentação", description="Seleção de documentação: Swagger, Redoc ou RapiDoc")
planta_tag = Tag(name="Planta", description="Adição, visualização e remoção de plantas à base")
canteiro_tag = Tag(name="Canteiro", description="Seleção de plantas da base para criação de um canteiro")
@app.get('/', tags=[home_tag])
def home():
"""Redireciona para /openapi, tela que permite a escolha do estilo de documentação.
"""
return redirect('/openapi')
@app.post('/planta', tags=[planta_tag],
responses={"200": PlantaViewSchema, "409": ErrorSchema, "400": ErrorSchema})
def add_planta(form: PlantaSchema):
"""Adiciona uma nova Planta à base de dados
Retorna uma representação da planta.
"""
planta = Planta(
nome_planta=form.nome_planta,
tempo_colheita=form.tempo_colheita,
estrato=form.estrato,
espacamento=form.espacamento,
)
logger.debug(f"Adicionando planta de nome: '{planta.nome_planta}'")
try:
# criando conexão com a base
with Session() as session:
# adicionando planta
session.add(planta)
session.commit()
logger.debug(f"Adicionado planta de nome: '{planta.nome_planta}'")
return apresenta_planta(planta), 200
except IntegrityError as e:
# como a duplicidade do nome é a provável razão do IntegrityError
error_msg = "Planta de mesmo nome já salvo na base :/"
logger.warning(f"Erro ao adicionar planta '{planta.nome_planta}', {error_msg}")
return {"mesage": error_msg}, 409
except Exception as e:
# caso um erro fora do previsto
error_msg = "Não foi possível salvar nova planta :/"
logger.warning(f"Erro ao adicionar planta '{planta.nome_planta}', {error_msg}")
return {"mesage": error_msg}, 400
@app.get('/plantas', tags=[planta_tag],
responses={"200": ListagemPlantasSchema, "404": ErrorSchema})
def get_plantas():
"""Faz a busca por todas as Plantas cadastradas
Retorna uma representação da listagem de plantas.
"""
logger.debug(f"Coletando plantas ")
# criando conexão com a base
with Session() as session:
# fazendo a busca
plantas = session.query(Planta).all()
session.commit()
if not plantas:
# se não há plantas cadastradas
return {"plantas": []}, 200
else:
logger.debug(f"%d plantas econtrados" % len(plantas))
# retorna a representação de planta
return apresenta_plantas(plantas), 200
@app.get('/canteiro', tags=[canteiro_tag],
responses={"200": ListagemCanteiroSchema, "404": ErrorSchema})
def get_planta(query: CanteiroBuscaSchema):
"""Faz a busca das plantas selecionadas de um canteiro a partir da nome de cada planta
Retorna uma representação do canteiro.
"""
id_planta_emergente = query.id_planta_emergente
id_planta_alto = query.id_planta_alto
id_planta_medio = query.id_planta_medio
id_planta_baixo = query.id_planta_baixo
listaCanteiro = []
logger.debug(f"""Coletando dados para montar canteiro
#{id_planta_emergente}
#{id_planta_alto}
#{id_planta_medio}
#{id_planta_baixo}
""")
# criando conexão com a base
with Session() as session:
# fazendo a busca
planta_emergente = session.query(Planta, Estrato)\
.join(Estrato, Planta.estrato == Estrato.nome_estrato)\
.filter(Planta.id_planta == id_planta_emergente).first()
listaCanteiro.append(planta_emergente)
planta_alto = session.query(Planta, Estrato)\
.join(Estrato, Planta.estrato == Estrato.nome_estrato)\
.filter(Planta.id_planta == id_planta_alto).first()
listaCanteiro.append(planta_alto)
planta_medio = session.query(Planta, Estrato)\
.join(Estrato, Planta.estrato == Estrato.nome_estrato)\
.filter(Planta.id_planta == id_planta_medio).first()
listaCanteiro.append(planta_medio)
planta_baixo = session.query(Planta, Estrato)\
.join(Estrato, Planta.estrato == Estrato.nome_estrato)\
.filter(Planta.id_planta == id_planta_baixo).first()
listaCanteiro.append(planta_baixo)
session.commit()
if not all(tuple is not None for tuple in listaCanteiro):
# se a planta não foi encontrada
print(listaCanteiro)
error_msg = "erro na seleção de plantas"
logger.warning(f"Erro ao montar canteiro '{listaCanteiro}', {error_msg}")
return {"mesage": error_msg}, 404
else:
logger.debug(f"Canteiro montado: '{listaCanteiro}'")
# retorna a representação da planta
return apresenta_canteiro(listaCanteiro), 200
@app.delete('/planta', tags=[planta_tag],
responses={"200": PlantaDelSchema, "404": ErrorSchema})
def del_planta(query: PlantaBuscaSchema):
"""Deleta uma Planta a partir do nome da planta informada
Retorna uma mensagem de confirmação da remoção.
"""
planta_nome = unquote(unquote(query.nome_planta))
logger.debug(f"Deletando dados sobre planta #{planta_nome}")
# criando conexão com a base
with Session() as session:
# fazendo a remoção
count = session.query(Planta).filter(Planta.nome_planta == planta_nome).delete()
session.commit()
if count:
# retorna a representação da mensagem de confirmação
logger.debug(f"Deletado planta #{planta_nome}")
return {"mesage": "Planta removida", "nome_planta": planta_nome}
else:
# se o planta não foi encontrada
error_msg = "Planta não encontrada na base :/"
logger.warning(f"Erro ao deletar planta #'{planta_nome}', {error_msg}")
return {"message": error_msg}, 404