Código fonte de legislei.controllers.report_controller

import json
import os
from datetime import datetime

import pytz
from flask import request
from flask_login import login_required
from flask_restplus import Resource, abort, fields, reqparse

from legislei.app import current_user, rest_api_v1
from legislei.controllers.dto import reports_dto
from legislei.exceptions import AvaliacoesModuleError
from legislei.house_selector import check_if_house_exists
from legislei.models.relatorio import Relatorio
from legislei.services.avaliacoes import Avaliacao
from legislei.services.relatorios import Relatorios

_reports_query_parser = reqparse.RequestParser()
_reports_query_parser.add_argument('casa', required=True, help="Id de casa legislativa")
_reports_query_parser.add_argument('parlamentar', required=True, help="Id de parlamentar")
_request_report = rest_api_v1.model("RequestReport", {
    'casa': fields.String(description="Id de casa legislativa", required=True),
    'parlamentar': fields.String(description="Id de parlamentar", required=True),
    'data_final': fields.String(description="Data final para o fim do relatório (formato: YYYY-MM-DD)", required=True),
    'intervalo': fields.Integer(description="Intervalo em dias do relatório", required=True)
})
_report_item_rating = rest_api_v1.model("ReportItemRating", {
    'item_id': fields.String(description="Id de item de relatório", required=True),
    'avaliacao': fields.String(description="Avaliação numérica dada ao item", required=True)
})

[documentos]@rest_api_v1.route("/relatorios/<relatorio_id>") class Report(Resource):
[documentos] @rest_api_v1.doc( description="Retorna o relatório informado pelo id", responses={400: "Id de relatório inválido"} ) @rest_api_v1.marshal_with(reports_dto) def get(self, relatorio_id): relatorio = Relatorios().obter_por_id(relatorio_id) if relatorio: return json.loads(relatorio.to_json()) else: abort(400, message="Id de relatório inválido")
[documentos]@rest_api_v1.route("/relatorios/<relatorio_id>/avaliacoes") class ReportRatingList(Resource):
[documentos] @login_required @rest_api_v1.doc( description="Envia uma avaliação a um item de um dado relatório", security="apikey", responses={ 201: 'Criado', 400: 'Parâmetros inválidos', 401: 'Sem autorização' } ) @rest_api_v1.expect(_report_item_rating, validate=True) def post(self, relatorio_id): try: email = current_user.email item_id = request.json['item_id'] score = request.json['avaliacao'] Avaliacao().avaliar(item_id, score, email, relatorio_id) return {'message': 'Criado'}, 201 except AvaliacoesModuleError as e: return {'message': e.message}, 400
[documentos]@rest_api_v1.route("/relatorios/<relatorio_id>/avaliacoes/<avaliacao_id>") class ReportRating(Resource):
[documentos] @login_required @rest_api_v1.doc( description="Deleta uma avaliação de usuário", security="apikey", responses={ 200: 'Sucesso', 400: 'Parâmetros inválidos', 401: 'Sem autorização' } ) def delete(self, relatorio_id, avaliacao_id): try: Avaliacao().deletar_avaliacao(avaliacao_id) return {'message': 'Avaliação deletada'}, 200 except AvaliacoesModuleError as e: return {'message': 'Id de avaliação inválido'}, 400
[documentos]@rest_api_v1.route("/relatorios") class ReportList(Resource):
[documentos] @rest_api_v1.doc( description="Retorna todos os relatórios de um dado parlamentar", responses={400: 'Id de casa legislativa inválido'} ) @rest_api_v1.expect(_reports_query_parser, validate=True) @rest_api_v1.marshal_list_with(reports_dto) def get(self): _reports_query_parser.parse_args() house = request.args.get("casa") assemblyman = request.args.get("parlamentar") if not check_if_house_exists(house): abort(400, message="Id de casa legislativa inválido") resultado = Relatorios().buscar_por_parlamentar(house, assemblyman) return resultado if resultado else []
[documentos] @rest_api_v1.doc( description="Solicita um relatório sobre um dado parlamentar dentro da dada janela de tempo", responses={ 202: 'Geração de relatório aceita', 201: 'Relatório criado', 400: 'Parâmetros inválidos ou incompletos' } ) @rest_api_v1.expect(_request_report, validate=True) def post(self): assemblyman = request.json['parlamentar'] house = request.json['casa'] final_datetime = request.json['data_final'] interval = request.json['intervalo'] try: datetime.strptime(final_datetime, '%Y-%m-%d') except ValueError as e: return { 'errors': { 'data_final': 'Should be in %Y-%m-%d format' }, 'message': 'Input payload validation failed' }, 422 relatorio = Relatorios().solicitar_geracao_relatorio( parlamentar=assemblyman, data_final=final_datetime, cargo=house, periodo=interval ) if isinstance(relatorio, Relatorio): return { 'message': 'Relatório já criado', 'url': '{}/v1/relatorios/{}'.format( os.environ.get('HOST_ENDPOINT', request.url_root[:-1]), relatorio.id ) }, 201 elif relatorio: return {'message': 'Relatório solicitado'}, 202 return {'message': 'Relatório já está sendo processado'}, 202