def test_obter_relatorio_json_inexistente_por_periodos_diferentes(
        self,
        mock_model_selector
    ):
        parlamentar = Parlamentar(id='1', cargo='BR1')
        brasilia_tz = pytz.timezone('America/Sao_Paulo')
        relatorio_inicial = Relatorio(
            parlamentar=parlamentar,
            data_final=brasilia_tz.localize(datetime(2019, 6, 29)),
            data_inicial=brasilia_tz.localize(datetime(2019, 6, 15))
        ).save()
        relatorio_gerado = Relatorio(
            parlamentar=parlamentar,
            data_final=datetime(2019, 6, 29),
            data_inicial=datetime(2019, 6, 22)
        )
        class FakeModel:
            def obter_relatorio(self, *args, **kwargs):
                return relatorio_gerado
        mock_model_selector.return_value = FakeModel

        actual_response = Relatorios().obter_relatorio('1', '2019-06-29', 'BR1', periodo=7)
        actual_response['_id'] = 'id'
        relatorio_gerado.pk = 'id'

        self.assertEqual(mock_model_selector.call_count, 1)
        self.assertEqual(actual_response, relatorio_gerado.to_dict())
    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 test_obter_por_id(self):
        parlamentar = Parlamentar(id='id')
        relatorio = Relatorio(parlamentar=parlamentar, data_inicial='2019-01-01')
        relatorio.save()
        
        actual = Relatorios().obter_por_id(relatorio.pk)

        self.assertEqual(relatorio, actual)
Exemple #4
0
 def test_avaliar_item_not_found(self):
     parlamentar = Parlamentar(id='id', cargo='BR1')
     relatorio = Relatorio(
         parlamentar=parlamentar,
         data_inicial='2019-01-01'
     )
     relatorio.save()
     
     with self.assertRaises(ItemNotFound):
         Avaliacao().avaliar('123', '1', '*****@*****.**', relatorio.pk)
    def test_buscar_por_parlamentar(self):
        parlamentar_1 = Parlamentar(id='1', cargo='BR1')
        parlamentar_2 = Parlamentar(id='2', cargo='BR1')
        parlamentar_3 = Parlamentar(id='1', cargo='BR2')
        relatorio_1 = Relatorio(parlamentar=parlamentar_1, data_inicial=datetime(2019, 1, 1)).save()
        relatorio_2 = Relatorio(parlamentar=parlamentar_2, data_inicial=datetime(2019, 1, 1)).save()
        relatorio_3 = Relatorio(parlamentar=parlamentar_3, data_inicial=datetime(2019, 1, 1)).save()
        relatorio_4 = Relatorio(parlamentar=parlamentar_1, data_inicial=datetime(2019, 1, 1)).save()
        relatorio_5 = Relatorio(parlamentar=parlamentar_3, data_inicial=datetime(2019, 1, 1)).save()
        relatorio_6 = Relatorio(parlamentar=parlamentar_2, data_inicial=datetime(2019, 1, 1)).save()

        actual = Relatorios().buscar_por_parlamentar('BR1', '1')
        expected = [relatorio_1.to_dict(), relatorio_4.to_dict()]

        self.assertEqual(len(actual), len(expected))
Exemple #6
0
 def __init__(self):
     super().__init__()
     self.dep = Deputados()
     self.com = Comissoes()
     self.prop = Proposicoes()
     self.relatorio = Relatorio()
     self.brasilia_tz = pytz.timezone('America/Sao_Paulo')
