예제 #1
0
    def get_commissions(self, assemblyman_id, final_date):
        """
        Gets all commissions assemblyman is member of in the report period

        :param assemblyman_id: Assemblyman id
        :type assemblyman_id: String
        :param final_date: Report period final date
        :type final_date: Datetime
        :return: List of commissions
        :rtype: List[Orgao]
        """
        commissions = []
        di, df = self.helper.obterDataInicialEFinal(final_date)
        try:
            pages = self.dep.obterOrgaosDeputado(assemblyman_id,
                                                 dataInicio=di,
                                                 dataFim=df)
            for item in [cm for page in pages for cm in page]:
                end_date = self._parse_datetime(item['dataFim'])
                if (item['dataFim'] is None or end_date > final_date):
                    orgao = Orgao()
                    orgao.nome = item.get("nomeOrgao")
                    orgao.sigla = item.get("siglaOrgao")
                    orgao.cargo = item.get("titulo")
                    commissions.append(orgao)
            return commissions
        except CamaraDeputadosError as error:
            logging.error("[BR1] %s", error)
            return [{'nomeOrgao': None}]
예제 #2
0
    def test_get_commissions(self, mock_obterDataInicialEFinal):
        mock = Mocker(self.dep.dep)
        mock.add_response("obterOrgaosDeputado", [[{
            'nomeOrgao': 'Comissão A',
            'dataFim': None
        }, {
            'nomeOrgao': 'Comissão B',
            'dataFim': '2018-08-31'
        }, {
            'nomeOrgao': 'Comissão C',
            'dataFim': '2018-12-31'
        }]],
                          '1234',
                          dataInicio='2018-10-21',
                          dataFim='2018-10-28')
        mock_obterDataInicialEFinal.return_value = ('2018-10-21', '2018-10-28')

        actual_response = self.dep.get_commissions('1234',
                                                   datetime(2018, 10, 28))

        self.assertIn(Orgao(nome='Comissão A'), actual_response)
        self.assertIn(Orgao(nome='Comissão C'), actual_response)
        self.assertEqual(len(actual_response), 2)

        mock.assert_no_pending_responses()
        mock_obterDataInicialEFinal.assert_called_once_with(
            datetime(2018, 10, 28))
예제 #3
0
    def test_build_event(self):
        event = {
            'id': '123',
            'dataHoraInicio': '2019-08-10T10:00',
            'dataHoraFim': '2019-08-10T12:00',
            'situacao': 'Encerrada',
            'descricao': 'Sessão Ordinária',
            'uri': 'uri',
            'orgaos': [{
                'nome': 'Plenário',
                'apelido': 'PLEN'
            }]
        }
        expected = Evento(
            id='123',
            data_inicial=self.dep.get_brt(datetime(2019, 8, 10, 10)),
            data_final=self.dep.get_brt(datetime(2019, 8, 10, 12)),
            situacao='Encerrada',
            nome='Sessão Ordinária',
            url='uri',
            orgaos=[Orgao(nome='Plenário', apelido='PLEN')])

        actual = self.dep.build_event(event)

        self.assertEqual(expected, actual)
예제 #4
0
 def obterComissoesDeputado(self, comissoes, dep_id, data_inicial,
                            data_final):
     dep_comissoes_nomes = []
     membros_comissoes = self.com.obterMembrosComissoes()
     for membro in membros_comissoes:
         if ((membro["idDeputado"] == dep_id) and
             (membro["dataFim"] == None
              or self.obterDatetimeDeStr(membro["dataFim"]) > data_inicial)
                 and self.obterDatetimeDeStr(
                     membro["dataInicio"]) < data_final):
             orgao = Orgao()
             membro["siglaOrgao"] = comissoes[membro["idComissao"]]["sigla"]
             orgao.nome = comissoes[membro["idComissao"]]["nome"]
             orgao.sigla = membro['siglaOrgao']
             orgao.cargo = "Titular" if membro["efetivo"] else "Suplente"
             self.relatorio.orgaos.append(orgao)
             dep_comissoes_nomes.append(membro["siglaOrgao"])
     return dep_comissoes_nomes
예제 #5
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)
예제 #6
0
    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 obter_cargos_parlamentar(self, cargos):
     for cargo in cargos:
         if 'fim' in cargo and cargo['fim'] < datetime.now():
             continue
         orgao = Orgao()
         orgao.nome = cargo['ente']['nome'].replace(u'Comissão - ', '')
         orgao.cargo = cargo['nome']
         orgao.apelido = orgao.nome
         orgao.sigla = orgao.nome
         self.relatorio.orgaos.append(orgao)
예제 #8
0
    def build_event(self, event_info):
        """
        Builds an Event object with given event data

        :param event_info: Event dict
        :type event_info: Dict
        :return: Event object
        :rtype: Evento
        """
        event = Evento()
        event.id = str(event_info['id'])
        event.data_inicial = self.get_brt(
            self._parse_datetime(event_info.get('dataHoraInicio')))
        event.data_final = self.get_brt(
            self._parse_datetime(event_info.get('dataHoraFim')))
        event.situacao = event_info.get('situacao')
        event.nome = event_info.get('descricao')
        event.url = event_info.get('uri')
        event.orgaos = [
            Orgao(nome=o.get('nome'), apelido=o.get('apelido'))
            for o in event_info.get('orgaos', [])
        ]
        return event
