Exemplo n.º 1
0
    def test_send_push_notification_message_too_big_sucess(self, mock_urllib3):
        def assert_equal(actual, expected):
            self.assertEqual(actual, expected)

        class FakePoolManager:
            def __init__(self, *args, **kwargs):
                FakePoolManager.call_count = 0

            def request(self, method, url, headers, body):
                class responseFail():
                    status = 200
                    data = json.dumps({
                        'results': [{
                            'error': 'MessageTooBig'
                        }]
                    }).encode('utf-8')

                class responseSucess():
                    status = 200
                    data = json.dumps({
                        'results': [{
                            'id': '123'
                        }]
                    }).encode('utf-8')

                FakePoolManager.call_count += 1
                assert_equal(method, "POST")
                assert_equal(url, "https://fcm.googleapis.com/fcm/send")
                if 'reportsIds' in body.decode('utf-8'):
                    return responseSucess()
                return responseFail()

        data_inicial = datetime(2019, 10, 12)
        data_final = datetime(2019, 10, 19)
        parlamentar1 = Parlamentar(id='1', cargo='BR1', nome='AMANDA')
        relatorio1 = Relatorio(
            id="123",
            parlamentar=parlamentar1,
            data_final=data_final,
            data_inicial=data_inicial,
            proposicoes=[
                Proposicao(id="1"),
                Proposicao(id="2"),
                Proposicao(id="3"),
                Proposicao(id="4")
            ],
            eventos_presentes=[Evento(id="1"), Evento(id="2")],
            eventos_previstos=None,
            eventos_ausentes=[Evento(id="4"),
                              Evento(id="5"),
                              Evento(id="6")])

        mock_urllib3.side_effect = FakePoolManager

        result = send_push_notification("token", [relatorio1.to_dict()])

        self.assertTrue(mock_urllib3.called)
        self.assertEqual(2, mock_urllib3.side_effect.call_count)
        self.assertTrue(result)
 def obter_proposicoes_parlamentar(self, parlamentar_id, data_inicial,
                                   data_final):
     projetos = self.ver.obterProjetosParlamentar(parlamentar_id,
                                                  data_final.year)
     projetos_ids = [
         '{}{}{}'.format(x['tipo'], x['numero'], x['ano']) for x in projetos
     ]
     for projeto in self.ver.obterProjetosDetalhes(data_final.year):
         try:
             if '{}{}{}'.format(projeto['tipo'], projeto['numero'],
                                projeto['ano']) in projetos_ids:
                 projeto_data = datetime.strptime(projeto['data'],
                                                  '%Y-%m-%dT%H:%M:%S')
                 logging.debug(projeto_data)
                 if not (projeto_data >= data_inicial
                         and projeto_data <= data_final):
                     continue
                 proposicao = Proposicao()
                 proposicao.data_apresentacao = self.brasilia_tz.localize(
                     projeto_data)
                 proposicao.ementa = projeto['ementa']
                 proposicao.id = projeto['chave']
                 proposicao.tipo = projeto['tipo']
                 proposicao.numero = '{}{}'.format(projeto['numero'],
                                                   projeto['ano'])
                 proposicao.url_documento = (
                     'http://documentacao.saopaulo.sp.leg.br/cgi-bin/wxis.bin/iah/scripts/?IsisScript=iah.xis&lang=pt&format=detalhado.pft&base=proje&form=A&nextAction=search&indexSearch=^nTw^lTodos%20os%20campos&exprSearch=P={tipo}{numero}{ano}'
                     .format(tipo=projeto['tipo'],
                             numero=projeto['numero'],
                             ano=projeto['ano']))
                 proposicao.url_autores = proposicao.url_documento
                 self.relatorio.proposicoes.append(proposicao)
         except Exception as e:
             #TODO
             logging.error(e)
