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}]
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))
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)
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
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)
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)
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
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()
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))
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()