Exemple #7
0
 def avaliar(self, avaliado, avaliacao_valor, email, relatorio_id):
     avaliacao = Avaliacoes()
     try:
         relatorio = Relatorio.objects(pk=relatorio_id).first()
     except ValidationError:
         raise ReportNotFound()
     if relatorio == None:
         raise ReportNotFound()
     for tipo in ['eventosAusentes', 'eventosPresentes', 'proposicoes']:
         for item in relatorio.to_dict()[tipo]:
             if 'id' in item and str(item['id']) == avaliado:
                 avaliacao.avaliado = item
                 break
     if avaliacao.avaliado == {}:
         raise ItemNotFound()
     avaliacao.email = email
     avaliacao.relatorioId = ObjectId(relatorio.pk)
     avaliacao.avaliacao = avaliacao_valor
     avaliacao.parlamentar = relatorio.parlamentar
     avaliacao_existente = Avaliacoes.objects(
         avaliado__id__=avaliacao.avaliado['id'],
         parlamentar__id__=relatorio.parlamentar.id,
         parlamentar__cargo=relatorio.parlamentar.cargo,
         email=email,
         relatorioId=relatorio.pk)
     if avaliacao_existente:
         Avaliacoes.objects(pk=avaliacao_existente.first().pk).update_one(
             set__avaliacao=avaliacao['avaliacao'])
     else:
         avaliacao.save()
    def test_obter_relatorio_json_inexistente_funcao_sem_erro(
        self,
        mock_model_selector
    ):
        parlamentar = Parlamentar(id='1', cargo='BR1')
        relatorio = Relatorio(parlamentar=parlamentar, data_final=datetime(2019, 1, 1))
        class FakeModel:
            def obter_relatorio(self, *args, **kwargs):
                return relatorio
        mock_model_selector.return_value = FakeModel

        actual_response = Relatorios().obter_relatorio('1', '2019-01-01', 'BR1', periodo=7)
        actual_response['_id'] = 'id'
        relatorio.pk = 'id'

        self.assertEqual(mock_model_selector.call_count, 1)
        self.assertEqual(actual_response, relatorio.to_dict())
    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)
Exemple #10
0
 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 plenárias 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('[ALESP] Parlamentar: {}'.format(parlamentar_id))
         logging.info('[ALESP] Data final: {}'.format(data_final))
         logging.info('[ALESP] Intervalo: {}'.format(periodo_dias))
         self.obter_parlamentar(parlamentar_id)
         if self.relatorio.parlamentar == None:
             logging.error("[ALESP] Deputado não encontrado")
             raise ModelError('Parlamentar não encontrado')
         self.relatorio.data_inicial = self.brasilia_tz.localize(
             data_inicial)
         self.relatorio.data_final = self.brasilia_tz.localize(data_final)
         logging.info(
             '[ALESP] Deputado obtido em {0:.5f}s'.format(time() -
                                                          start_time))
         comissoes = self.obterComissoesPorId()
         logging.info('[ALESP] Comissoes por id obtidas em {0:.5f}s'.format(
             time() - start_time))
         votacoes = self.obterVotacoesPorReuniao(parlamentar_id)
         logging.info(
             '[ALESP] Votos do deputado obtidos em {0:.5f}s'.format(
                 time() - start_time))
         orgaos_nomes = self.obterComissoesDeputado(comissoes,
                                                    parlamentar_id,
                                                    data_inicial,
                                                    data_final)
         logging.info(
             '[ALESP] Comissoes do deputado obtidas em {0:.5f}s'.format(
                 time() - start_time))
         self.obterEventosPresentes(parlamentar_id, data_inicial,
                                    data_final, votacoes, comissoes,
                                    orgaos_nomes)
         self.relatorio.eventos_ausentes_esperados_total = len(
             self.relatorio.eventos_previstos)
         logging.info(
             '[ALESP] Eventos obtidos em {0:.5f}s'.format(time() -
                                                          start_time))
         self.obterProposicoesDeputado(parlamentar_id, data_inicial,
                                       data_final)
         logging.info(
             '[ALESP] Proposicoes obtidas em {0:.5f}s'.format(time() -
                                                              start_time))
         logging.info(
             '[ALESP] Relatorio obtido em {0:.5f}s'.format(time() -
                                                           start_time))
         return self.relatorio
     except ALESPError as e:
         logging.error("[ALESP] {}".format(e))
         raise ModelError('Erro')
Exemple #11
0
    def test_avaliar_sucesso(self):
        parlamentar = Parlamentar(id='id', cargo='BR1')
        evento = Evento(id='123', nome='Evento')
        relatorio = Relatorio(
            parlamentar=parlamentar,
            data_inicial='2019-01-01',
            eventos_presentes=[evento]
        )
        relatorio.save()

        Avaliacao().avaliar('123', '1', '*****@*****.**', relatorio.pk)
        actual = Avaliacoes.objects().first()

        self.assertEqual(actual.email, '*****@*****.**')
        self.assertEqual(actual.relatorioId, relatorio.pk)
        self.assertEqual(actual.parlamentar.id, 'id')
        self.assertEqual(actual.parlamentar.cargo, 'BR1')
        self.assertEqual(actual.avaliado['id'], '123')