Exemplo n.º 3
0
 def obterProposicoesDeputado(self, dep_id, data_inicial, data_final):
     proposicoes_deputado = []
     logging.debug('[ALESP] Obtendo tipos de documentos...')
     tipos_documentos = self.prop.obterNaturezaDocumentos()
     logging.debug('[ALESP] Obtendo autores...')
     for autor in self.prop.obterTodosAutoresProposicoes():
         if str(autor['idAutor']) == str(dep_id):
             proposicoes_deputado.append(autor['idDocumento'])
     logging.debug('[ALESP] {} proposições obtidas'.format(
         len(proposicoes_deputado)))
     logging.debug('[ALESP] Obtendo proposicoes...')
     for propositura in self.prop.obterTodasProposicoes():
         if not (propositura['dataEntrada']):
             continue
         data_prop = self.obterDatetimeDeStr(propositura['dataEntrada'])
         if (data_prop > data_inicial and data_prop < data_final
                 and propositura['id'] in proposicoes_deputado):
             proposicao = Proposicao()
             proposicao.id = propositura['id']
             proposicao.url_documento = 'https://www.al.sp.gov.br/propositura/?id={}'.format(
                 propositura['id'])
             proposicao.data_apresentacao = self.brasilia_tz.localize(
                 data_prop)
             proposicao.ementa = propositura['ementa']
             proposicao.numero = propositura['numero']
             if propositura['idNatureza']:
                 for t in tipos_documentos:
                     if t['id'] == propositura['idNatureza']:
                         proposicao.tipo = t['sigla']
             self.relatorio.proposicoes.append(proposicao)
Exemplo n.º 4
0
    def test_build_proposition(self):
        proposition = {
            'id':
            123,
            'dataApresentacao':
            '2018-10-25T00:00',
            'ementa':
            'Dá nova redação ao artigo tal da Constituição Federal',
            'numero':
            14,
            'ano':
            2019,
            'siglaTipo':
            'PEC',
            'urlInteiroTeor':
            'http://www.camara.gov.br/proposicoesWeb/prop_mostrarintegra?codteor=141414',
            'uriAutores':
            'https://dadosabertos.camara.leg.br/api/v2/proposicoes/123/autores'
        }
        expected = Proposicao(id='123',
                              data_apresentacao=self.dep.get_brt(
                                  datetime(2018, 10, 25)),
                              ementa=proposition['ementa'],
                              numero='14',
                              tipo='PEC',
                              url_documento=proposition['urlInteiroTeor'],
                              url_autores=proposition['uriAutores'],
                              pauta=proposition['ementa'])

        actual = self.dep.build_proposition(proposition)

        self.assertEqual(expected, actual)
Exemplo n.º 5
0
    def test_send_push_notification_invalid_json_response(self, mock_urllib3):
        def assert_equal(actual, expected):
            self.assertEqual(actual, expected)

        class FakePoolManager:
            def __init__(self, *args, **kwargs):
                FakePoolManager.call_count = 0

            def request(self, method, url, headers, body):
                class response():
                    status = 401
                    data = '<HTML><HEAD><TITLE>Invalid (legacy) Server-key delivered or Sender is not authorized to perform request.</TITLE></HEAD><BODY BGCOLOR="#FFFFFF" TEXT="#000000"><H1>Invalid (legacy) Server-key delivered or Sender is not authorized to perform request.</H1><H2>Error 401</H2></BODY></HTML>'.encode(
                        'utf-8')

                FakePoolManager.call_count += 1
                assert_equal(method, "POST")
                assert_equal(url, "https://fcm.googleapis.com/fcm/send")
                return response()

        data_inicial = datetime(2019, 10, 12)
        data_final = datetime(2019, 10, 19)
        parlamentar1 = Parlamentar(id='1', cargo='BR1', nome='AMANDA')
        relatorio1 = Relatorio(
            id="123",
            parlamentar=parlamentar1,
            data_final=data_final,
            data_inicial=data_inicial,
            proposicoes=[
                Proposicao(id="1"),
                Proposicao(id="2"),
                Proposicao(id="3"),
                Proposicao(id="4")
            ],
            eventos_presentes=[Evento(id="1"), Evento(id="2")],
            eventos_previstos=None,
            eventos_ausentes=[Evento(id="4"),
                              Evento(id="5"),
                              Evento(id="6")])

        mock_urllib3.side_effect = FakePoolManager

        result = send_push_notification("token", [relatorio1.to_dict()])

        self.assertTrue(mock_urllib3.called)
        self.assertEqual(1, mock_urllib3.side_effect.call_count)
        self.assertFalse(result)
