# -*- coding: utf-8 -*-
import json
import logging
import os
from datetime import datetime
import pytz
import sentry_sdk
from flask import Flask, g, redirect, render_template, request, url_for
from flask.sessions import SecureCookieSessionInterface
from flask_login import LoginManager, current_user, login_required
from flask_restplus import Api, Namespace
from sentry_sdk.integrations.flask import FlaskIntegration
from legislei import settings
from legislei.exceptions import (AppError, AvaliacoesModuleError,
InvalidModelId, UsersModuleError)
from legislei.house_selector import (casas_estaduais, casas_municipais,
check_if_house_exists, obter_parlamentar,
obter_parlamentares)
from legislei.models.relatorio import Relatorio
from legislei.models.user import User
from legislei.services.avaliacoes import Avaliacao
from legislei.services.inscricoes import Inscricao
from legislei.services.relatorios import Relatorios
from legislei.services.usuarios import Usuario
app = Flask(__name__, static_url_path='/static')
app.secret_key = os.environ.get('APP_SECRET_KEY')
login_manager = LoginManager()
login_manager.init_app(app)
logging.basicConfig(
format='%(asctime)s - %(levelname)s - %(message)s',
datefmt='%Y-%m-%dT%H:%M:%SZ%z',
level=logging.DEBUG if os.environ.get('DEBUG', 'True').lower() == 'true' else logging.INFO
)
sentry_dsn = os.environ.get("SENTRY_DSN")
if sentry_dsn:
sentry_sdk.init(
dsn=sentry_dsn,
integrations=[FlaskIntegration()]
)
[documentos]@app.route('/')
def home():
return render_template('home.html'), 200
[documentos]class CustomApi(Api):
@property
def specs_url(self):
'''
The Swagger specifications absolute url (ie. `swagger.json`)
:rtype: String
'''
return url_for(self.endpoint('specs'), _external=False)
rest_api = CustomApi(
doc="/swagger",
title="Legislei API",
version="0.1.0",
authorizations={
'apikey': {
'type': 'apiKey',
'in': 'header',
'name': 'Authorization'
}
}
)
rest_api_v1 = Namespace('v1', description='Legislei API')
rest_api.add_namespace(rest_api_v1, "/v1")
rest_api.init_app(app)
[documentos]class CustomSessionInterface(SecureCookieSessionInterface):
"""
Custom session interface for preventing using cookies for REST API
"""
[documentos] def save_session(self, *args, **kwargs):
if g.get('login_via_header'):
return
return super().save_session(*args, **kwargs)
app.session_interface = CustomSessionInterface()
[documentos]@login_manager.request_loader
def load_user_from_request(request):
token = request.headers.get('Authorization')
if token:
user = Usuario().verify_auth_token(token)
if user:
return user
return None
[documentos]@login_manager.user_loader
def load_user(user_id):
return Usuario().obter_por_id(user_id)
[documentos]@app.route('/consultar')
def consultar():
return render_template('consultar_form.html'), 200
[documentos]@app.route('/sobre')
def sobre():
return render_template('sobre.html'), 200
[documentos]@app.route('/privacidade')
def privacidade():
return render_template('politica_privacidade.html'), 200
[documentos]def modelar_pagina_relatorio(relatorio, template='consulta_deputado.html'):
if isinstance(relatorio, tuple) and len(relatorio) == 2:
return relatorio
return render_template(
template,
relatorio=relatorio
), 200
[documentos]@app.route('/relatorio')
def consultar_parlamentar():
try:
relatorio = Relatorios().verificar_relatorio(
parlamentar=request.args['parlamentar'],
data_final=request.args['data'],
cargo=request.args['parlamentarTipo'],
periodo=request.args['dias']
)
if isinstance(relatorio, Relatorio):
return modelar_pagina_relatorio(relatorio.to_dict())
return render_template('relatorio_background.html')
except AppError as e:
return render_template(
'erro.html',
erro_titulo="500 - Erro interno",
erro_descricao=e.message
), 500
except (ValueError, KeyError):
return render_template(
'erro.html',
erro_titulo="400 - Requisição incompleta",
erro_descricao="Parâmetros incompletos ou incorretos."
), 400
[documentos]@app.route('/relatorio/<id>')
def obter_relatorio_por_id(id):
relatorio = Relatorios().obter_por_id(id)
if relatorio:
return modelar_pagina_relatorio(relatorio.to_dict())
else:
return render_template(
'erro.html',
erro_titulo="Relatório não encontrado",
erro_descricao="Esse relatório não existe."
), 400
[documentos]@app.route('/minhasAvaliacoes')
@login_required
def avaliacoes():
email = current_user.email
parlamentares, intervalo = Inscricao().obter_minhas_inscricoes(email)
try:
cargo = request.args['parlamentarTipo']
parlamentar = request.args['parlamentar']
except KeyError:
return render_template(
'avaliacoes_home.html',
parlamentares=parlamentares,
periodo=intervalo
)
parlamentar_dados, avaliacoes_dados, nota = Avaliacao().avaliacoes(
cargo, parlamentar, email)
try:
parlamentar_dados = next(p for p in parlamentares if p.id == parlamentar)
except StopIteration:
pass
return render_template(
'avaliacoes_parlamentar.html',
parlamentar=parlamentar_dados,
avaliacoes=avaliacoes_dados,
nota=nota if nota != None else 0
), 200
[documentos]@app.route('/novaInscricao')
@login_required
def nova_inscricao():
return render_template('nova_inscricao.html')
[documentos]@app.route('/registrar')
def new_user_page():
return render_template('registrar.html')
[documentos]@app.route('/login')
def login_page():
return render_template('login.html')
[documentos]@app.route('/login', methods=['POST'])
def login():
user_name = request.form.get('name')
user_psw = request.form.get('password')
remember_me = True if request.form.get('rememberme') else False
if Usuario().login(user_name, user_psw, remember_me):
return redirect('{}/minhasAvaliacoes'.format(os.environ.get('HOST_ENDPOINT', request.url_root[:-1])))
return render_template('login.html', mensagem='Usuário/senha incorretos')
[documentos]@app.route('/logout')
@login_required
def logout():
Usuario().logout()
return redirect('{}/'.format(os.environ.get('HOST_ENDPOINT', request.url_root[:-1])))
[documentos]@app.errorhandler(500)
def server_error(e):
return render_template(
'erro.html',
erro_titulo="500 - Erro interno do servidor",
erro_descricao="Yep... cometemos um erro, precisamos corrigir. Sorry."
), 500
[documentos]@app.errorhandler(404)
def not_found(e):
return render_template(
'erro.html',
erro_titulo="404 - Página não encontrada",
erro_descricao="O clássico. Definitivamente esse recurso não existe."
), 404
[documentos]@app.errorhandler(400)
def client_error(e):
return render_template(
'erro.html',
erro_titulo="400 - Erro do cliente",
erro_descricao="Aeow, tu não estás fazendo a requisição do jeito certo."
), 400
[documentos]@app.errorhandler(401)
def auth_error(e):
return render_template(
'erro.html',
erro_titulo="401 - Não autorizado",
erro_descricao="Essa página requer usuário autenticado no sistema."
), 401
[documentos]@app.template_filter('cargoNome')
def nome_cargo_filter(model):
if model in ['BR1', 'BR2']:
return 'deputado federal'
if len(model) == 2:
return 'deputado estadual'
return 'vereador'
[documentos]@app.template_filter('cargoCidadeNome')
def nome_cidade_filter(model):
return model.lower().title()
[documentos]@app.template_filter('tojsonforced')
def tojson_filter(obj):
return json.dumps(obj, default=str)