import json
import logging
import re
import xml.etree.ElementTree as ET
from datetime import datetime, timedelta
import certifi
import urllib3
[documentos]class CamaraMunicipal(object):
""" Base class
"""
def __init__(self):
self.http = urllib3.PoolManager(
cert_reqs='CERT_REQUIRED',
ca_certs=certifi.where()
)
[documentos] def obterPresenca(self, data_inicio, data_fim):
data_controle = data_inicio
presenca_total = []
while data_controle <= data_fim:
r = self.http.request(
'GET',
'https://splegispdarmazenamento.blob.core.windows.net/containersip/PRESENCAS_{:02d}_{:02d}_{}.xml'.format(
data_controle.day, data_controle.month, data_controle.year
)
)
if r.status != 200:
logging.debug("Sem relatorio nesse dia")
presenca = None
else:
presenca = {'vereadores': [], 'sessoes': {}}
sessoes_nomes = []
root = ET.fromstring(r.data.decode('utf-8'))
for child in root:
child_sessoes = []
if child.tag == 'Vereador':
for sessao in child:
if sessao.tag == 'Sessao':
sessoes_nomes.append(sessao.attrib['Nome'])
child_sessoes.append({
'nome': sessao.attrib['Nome'],
'presenca': sessao.attrib['Presenca'],
})
presenca['vereadores'].append({
'nome': child.attrib['Nome'],
'chave': child.attrib['IDParlamentar'],
'presenteOrd': child.attrib['PresenteOrd'],
'presenteExtra': child.attrib['PresenteExtra'],
'sessoes': child_sessoes
})
elif child.tag == 'Presencas':
presenca['totalOrd'] = child.attrib['TotalSessoesOrdinarias']
presenca['totalExtra'] = child.attrib['TotalSessoesExtraOrdinarias']
sessoes_nomes = set(sessoes_nomes)
for sessao in sessoes_nomes:
presenca['sessoes'][sessao] = self.obterVotacoesSessao(
data_controle, sessao
)
data_controle = data_controle + timedelta(days=1)
presenca_total.append(presenca)
return presenca_total
[documentos] def obterVotacoesSessao(self, data, nome):
votacoes = []
data_sessao = None
r = self.http.request(
'GET',
'https://splegispdarmazenamento.blob.core.windows.net/containersip/VOTACOES_{:02d}_{:02d}_{}.xml'.format(
data.day, data.month, data.year
)
)
if r.status != 200:
logging.debug("Sem votacoes nesse dia")
else:
root = ET.fromstring(r.data.decode('utf-8'))
for child in root:
if child.tag == 'Sessao':
if child.attrib['Nome'] == nome:
data_sessao = child.attrib['Data']
for v in child:
votacao = {
'pauta': v.attrib['Materia'],
'projeto': v.attrib['Ementa'],
'votos': []
}
for voto in v:
if voto.tag == 'Vereador':
votacao['votos'].append({
'chave': voto.attrib['IDParlamentar'],
'nome': voto.attrib['Nome'],
'voto': voto.attrib['Voto']
})
votacoes.append(votacao)
return {'pautas': votacoes, 'data': data_sessao}
[documentos] def obterPautaSessao(self, data, nome):
projetos = {
'pautas': [],
'situacao': None,
'id': None
}
r = self.http.request(
'POST',
'http://splegisws.camara.sp.gov.br/ws/ws2.asmx/PautasSessoesPlenariasJSON',
encode_multipart=False,
fields={'Ano': data.year},
)
for item in json.loads(r.data.decode('utf-8')):
if nome in item['sessao']:
projetos = {
'pautas': self.obterPautaEstendidaSessao(item['chave']),
'situacao': item['status'],
'id': item['chave']
}
return projetos
[documentos] def obterPautaEstendidaSessao(self, sessao_id):
ementas = []
r = self.http.request(
'POST',
'http://splegisws.camara.sp.gov.br/ws/ws2.asmx/PautaEstendidaSessaoPlenariaJSON',
encode_multipart=False,
fields={'Chave': sessao_id},
)
for item in json.loads(r.data.decode('utf-8'))['projetos']:
ementas.append({
'ementa': item['ementa'],
'tipo': item['tipo'],
'numero': item['numero']
})
return ementas
[documentos] def obterProjetosParlamentar(self, parlamentar_id, ano, tipo='PL'):
projetos = []
r = self.http.request(
'POST',
'http://splegisws.camara.sp.gov.br/ws/ws2.asmx/ProjetosAutoresJSON',
encode_multipart=False,
fields={'ano': ano, 'tipo': tipo, 'numero': ''},
)
for item in json.loads(r.data.decode('utf-8')):
if 'leitura' in item and 'autores' in item:
try:
for autor in item['autores']:
if str(autor['chave']) == parlamentar_id.lower():
timestamp_str = re.match(r'\/Date\((\d*)\)', item['leitura'])
projetos.append({
'tipo': item['tipo'],
'numero': item['numero'],
'ano': item['ano'],
'data': datetime.fromtimestamp(int(timestamp_str.group(1))/1000)
})
except Exception:
#TODO
pass
return projetos
[documentos] def obterProjetosDetalhes(self, ano):
r = self.http.request(
'POST',
'http://splegisws.camara.sp.gov.br/ws/ws2.asmx/ProjetosPorAnoJSON',
encode_multipart=False,
fields={'ano': ano},
)
return json.loads(r.data.decode('utf-8'))
[documentos] def obterOcupacaoGabinete(self):
r = self.http.request(
'POST',
'http://splegisws.camara.sp.gov.br/ws/ws2.asmx/OcupacaoGabineteJSON',
encode_multipart=False
)
if r.status != 200:
raise Exception('API call failed')
try:
data_json = json.loads(r.data.decode('utf-8'))
return self.converterDataEmTime(data_json, ['inicio', 'fim'])
except:
raise Exception('Failed to decode API data')
[documentos] def converterDataEmTime(self, json, params_para_converter):
for item in json:
for key, value in item.items():
if key in params_para_converter:
value_re = re.match(r'^\/Date\((\d+)\)\/$', value)
if value_re == None:
continue
item[key] = datetime.utcfromtimestamp(int(value_re.group(1))/1000)
return json
[documentos] def obterVereadores(self):
r = self.http.request(
'POST',
'http://splegisws.camara.sp.gov.br/ws/ws2.asmx/VereadoresCMSPJSON',
encode_multipart=False
)
if r.status != 200:
raise Exception('API call failed')
try:
data_json = json.loads(r.data.decode('utf-8'))
vereadores = []
for vereador in data_json:
self.converterDataEmTime(vereador['mandatos'], ['inicio', 'fim'])
legislatura_atual = False
for mandato in vereador['mandatos']:
if mandato['fim'] > datetime.now():
legislatura_atual = True
if not legislatura_atual:
continue
self.converterDataEmTime(vereador['cargos'], ['inicio', 'fim'])
self.converterDataEmTime(vereador['filiacoes'], ['inicio', 'fim'])
vereadores.append(vereador)
return vereadores
except:
raise Exception('Failed to decode API data')