Exemple #12
0
    def test_generate_reports_send_to_active_devices_only(
        self,
        mock_send_email,
        mock_send_push_notification
    ):
        brasilia_tz = pytz.timezone('America/Sao_Paulo')
        agora = datetime(2019, 6, 29)
        data_final = datetime(agora.year, agora.month, agora.day)
        data_final = brasilia_tz.localize(data_final)
        parlamentar = Parlamentar(id='1', cargo='BR1')
        relatorio = Relatorio(
            parlamentar=parlamentar,
            data_final=data_final,
            data_inicial=data_final - timedelta(days=7)
        ).save().reload()
        mock_send_email.return_value = True
        users = [
            User(
                username='******',
                password='******',
                email='*****@*****.**',
                inscricoes=Inscricoes(
                    parlamentares=[parlamentar],
                    intervalo=7
                ),
                devices=[
                    UserDevice(id="device1", token="token1", name="name1", active=True),
                    UserDevice(id="device2", token="token2", name="name2", active=False),
                    UserDevice(id="device3", token="token3", name="name3", active=True),
                    UserDevice(id="device4", token="token4", name="name4", active=False),
                ]
            ),
        ]

        generate_reports(users, data_final=agora)

        self.assertEqual(mock_send_push_notification.call_count, 2)
        mock_send_push_notification.assert_has_calls(
            [
                call("token1", [relatorio.to_dict()]),
                call("token3", [relatorio.to_dict()])
            ]
        )
Exemple #13
0
 def verificar_relatorio(self, parlamentar, data_final, cargo, periodo):
     brasilia_tz = pytz.timezone('America/Sao_Paulo')
     data_inicial = datetime.strptime(
         data_final, '%Y-%m-%d') - timedelta(days=int(periodo))
     relatorio = Relatorio.objects(
         parlamentar__id__=parlamentar,
         parlamentar__cargo=cargo,
         data_final=brasilia_tz.localize(
             datetime.strptime(data_final, '%Y-%m-%d')),
         data_inicial=brasilia_tz.localize(data_inicial))
     return relatorio.first() if relatorio else None
    def test_solicitar_geracao_relatorio_relatorio_existente(self):
        parlamentar = Parlamentar(id='1', cargo='BR1')
        brasilia_tz = pytz.timezone('America/Sao_Paulo')
        relatorio_inicial = Relatorio(
            parlamentar=parlamentar,
            data_final=brasilia_tz.localize(datetime(2019, 6, 29)),
            data_inicial=brasilia_tz.localize(datetime(2019, 6, 22))
        ).save()

        actual_response = Relatorios().solicitar_geracao_relatorio('1', '2019-06-29', 'BR1', 7)

        self.assertEqual(actual_response, relatorio_inicial)