Exemplo n.º 6
0
    def build_proposition(self, prop_info):
        """
        Builds a proposition object with given proposition info

        :param prop_info: Proposition information
        :type prop_info: Dict
        :return: Proposition object
        :rtype: Proposicao
        """
        proposition = Proposicao()
        proposition.id = str(prop_info['id'])
        proposition.data_apresentacao = self.get_brt(
            self._parse_datetime(prop_info.get('dataApresentacao')))
        proposition.ementa = prop_info.get('ementa')
        proposition.numero = str(prop_info.get('numero'))
        proposition.tipo = prop_info.get('siglaTipo')
        proposition.url_documento = prop_info.get('urlInteiroTeor')
        proposition.url_autores = prop_info.get('uriAutores')
        proposition.pauta = prop_info.get('ementa')
        return proposition
Exemplo n.º 7
0
 def obterEventosPresentes(self, dep_id, data_inicial, data_final, reunioes,
                           comissoes, orgaos_nomes):
     eventos_todos = self.com.obterReunioesComissoes()
     presencas = self.com.obterPresencaReunioesComissoes()
     presencas = [x for x in presencas if x["idDeputado"] == dep_id]
     presencas_reunioes_id = [x["idReuniao"] for x in presencas]
     for e in eventos_todos:
         if (self.obterDatetimeDeStr(e["data"]) > data_inicial
                 and self.obterDatetimeDeStr(e["data"]) < data_final):
             evento = Evento()
             evento.id = e['id']
             evento.data_inicial = self.brasilia_tz.localize(
                 self.obterDatetimeDeStr(e["data"]))
             evento.nome = e['convocacao']
             evento.situacao = e['situacao']
             if e['id'] in reunioes:
                 for r in reunioes[e['id']]:
                     proposicao = Proposicao()
                     proposicao.id = r['idDocumento']
                     proposicao.pauta = r['idDocumento']
                     proposicao.url_documento = \
                         'https://www.al.sp.gov.br/propositura/?id={}'.format(r['idDocumento'])
                     proposicao.voto = self.obterVotoDescritivo(r['voto'])
                     proposicao.tipo = r['idDocumento']
                     evento.pautas.append(proposicao)
             orgao = Orgao()
             orgao.nome = comissoes[e['idComissao']]['nome']
             orgao.apelido = comissoes[e['idComissao']]['sigla']
             evento.orgaos.append(orgao)
             if e["id"] in presencas_reunioes_id:
                 evento.set_presente()
                 self.relatorio.eventos_presentes.append(evento)
             else:
                 evento.set_ausencia_evento_nao_esperado()
                 if (comissoes[e["idComissao"]]["sigla"] in orgaos_nomes
                         and e['situacao'].lower() in [
                             'em preparação', 'em preparacao', 'realizada',
                             'encerrada'
                         ]):
                     evento.set_ausente_evento_previsto()
                     self.relatorio.eventos_previstos.append(evento)
                 self.relatorio.eventos_ausentes.append(evento)