예제 #9
0
    def test_get_all_events(self, mock_obterDataInicialEFinal):
        mock = Mocker(self.dep.ev)
        mock.add_response(
            "obterTodosEventos",
            [[{
                'id': '123',
                'dataHoraInicio': '2018-10-24T10:00',
                'dataHoraFim': '2018-10-24T12:00',
                'situacao': 'Encerrada',
                'descricao': 'Sessão Ordinária',
                'uri': 'uri',
                'orgaos': [{
                    'nome': 'Plenário',
                    'apelido': 'PLEN'
                }]
            }, {
                'id': '1234',
                'dataHoraInicio': '2018-10-24T14:00',
                'dataHoraFim': '2018-10-24T18:45',
                'situacao': 'Encerrada',
                'descricao': 'Sessão Extraordinária',
                'uri': 'uri',
                'orgaos': [{
                    'nome': 'Plenário',
                    'apelido': 'PLEN'
                }]
            }],
             [{
                 'id':
                 '12345',
                 'dataHoraInicio':
                 '2018-10-25T10:00',
                 'dataHoraFim':
                 None,
                 'situacao':
                 'Cancelada',
                 'descricao':
                 'Sessão Ordinária',
                 'uri':
                 'uri',
                 'orgaos': [{
                     'nome': 'Comissão de Constituição e Justiça',
                     'apelido': 'CCJ'
                 }]
             }]],
            dataInicio='2018-10-21',
            dataFim='2018-10-28')
        mock_obterDataInicialEFinal.return_value = ('2018-10-21', '2018-10-28')

        actual_response = self.dep.get_all_events(datetime(2018, 10, 28))

        self.assertEqual([
            Evento(id='123',
                   data_inicial=self.dep.get_brt(datetime(2018, 10, 24, 10,
                                                          0)),
                   data_final=self.dep.get_brt(datetime(2018, 10, 24, 12, 0)),
                   situacao='Encerrada',
                   nome='Sessão Ordinária',
                   url='uri',
                   orgaos=[Orgao(nome='Plenário', apelido='PLEN')]),
            Evento(id='1234',
                   data_inicial=self.dep.get_brt(datetime(2018, 10, 24, 14,
                                                          0)),
                   data_final=self.dep.get_brt(datetime(2018, 10, 24, 18, 45)),
                   situacao='Encerrada',
                   nome='Sessão Extraordinária',
                   url='uri',
                   orgaos=[Orgao(nome='Plenário', apelido='PLEN')]),
            Evento(id='12345',
                   data_inicial=self.dep.get_brt(datetime(2018, 10, 25, 10,
                                                          0)),
                   data_final=None,
                   situacao='Cancelada',
                   nome='Sessão Ordinária',
                   url='uri',
                   orgaos=[
                       Orgao(nome='Comissão de Constituição e Justiça',
                             apelido='CCJ')
                   ]),
        ], actual_response)

        mock_obterDataInicialEFinal.assert_called_once_with(
            datetime(2018, 10, 28))
        mock.assert_no_pending_responses()
예제 #10
0
    def test_get_absent_events(self):
        expected_events = [
            self.dep.build_event(e) for e in [
                {
                    'id': '2'
                },
                {
                    'id': '3'
                },
                {
                    'id': '4'
                },
            ]
        ]
        events = [
            self.dep.build_event(e) for e in [
                {
                    'id': '1',
                    'orgaos': [{
                        'nome': 'Órgão 1',
                        'apelido': ''
                    }]
                },
                {
                    'id': '2',
                    'orgaos': [{
                        'nome': 'Órgão 1',
                        'apelido': ''
                    }]
                },
                {
                    'id': '3',
                    'orgaos': [{
                        'nome': 'Órgão 2',
                        'apelido': ''
                    }]
                },
                {
                    'id': '4',
                    'orgaos': [{
                        'nome': 'Órgão 2',
                        'apelido': ''
                    }]
                },
                {
                    'id': '5',
                    'orgaos': [{
                        'nome': 'Órgão 4',
                        'apelido': ''
                    }]
                },
                {
                    'id': '6',
                    'orgaos': [{
                        'nome': 'Órgão 4',
                        'apelido': 'PLEN'
                    }]
                },
            ]
        ]
        events_attended = [
            self.dep.build_event(e) for e in [
                {
                    'id': '3',
                    'orgaos': [{
                        'nome': 'Órgão 2',
                        'apelido': ''
                    }]
                },
                {
                    'id': '4',
                    'orgaos': [{
                        'nome': 'Órgão 2',
                        'apelido': ''
                    }]
                },
            ]
        ]
        commissions = [
            Orgao(nome='Órgão 1'),
            Orgao(nome='Órgão 2'),
            Orgao(nome='Órgão 3'),
        ]

        actual_response = self.dep.get_absent_events(
            events,
            events_attended,
            expected_events,
            commissions,
        )

        self.assertEqual([
            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')]),
        ], actual_response)
 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))
예제 #12
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()