Exemple #15
0
    def test_generate_reports_multiplos_parlamentares(
            self,
            mock_send_email
    ):
        brasilia_tz = pytz.timezone('America/Sao_Paulo')
        agora = datetime.now()
        data_final = datetime(agora.year, agora.month, agora.day)
        data_final = brasilia_tz.localize(data_final)
        data_inicial = data_final - timedelta(days=7)
        parlamentar1 = Parlamentar(id='1', cargo='BR1')
        parlamentar2 = Parlamentar(id='2', cargo='BR2')
        parlamentar3 = Parlamentar(id='3', cargo='BR1')
        relatorio1 = Relatorio(
            parlamentar=parlamentar1,
            data_final=data_final,
            data_inicial=data_inicial
        ).save().reload()
        relatorio2 = Relatorio(
            parlamentar=parlamentar2,
            data_final=data_final,
            data_inicial=data_inicial
        ).save().reload()
        relatorio3 = Relatorio(
            parlamentar=parlamentar3,
            data_final=data_final,
            data_inicial=data_inicial
        ).save().reload()
        mock_send_email.return_value = True
        user = [User(
            username='******',
            password='******',
            email='*****@*****.**',
            inscricoes=Inscricoes(
                parlamentares=[parlamentar1, parlamentar2, parlamentar3],
                intervalo=7
            )
        )]

        generate_reports(user, data_final=agora)

        mock_send_email.assert_called_once_with(
            "*****@*****.**",
            [relatorio1.to_dict(), relatorio2.to_dict(), relatorio3.to_dict()],
            dates=ANY
        )
    def test_solicitar_geracao_relatorio_nova_thread(
        self,
        mock_model_selector
    ):
        brasilia_tz = pytz.timezone('America/Sao_Paulo')
        parlamentar = Parlamentar(id='1', cargo='BR1')
        relatorio_gerado = Relatorio(
            parlamentar=parlamentar,
            data_final=brasilia_tz.localize(datetime(2019, 6, 29)),
            data_inicial=brasilia_tz.localize(datetime(2019, 6, 22))
        )
        def obter_relatorio(self, *args, **kwargs):
            return relatorio_gerado
        mock_model_selector.return_value = obter_relatorio

        actual_response = Relatorios().solicitar_geracao_relatorio('1', '2019-06-29', 'BR1', 7)

        self.assertEqual(actual_response, True)
 def obter_relatorio(self, parlamentar_id, data_final=None, periodo_dias=7):
     try:
         self.relatorio = Relatorio()
         self.relatorio.aviso_dados = u'Dados de votações em comissões não disponíveis.'
         start_time = time()
         if data_final:
             data_final = datetime.strptime(data_final, '%Y-%m-%d')
         else:
             data_final = datetime.now()
         logging.info('[BR1] Parlamentar: {}'.format(parlamentar_id))
         logging.info('[BR1] Data final: {}'.format(data_final))
         logging.info('[BR1] Intervalo: {}'.format(periodo_dias))
         self.set_period(periodo_dias)
         assemblyman_info = self.obter_parlamentar(parlamentar_id)
         self.relatorio.data_inicial = self.helper.get_brt(
             self.obterDataInicial(data_final, **self.periodo))
         self.relatorio.data_final = self.helper.get_brt(data_final)
         logging.info('[BR1] Deputado obtido em {0:.5f}s'.format(time() - start_time))
         events = self.helper.get_all_events(data_final)
         events_attended = self.helper.get_attended_events(events, assemblyman_info['id'])
         logging.info('[BR1] Eventos obtidos em {0:.5f}s'.format(time() - start_time))
         self.relatorio.orgaos = self.helper.get_commissions(assemblyman_info.id, data_final)
         logging.info('[BR1] Orgaos obtidos em {0:.5f}s'.format(time() - start_time))
         self._add_attended_events(events_attended)
         logging.info('[BR1] Pautas obtidas em {0:.5f}s'.format(time() - start_time))
         events_expected = self.helper.get_expected_events(self.relatorio.parlamentar.id, data_final)
         events_absent = self.helper.get_absent_events(
             events,
             events_attended,
             events_expected,
             self.relatorio.orgaos
         )
         self._add_absent_events(events_absent)
         logging.info('[BR1] Ausencias obtidas em {0:.5f}s'.format(time() - start_time))
         self.relatorio.proposicoes = self.helper.get_propositions(assemblyman_info, data_final)
         logging.info('[BR1] Proposicoes obtidas em {0:.5f}s'.format(time() - start_time))
         logging.info('[BR1] Relatorio obtido em {0:.5f}s'.format(time() - start_time))
         return self.relatorio
     except CamaraDeputadosError as event:
         logging.error("[BR1] {}".format(event))
         raise ModelError("API Câmara dos Deputados indisponível")
    def test_add_absent_events(self):
        absent_events = [
            Evento(id='1',
                   presenca=2,
                   orgaos=[Orgao(nome='Órgão 1', apelido='')]),
            Evento(id='2',
                   presenca=3,
                   orgaos=[Orgao(nome='Órgão 1', apelido='')]),
            Evento(id='5',
                   presenca=1,
                   orgaos=[Orgao(nome='Órgão 4', apelido='')]),
            Evento(id='6',
                   presenca=2,
                   orgaos=[Orgao(nome='Órgão 4', apelido='PLEN')]),
        ]
        self.dep.relatorio = Relatorio()

        self.dep._add_absent_events(absent_events)

        self.assertEqual(self.dep.relatorio.eventos_ausentes, absent_events)
        absent_events.pop(2)
        self.assertEqual(self.dep.relatorio.eventos_previstos, absent_events)
        self.assertEqual(self.dep.relatorio.eventos_ausentes_esperados_total,
                         3)
    def test_obter_relatorio_json_existente(self):
        brasilia_tz = pytz.timezone('America/Sao_Paulo')
        parlamentar = Parlamentar(id='1', cargo='BR1')
        relatorio = Relatorio(
            parlamentar=parlamentar,
            data_final=brasilia_tz.localize(datetime(2019, 1, 8)),
            data_inicial=brasilia_tz.localize(datetime(2019, 1, 1)),
        ).save()

        actual_response = Relatorios().obter_relatorio(
            '1', '2019-01-08', 'BR1', periodo=7)

        self.maxDiff = None
        self.assertEqual(
            brasilia_tz.normalize(actual_response['dataFinal'].replace(tzinfo=pytz.UTC)),
            relatorio.to_dict()['dataFinal']
        )
        actual_response['dataFinal'] = relatorio.to_dict()['dataFinal']
        self.assertEqual(
            brasilia_tz.normalize(actual_response['dataInicial'].replace(tzinfo=pytz.UTC)),
            relatorio.to_dict()['dataInicial']
        )
        actual_response['dataInicial'] = relatorio.to_dict()['dataInicial']
        self.assertEqual(actual_response, relatorio.to_dict())