Exemplo n.º 8
0
    def test_add_attended_events(self):
        events_attended = [
            Evento(id='3',
                   data_inicial=self.dep.helper.get_brt(datetime(2019, 12,
                                                                 10)),
                   data_final=self.dep.helper.get_brt(datetime(2019, 12, 17))),
            Evento(id='4',
                   data_inicial=self.dep.helper.get_brt(datetime(2019, 12,
                                                                 10)),
                   data_final=self.dep.helper.get_brt(datetime(2019, 12, 17)))
        ]
        mock_ev = Mocker(self.dep.helper.ev)
        mock_prop = Mocker(self.dep.helper.prop)
        mock_ev.add_response("obterPautaEvento", [
            {
                'codRegime': '123',
                'proposicao_': {
                    'id': '11'
                }
            },
            {
                'codRegime': '123',
                'proposicao_': {
                    'id': '12'
                }
            },
        ])
        mock_ev.add_exception("obterPautaEvento", CamaraDeputadosError)
        mock_prop.add_response(
            "obterProposicao", {
                'id': '11',
                'nome': 'Proposição I',
                'ementa': 'Proposição I',
                'numero': '11',
                'ano': 2019
            })
        mock_prop.add_exception("obterProposicao", CamaraDeputadosError)
        mock_prop.add_response("obterVotacoesProposicao", [{
            'data':
            '15/12/2019',
            'hora':
            '12:00',
            'resumo':
            'Votação 1',
            'votos': [
                {
                    'id': '23456',
                    'voto': 'Não'
                },
                {
                    'id': '12345',
                    'voto': 'Sim'
                },
                {
                    'id': '34567',
                    'voto': 'Abstenção'
                },
            ]
        }])
        mock_prop.add_response("obterVotacoesProposicao", [{
            'data':
            '16/12/2019',
            'hora':
            '12:00',
            'resumo':
            'Votação 2',
            'votos': [
                {
                    'id': '23456',
                    'voto': 'Sim'
                },
                {
                    'id': '12345',
                    'voto': 'Não'
                },
                {
                    'id': '34567',
                    'voto': 'Abstenção'
                },
            ]
        }])
        self.dep.relatorio = Relatorio(parlamentar=Parlamentar(id='12345'))

        self.dep._add_attended_events(events_attended)

        self.assertEqual(self.dep.relatorio.eventos_presentes, [
            Evento(id='3',
                   data_inicial=self.dep.helper.get_brt(datetime(2019, 12,
                                                                 10)),
                   data_final=self.dep.helper.get_brt(datetime(2019, 12, 17)),
                   presenca=0,
                   pautas=[
                       Proposicao(id='11',
                                  numero='11',
                                  ementa='Proposição I',
                                  pauta='Votação 1 de Proposição I',
                                  voto='Sim')
                   ]),
            Evento(id='4',
                   data_inicial=self.dep.helper.get_brt(datetime(2019, 12,
                                                                 10)),
                   data_final=self.dep.helper.get_brt(datetime(2019, 12, 17)),
                   presenca=0,
                   pautas=[])
        ])