Exemple #20
0
 def tearDown(self):
     Relatorio.drop_collection()
     logging.disable(logging.NOTSET)
 def __init__(self):
     super().__init__()
     self.dep = Deputados()
     self.relatorio = Relatorio()
     self.helper = CamaraDeputadosHelper()
Exemple #22
0
 def buscar_por_parlamentar(self, cargo, parlamentar_id):
     return json.loads(
         Relatorio.objects(parlamentar__id__=parlamentar_id,
                           parlamentar__cargo=cargo).to_json())
    def test_send_email(self, mock_MIMEText, mock_SMTP):
        data_inicial = datetime(2019, 10, 12)
        data_final = datetime(2019, 10, 19)
        parlamentar1 = Parlamentar(id='1', cargo='BR1', nome='AMANDA')
        parlamentar2 = Parlamentar(id='2', cargo='BR2', nome='SANTOS')
        parlamentar3 = Parlamentar(id='3', cargo='BR1', nome='FULANO')
        relatorio1 = Relatorio(parlamentar=parlamentar1,
                               data_final=data_final,
                               data_inicial=data_inicial)
        relatorio2 = Relatorio(parlamentar=parlamentar2,
                               data_final=data_final,
                               data_inicial=data_inicial)
        relatorio3 = Relatorio(parlamentar=parlamentar3,
                               data_final=data_final,
                               data_inicial=data_inicial)

        #Não consegui nem encontrei como mockar Header e MIMEText...
        def assert_in(member, container):
            return self.assertIn(member, container)

        class FakeMIMEText():
            def __init__(self, html, *args, **kwargs):
                assert_in("AMANDA", html)
                assert_in("FULANO", html)
                assert_in("SANTOS", html)
                assert_in("12/10/2019", html)
                assert_in("19/10/2019", html)

            def __setitem__(self, name, value):
                pass

            def as_string(self):
                return 'ok'

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

            def starttls(self):
                self.starttls_called = True

            def ehlo(self):
                pass

            def login(self, *args):
                self.login_args = args

            def sendmail(self, *args):
                self.sendmail_args = args

            def quit(self):
                self.quit_called = True

        mock_SMTP.side_effect = FakeSMTP
        mock_MIMEText.side_effect = FakeMIMEText

        send_email(email="*****@*****.**",
                   reports=[relatorio1, relatorio2, relatorio3],
                   dates=(data_inicial, data_final))

        self.assertEqual(1, mock_SMTP.call_count)
 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))