Exemplo n.º 9
0
    def test_send_push_notification_success(self, mock_urllib3):
        def assert_equal(actual, expected):
            self.assertEqual(actual, expected)

        data_inicial = datetime(2019, 10, 12)
        data_final = datetime(2019, 10, 19)
        parlamentar1 = Parlamentar(id='1', cargo='BR1', nome='AMANDA')
        relatorio1 = Relatorio(
            id="123",
            parlamentar=parlamentar1,
            data_final=data_final,
            data_inicial=data_inicial,
            proposicoes=[
                Proposicao(id="1"),
                Proposicao(id="2"),
                Proposicao(id="3"),
                Proposicao(id="4")
            ],
            eventos_presentes=[Evento(id="1"), Evento(id="2")],
            eventos_previstos=None,
            eventos_ausentes=[Evento(id="4"),
                              Evento(id="5"),
                              Evento(id="6")])
        expected_reports = [{
            "_id": "123",
            "parlamentar": parlamentar1.to_dict(),
            "mensagem": None,
            "dataInicial": str(data_inicial),
            "dataFinal": str(data_final),
            "orgaos": 0,
            "proposicoes": 4,
            "eventosPresentes": 2,
            "eventosAusentes": 3,
            "eventosPrevistos": 0,
            "presencaRelativa": "100.00%",
            "presencaTotal": "40.00%",
            "eventosAusentesEsperadosTotal": 0
        }]

        class FakePoolManager:
            def __init__(self, *args, **kwargs):
                pass

            def request(self, method, url, headers, body):
                class response():
                    status = 200
                    data = json.dumps({
                        'results': [{
                            'id': '123'
                        }]
                    }).encode('utf-8')

                assert_equal(method, "POST")
                assert_equal(url, "https://fcm.googleapis.com/fcm/send")
                assert_equal(
                    json.loads(body.decode('utf-8'))["data"]["reports"],
                    expected_reports)
                return response()

        mock_urllib3.side_effect = FakePoolManager

        reports = [relatorio1.to_dict()]
        result = send_push_notification("token", reports)

        self.assertTrue(mock_urllib3.called)
        self.assertTrue(result)
        self.assertEqual([relatorio1.to_dict()], reports)
 def obter_relatorio(self,
                     parlamentar_id,
                     data_final=datetime.now(),
                     periodo_dias=7):
     try:
         start_time = time()
         self.relatorio = Relatorio()
         self.relatorio.aviso_dados = u'Dados de sessões de comissões não disponível.'
         self.set_period(periodo_dias)
         data_final = datetime.strptime(data_final, '%Y-%m-%d')
         data_inicial = self.obterDataInicial(data_final, **self.periodo)
         logging.info('[SAO PAULO] Parlamentar: {}'.format(parlamentar_id))
         logging.info('[SAO PAULO] Data final: {}'.format(data_final))
         logging.info('[SAO PAULO] Intervalo: {}'.format(periodo_dias))
         vereador = self.obter_parlamentar(parlamentar_id)
         logging.info(
             '[SAO PAULO] Vereador obtido em {0:.5f}s'.format(time() -
                                                              start_time))
         self.relatorio.data_inicial = self.brasilia_tz.localize(
             data_inicial)
         self.relatorio.data_final = self.brasilia_tz.localize(data_final)
         presenca = []
         sessao_total = 0
         presenca_total = 0
         for dia in self.ver.obterPresenca(data_inicial, data_final):
             if dia:
                 for v in dia['vereadores']:
                     if str(v['chave']) == vereador.id:
                         for s in v['sessoes']:
                             if s['presenca'] == 'Presente':
                                 presenca.append(s['nome'])
                         sessao_total += int(dia['totalOrd']) + int(
                             dia['totalExtra'])
                         presenca_total += sum([
                             int(v['presenteOrd']),
                             int(v['presenteExtra'])
                         ])
                 for key, value in dia['sessoes'].items():
                     evento = Evento()
                     orgao = Orgao()
                     orgao.nome = 'Plenário'
                     orgao.apelido = 'PLENÁRIO'
                     evento.orgaos.append(orgao)
                     evento.nome = key
                     evento.id = str(uuid4())
                     if value['data']:
                         try:
                             evento.data_inicial = self.brasilia_tz.localize(
                                 datetime.strptime(value['data'],
                                                   "%d/%m/%Y"))
                             evento.data_final = self.brasilia_tz.localize(
                                 datetime.strptime(value['data'],
                                                   "%d/%m/%Y"))
                         except ValueError:
                             pass
                     for prop in value['pautas']:
                         proposicao = Proposicao()
                         proposicao.pauta = prop['projeto']
                         proposicao.tipo = prop['pauta']
                         for v in prop['votos']:
                             if str(v['chave']) == parlamentar_id:
                                 proposicao.voto = v['voto']
                         evento.pautas.append(proposicao)
                     if key in presenca:
                         evento.set_presente()
                         self.relatorio.eventos_presentes.append(evento)
                     else:
                         evento.set_ausencia_evento_esperado()
                         self.relatorio.eventos_ausentes.append(evento)
         logging.info(
             '[SAO PAULO] Eventos obtidos em {0:.5f}s'.format(time() -
                                                              start_time))
         self.relatorio.eventos_ausentes_esperados_total = sessao_total - presenca_total
         self.obter_proposicoes_parlamentar(vereador.id, data_inicial,
                                            data_final)
         logging.info('[SAO PAULO] Proposicoes obtidas em {0:.5f}s'.format(
             time() - start_time))
         logging.info(
             '[SAO PAULO] Relatorio obtido em {0:.5f}s'.format(time() -
                                                               start_time))
         return self.relatorio
     except Exception as e:
         logging.error(e)
         raise ModelError(str(e))