Exemple #25
0
def set_up_db(db):
    parlamentar_test = set_up_parlamentar()
    brasilia_tz = pytz.timezone('America/Sao_Paulo')
    orgaos_evento = [
        Orgao(nome="ÓrgãoTeste", sigla="OT", cargo="None", apelido="OhTe")
    ]
    eventos_presentes = [
        Evento(id="12345",
               nome="Evento teste",
               data_inicial=brasilia_tz.localize(datetime(2019, 1, 1)),
               data_final=brasilia_tz.localize(datetime(2019, 1, 1)),
               url="http://url.com",
               situacao="Encerrada",
               presenca=0,
               orgaos=orgaos_evento)
    ]
    eventos_ausentes = [
        Evento(id="123",
               nome="Evento teste",
               data_inicial=brasilia_tz.localize(datetime(2019, 1, 1)),
               data_final=brasilia_tz.localize(datetime(2019, 1, 1)),
               url="http://url.com",
               situacao="Cancelada",
               presenca=1,
               orgaos=orgaos_evento)
    ]
    Relatorio(
        pk=ObjectId("5c264b5e3a5efd576ecaf48e"),
        parlamentar=parlamentar_test,
        proposicoes=[],
        data_inicial=brasilia_tz.localize(datetime(2018, 12, 31)),
        data_final=brasilia_tz.localize(datetime(2019, 1, 7)),
        orgaos=[],
        eventos_presentes=eventos_presentes,
        eventos_ausentes=eventos_ausentes,
        eventos_previstos=[],
    ).save()
    Avaliacoes(
        pk=ObjectId("5c5116f5c3acc80004eada0a"),
        email="*****@*****.**",
        parlamentar=parlamentar_test,
        avaliacao="1",
        avaliado={
            "url":
            "url",
            "situacao":
            "Cancelada",
            "dataFinal":
            brasilia_tz.localize(datetime(2019, 1, 1)),
            "orgaos": [{
                "sigla": "OT",
                "nome": "ÓrgãoTeste",
                "apelido": "OhTe",
                "cargo": None
            }],
            "dataInicial":
            brasilia_tz.localize(datetime(2019, 1, 1)),
            "presenca":
            1,
            "nome":
            "Evento teste",
            "id":
            "123"
        },
        relatorioId=ObjectId("5c264b5e3a5efd576ecaf48e"),
    ).save()
    inscricoes = Inscricoes(parlamentares=[parlamentar_test], intervalo=7)
    User.drop_collection()
    User(
        username="******",
        email="*****@*****.**",
        password=
        "******",
        inscricoes=inscricoes,
        devices=[
            UserDevice(id="14",
                       name="dispositivo",
                       token="---token---",
                       active=True,
                       os="Android")
        ]).save()
Exemple #26
0
    def test_generate_reports_multiplos_intervalos(
            self,
            mock_send_email
    ):
        brasilia_tz = pytz.timezone('America/Sao_Paulo')
        agora = datetime(2019, 6, 29)
        data_final = datetime(agora.year, agora.month, agora.day)
        data_final = brasilia_tz.localize(data_final)
        parlamentar1 = Parlamentar(id='1', cargo='BR1')
        relatorio1 = Relatorio(
            parlamentar=parlamentar1,
            data_final=data_final,
            data_inicial=data_final - timedelta(days=7)
        ).save().reload()
        relatorio2 = Relatorio(
            parlamentar=parlamentar1,
            data_final=data_final,
            data_inicial=data_final - timedelta(days=14)
        ).save().reload()
        relatorio3 = Relatorio(
            parlamentar=parlamentar1,
            data_final=data_final,
            data_inicial=data_final - timedelta(days=28)
        ).save().reload()
        mock_send_email.return_value = True
        users = [
            User(
                username='******',
                password='******',
                email='*****@*****.**',
                inscricoes=Inscricoes(
                    parlamentares=[parlamentar1],
                    intervalo=7
                )
            ),
            User(
                username='******',
                password='******',
                email='*****@*****.**',
                inscricoes=Inscricoes(
                    parlamentares=[parlamentar1],
                    intervalo=14
                )
            ),
            User(
                username='******',
                password='******',
                email='*****@*****.**',
                inscricoes=Inscricoes(
                    parlamentares=[parlamentar1],
                    intervalo=28
                )
            )
        ]

        generate_reports(users, data_final=agora)

        self.assertEqual(mock_send_email.call_count, 3)
        mock_send_email.assert_has_calls(
            [
                call("*****@*****.**", [relatorio1.to_dict()], dates=ANY),
                call("*****@*****.**", [relatorio2.to_dict()], dates=ANY),
                call("*****@*****.**", [relatorio3.to_dict()], dates=ANY)
            ]
        )
    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=[])
        ])
    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 __init__(self):
     super().__init__()
     self.ver = CamaraMunicipal()
     self.relatorio = Relatorio()
     self.brasilia_tz = pytz.timezone('America/Sao_Paulo')
Exemple #30
0
 def obter_por_id(self, relatorio_id):
     try:
         return Relatorio.objects(pk=relatorio_id).first()
     except ValidationError:
         return None