Código-fonte para DadosAbertosBrasil.camara._proposicoes

from datetime import date
from typing import Literal, Optional

from pydantic import validate_call, PositiveInt

from ..utils import Base, Get, parse, Formato, Output


[documentos] class Proposicao(Base): """Informações detalhadas sobre uma proposição específica. Parameters ---------- cod : int Código numérico da proposição da qual se deseja informações. verificar_certificado : bool, default=True Defina esse argumento como `False` em caso de falha na verificação do certificado SSL. Attributes ---------- dados : dict Conjunto completo de dados. cod : int Código numérico da proposição. uri : str Endereço para coleta de dados direta pela API da proposição. tipo_sigla : str Sigla do tipo de proposição. tipo_codigo : int Código numérico do tipo de proposição. numero : int Número da proposição. ano : int Ano da proposição. ementa : str Ementa da proposição. apresentacao : str Horário da apresentação da proposição no formato 'AAAA-MM-DD HH:MM'. uri_orgao_numerador : str Endereço para coleta de dados direta pela API do órgão numerador. ultima_atualizacao : str Data da última atualização do status da proposição. sequencia : int Sequência da proposição. sigla_orgao : str Sigla do órgão. uri_orgao : str Endereço para coleta de dados direta pela API do órgão. uri_ultimo_relator : str Endereço para coleta de dados direta pela API do último relaltor. regime : str Regime da proposição. descricao_tramitacao : str Descrição da tramitação. cod_tipo_tramitacao : str Código do tipo da tramitação. descricao_situacao : str Descrição da situação da proposição. cod_situacao : int Código númerico da situação da proposição. despacho : str Despacho. url : str URL da proposição. ambito : str Âmbito da proposição. uri_autores : str Endereço para coleta de dados direta pela API dos autores. descricao_tipo : str Descrição do tipo da proposição. ementa_detalhada : str Ementa detalhada da proposição. keywords : str Palavras-chaves da proposição. uri_proposicao_principal : str Endereço para coleta de dados direta pela API da proposição principal. uri_proposicao_anterior : str Endereço para coleta de dados direta pela API da proposição anterior. uri_proposicao_posterior : str Endereço para coleta de dados direta pela API da proposição posterior. url_inteiro_teor : str URL do inteiro teor. urn_final : str URN final. texto : str Texto da proposição. justificativa : str Justificativa da proposição. Examples -------- Obter a ementa da proposição #15990. >>> prop = camara.Proposicao(cod=15990) >>> prop.ementa ... ''Cria salvaguardas para a tecnologia no campo nuclear...' """ def __init__(self, cod: int, verificar_certificado: bool = True): self.cod = cod self.verify = verificar_certificado atributos = { "uri": ["uri"], "tipo_sigla": ["siglaTipo"], "tipo_codigo": ["codTipo"], "numero": ["numero"], "ano": ["ano"], "ementa": ["ementa"], "apresentacao": ["dataApresentacao"], "uri_orgao_numerador": ["uriOrgaoNumerador"], "ultima_atualizacao": ["statusProposicao", "dataHora"], "sequencia": ["statusProposicao", "sequencia"], "sigla_orgao": ["statusProposicao", "siglaOrgao"], "uri_orgao": ["statusProposicao", "uriOrgao"], "uri_ultimo_relator": ["statusProposicao", "uriUltimoRelator"], "regime": ["statusProposicao", "regime"], "descricao_tramitacao": ["statusProposicao", "descricaoTramitacao"], "cod_tipo_tramitacao": ["statusProposicao", "codTipoTramitacao"], "descricao_situacao": ["statusProposicao", "descricaoSituacao"], "cod_situacao": ["statusProposicao", "codSituacao"], "despacho": ["statusProposicao", "despacho"], "url": ["statusProposicao", "url"], "ambito": ["statusProposicao", "ambito"], "uri_autores": ["uriAutores"], "descricao_tipo": ["descricaoTipo"], "ementa_detalhada": ["ementaDetalhada"], "keywords": ["keywords"], "uri_proposicao_principal": ["uriPropPrincipal"], "uri_proposicao_anterior": ["uriPropAnterior"], "uri_proposicao_posterior": ["uriPropPosterior"], "url_inteiro_teor": ["urlInteiroTeor"], "urn_final": ["urnFinal"], "texto": ["texto"], "justificativa": ["justificativa"], } super().__init__( endpoint="camara", path=["proposicoes", str(cod)], unpack_keys=["dados"], error_key="statusProposicao", atributos=atributos, verify=self.verify, ) def __repr__(self) -> str: return f"DadosAbertosBrasil.camara: Proposição {self.cod}" def __str__(self) -> str: return f"Proposição {self.cod}"
[documentos] def autores( self, url: bool = True, formato: Formato = "pandas", ) -> Output: """Lista pessoas e/ou entidades autoras da proposição. Retorna uma lista em que cada item identifica uma pessoa ou entidade que é autora da proposição. Além de deputados, também podem ser autores de proposições os senadores, a sociedade civil, assembleias legislativas e os poderes Executivo e Judiciário. Pelo Regimento da Câmara, todos os que assinam uma proposição são considerados autores (art. 102), tanto os proponentes quanto os apoiadores. Para obter mais informações sobre cada autor, é recomendável acessar, se disponível, a URL que é valor do campo uri. Parameters ---------- url : bool, default=False Se False, remove as colunas contendo URI, URL e e-mails. Esse argumento é ignorado se `formato` for igual a 'json'. formato : {"json", "pandas", "url"}, default="pandas" Formato do dado que será retornado: - "json": Dicionário com as chaves e valores originais da API; - "pandas": DataFrame formatado; - "url": Endereço da API que retorna o arquivo JSON. Returns ------- pandas.core.frame.DataFrame | str | dict | list[dict] Lista pessoas e/ou entidades autoras da proposição. """ cols_to_rename = { "nome": "nome", "uri": "uri", "codTipo": "tipo_codigo", "tipo": "tipo", "ordemAssinatura": "ordem_assinatura", "proponente": "proponente", } return Get( endpoint="camara", path=["proposicoes", str(self.cod), "autores"], unpack_keys=["dados"], cols_to_rename=cols_to_rename, url_cols=["uri"], remover_url=not url, verify=self.verify, ).get(formato)
[documentos] def relacionadas( self, url: bool = True, index: bool = False, formato: Formato = "pandas", ) -> Output: """Uma lista de proposições relacionadas a uma em especial. Lista de informações básicas sobre proposições que de alguma forma se relacionam com a proposição, como pareceres, requerimentos, substitutivos, etc. Parameters ---------- url : bool, default=False Se False, remove as colunas contendo URI, URL e e-mails. Esse argumento é ignorado se `formato` for igual a 'json'. index : bool, default=False Se True, define a coluna `codigo` como index do DataFrame. Esse argumento é ignorado se `formato` for igual a 'json'. formato : {"json", "pandas", "url"}, default="pandas" Formato do dado que será retornado: - "json": Dicionário com as chaves e valores originais da API; - "pandas": DataFrame formatado; - "url": Endereço da API que retorna o arquivo JSON. Returns ------- pandas.core.frame.DataFrame | str | dict | list[dict] Uma lista de proposições relacionadas a uma em especial. """ cols_to_rename = { "id": "codigo", "uri": "uri", "siglaTipo": "tipo_sigla", "codTipo": "tipo_codigo", "numero": "numero", "ano": "ano", "ementa": "ementa", } return Get( endpoint="camara", path=["proposicoes", str(self.cod), "relacionadas"], unpack_keys=["dados"], cols_to_rename=cols_to_rename, cols_to_int=["tipo_codigo", "numero", "ano"], url_cols=["uri"], remover_url=not url, index=index, verify=self.verify, ).get(formato)
[documentos] def temas( self, index: bool = False, formato: Literal["dataframe", "json"] = "dataframe" ) -> Output: """Lista de áreas temáticas de uma proposição. Lista em que cada item traz informações sobre uma área temática à qual a proposição se relaciona, segundo classificação oficial do Centro de Documentação e Informação da Câmara. Parameters ---------- index : bool, default=False Se True, define a coluna `codigo` como index do DataFrame. Esse argumento é ignorado se `formato` for igual a 'json'. formato : {"json", "pandas", "url"}, default="pandas" Formato do dado que será retornado: - "json": Dicionário com as chaves e valores originais da API; - "pandas": DataFrame formatado; - "url": Endereço da API que retorna o arquivo JSON. Returns ------- pandas.core.frame.DataFrame | str | dict | list[dict] Lista de áreas temáticas de uma proposição. """ cols_to_rename = { "codTema": "codigo", "tema": "tema", "relevancia": "relevancia", } return Get( endpoint="camara", path=["proposicoes", str(self.cod), "temas"], unpack_keys=["dados"], cols_to_rename=cols_to_rename, index=index, verify=self.verify, ).get(formato)
[documentos] def tramitacoes( self, inicio: Optional[date] = None, fim: Optional[date] = None, url: bool = True, index: bool = False, formato: Formato = "pandas", ) -> Output: """O histórico de passos na tramitação de uma proposta. Lista que traz, como cada item, um “retrato” de informações que podem ser alteradas a cada etapa de tramitação na vida da proposição (como regime de tramitação e situação) e informações sobre o que causou esse novo estado. Esta representação das tramitações ainda é provisória. Parameters ---------- inicio : datetime.datetime or str, optional Data de início da tramitação, no formato `'AAAA-MM-DD'`. fim : datetime.datetime or str, optional Data de término da tramitação, no formato `'AAAA-MM-DD'`. url : bool, default=False Se False, remove as colunas contendo URI, URL e e-mails. Esse argumento é ignorado se `formato` for igual a 'json'. index : bool, default=False Se True, define a coluna `sequencia` como index do DataFrame. Esse argumento é ignorado se `formato` for igual a 'json'. formato : {"json", "pandas", "url"}, default="pandas" Formato do dado que será retornado: - "json": Dicionário com as chaves e valores originais da API; - "pandas": DataFrame formatado; - "url": Endereço da API que retorna o arquivo JSON. Returns ------- pandas.core.frame.DataFrame | str | dict | list[dict] O histórico de passos na tramitação de uma proposta. """ params = {} if inicio is not None: params["dataInicio"] = parse.data(inicio, "camara") if fim is not None: params["dataFim"] = parse.data(fim, "camara") cols_to_rename = { "dataHora": "data", "sequencia": "sequencia", "siglaOrgao": "orgao", "uriOrgao": "orgao_uri", "uriUltimoRelator": "ultimo_relator_uri", "regime": "regime", "descricaoTramitacao": "tramitacao", "codTipoTramitacao": "tramitacao_codigo", "descricaoSituacao": "situacao", "codSituacao": "situacao_codigo", "despacho": "despacho", "url": "url", "ambito": "ambito", } return Get( endpoint="camara", path=["proposicoes", str(self.cod), "tramitacoes"], params=params, unpack_keys=["dados"], cols_to_rename=cols_to_rename, cols_to_date=["data"], cols_to_int=["tramitacao_codigo", "situacao_codigo"], url_cols=["orgao_uri", "ultimo_relator_uri", "url"], remover_url=not url, index_col="sequencia", index=index, verify=self.verify, ).get(formato)
[documentos] def votacoes( self, asc: bool = False, ordenar_por: str = "dataHoraRegistro", url: bool = True, index: bool = False, formato: Formato = "pandas", ) -> Output: """Informações detalhadas de votações sobre a proposição. Retorna uma lista de identificadores básicos sobre as votações na Câmara que tiveram a proposição como objeto ou como afetada pelos seus resultados. Dados complementares sobre cada votação listada podem ser obtidos pelo objeto `camara.Votacao`. Parameters ---------- asc : bool, default=False Se os registros são ordenados no sentido ascendente: - True: De A a Z ou 0 a 9 (ascendente); - False: De Z a A ou 9 a 0 (descendente). ordenar_por : str, default='dataHoraRegistro' Qual dos elementos da representação deverá ser usado para aplicar ordenação à lista. url : bool, default=False Se False, remove as colunas contendo URI, URL e e-mails. Esse argumento é ignorado se `formato` for igual a 'json'. index : bool, default=False Se True, define a coluna `codigo` como index do DataFrame. Esse argumento é ignorado se `formato` for igual a 'json'. formato : {"json", "pandas", "url"}, default="pandas" Formato do dado que será retornado: - "json": Dicionário com as chaves e valores originais da API; - "pandas": DataFrame formatado; - "url": Endereço da API que retorna o arquivo JSON. Returns ------- pandas.core.frame.DataFrame | str | dict | list[dict] Informações detalhadas de votações sobre a proposição. """ params = {"ordem": "asc" if asc else "desc", "ordenarPor": ordenar_por} cols_to_rename = { "id": "codigo", "aprovacao": "aprovacao", "data": "data", "dataHoraRegistro": "data_registro", "descricao": "descricao", "proposicaoObjeto": "proposicao", "siglaOrgao": "orgao", "uri": "uri", "uriEvento": "evento_uri", "uriOrgao": "orgao_uri", "uriProposicaoObjeto": "proposicao_uri", } return Get( endpoint="camara", path=["proposicoes", str(self.cod), "votacoes"], params=params, unpack_keys=["dados"], cols_to_rename=cols_to_rename, cols_to_date=["data"], cols_to_int=["tramitacao_codigo", "situacao_codigo"], url_cols=["uri", "evento_uri", "orgao_uri", "proposicao_uri"], remover_url=not url, index=index, verify=self.verify, ).get(formato)
[documentos] @validate_call def lista_proposicoes( tipo: Optional[str] = None, numero: Optional[int] = None, ano: Optional[PositiveInt] = None, autor_cod: Optional[int] = None, autor_nome: Optional[str] = None, partido_sigla: Optional[str] = None, partido_cod: Optional[PositiveInt] = None, autor_uf: Optional[str] = None, keyword: Optional[str] = None, tramitacao_senado: bool = None, apresentacao_inicio: Optional[date] = None, apresentacao_fim: Optional[date] = None, situacao: Optional[int] = None, tema: Optional[int] = None, inicio: Optional[date] = None, fim: Optional[date] = None, pagina: PositiveInt = 1, itens: Optional[int] = None, asc: bool = True, ordenar_por: str = "id", url: bool = True, index: bool = False, formato: Formato = "pandas", verificar_certificado: bool = True, ) -> Output: """Lista de proposições na Câmara. Lista de informações básicas sobre projetos de lei, resoluções, medidas provisórias, emendas, pareceres e todos os outros tipos de proposições na Câmara. Por padrão, são retornadas todas as proposições que foram apresentadas ou tiveram alguma mudança de situação nos últimos 30 dias. Esse intervalo de tramitação pode ser configurado pelos parâmetros `inicio` e `fim`. Se for(em) passado(s) um ou mais dos parâmetros `id`, `ano`, `apresentacao_inicio`, `apresentacao_fim`, `autor_cod`, `autor_nome`, o intervalo de tramitação só será levado em consideração se os parâmetros `inico` e/ou `fim` estiverem explicitamente configurados. Se não estiverem, poderão ser listadas proposições que não tiveram tramitação recente (e a resposta pode demorar bastante). Parameters ---------- tipo : str, optional Sigla do tipo das proposições que se deseja obter. A lista de tipos e siglas existentes pode ser obtida pela função `camara.referencias`. numero : int, optional Número oficialmente atribuídos às proposições segundo o art. 137 do Regimento Interno, como “PL 1234/2016”. ano : int, optional Ano de apresentação das proposições que serão listadas no formato `'AAAA'`. autor_cod : int, optional Código numérico identificador do deputado autor das proposições que serão listadas. autor_nome : str, optional Nome ou parte do nome do(s) autor(es) das proposições que se deseja obter. Deve estar entre aspas. partido_sigla : str, optional Sigla do partido a que pertençam os autores das proposições a serem listadas. partido_cod : int, optional Identificador numérico do partido a que pertençam os autores das proposições que serão listadas. Esses identificadores podem ser obtidos pela função `camara.lista_partidos` e são mais precisos do que as siglas, que podem ser usadas por partidos diferentes em épocas diferentes. autor_uf : str, optional Sigla da unidade da federação (estados e Distrito Federal) pela qual o(s) autor(es) das proposições selecionadas tenha(m) sido eleito(s). keyword : str, optional Palavra-chave sobre o tema a que a proposição se relaciona. tramitacao_senado : bool, optional Buscar proposições que já tenha tramitado no Senado. inicio : str, optional Data do início do intervalo de tempo em que tenha havido tramitação das proposições a serem listadas, no formato `'AAAA-MM-DD'`. Se omitido, é assumido como a data de 30 dias anteriores à proposição. fim : str, optional Data do fim do intervalo de tempo em que tenha havido tramitação das proposições a serem listadas. Se omitido, é considerado ser o dia em que é feita a requisição. apresentacao_inicio : str, optional Data do início do intervalo de tempo em que tenham sido apresentadas as proposições a serem listadas, no formato `'AAAA-MM-DD'`. apresentacao_fim : str, optional Data do fim do intervalo de tempo em que tenham sido apresentadas as proposições a serem listadas. situacao : int, optional Código numérico do tipo de situação em que se encontram as proposições que serão listadas. As situações possíveis podem ser obtidas pela função `camara.referencias`. Atenção: este parâmetro pode apresentar resultados inesperados, por problemas com o registro dos dados. tema : int, optional Código numérico das áreas temáticas das proposições que serão listadas. Os temas possíveis podem ser obtidos pela função `camara.referencias`. pagina : int, default=1 Número da página de resultados, a partir de 1, que se deseja obter com a requisição, contendo o número de itens definido pelo parâmetro `itens`. Se omitido, assume o valor 1. itens : int, optional Número máximo de itens na página que se deseja obter com esta requisição. asc : bool, default=True Se os registros são ordenados no sentido ascendente: - True: De A a Z ou 0 a 9 (ascendente); - False: De Z a A ou 9 a 0 (descendente). ordenar_por : str, default='id' Qual dos elementos da representação deverá ser usado para aplicar ordenação à lista. url : bool, default=False Se False, remove as colunas contendo URI, URL e e-mails. Esse argumento é ignorado se `formato` for igual a 'json'. index : bool, default=False Se True, define a coluna `codigo` como index do DataFrame. Esse argumento é ignorado se `formato` for igual a 'json'. formato : {"json", "pandas", "url"}, default="pandas" Formato do dado que será retornado: - "json": Dicionário com as chaves e valores originais da API; - "pandas": DataFrame formatado; - "url": Endereço da API que retorna o arquivo JSON. verificar_certificado : bool, default=True Defina esse argumento como `False` em caso de falha na verificação do certificado SSL. Returns ------- pandas.core.frame.DataFrame | str | dict | list[dict] Lista de proposições na Câmara. """ params = { "pagina": pagina, "ordem": "asc" if asc else "desc", "ordenarPor": ordenar_por, } if tipo is not None: params["siglaTipo"] = tipo if numero is not None: params["numero"] = numero if ano is not None: params["ano"] = ano if autor_cod is not None: params["idDeputadoAutor"] = autor_cod if autor_nome is not None: params["autor"] = autor_nome if partido_sigla is not None: params["siglaPartidoAutor"] = partido_sigla if partido_cod is not None: params["idPartidoAutor"] = partido_cod if autor_uf is not None: params["siglaUfAutor"] = parse.uf(autor_uf) if keyword is not None: params["keywords"] = keyword if tramitacao_senado is not None: params["tramitacaoSenado"] = "true" if tramitacao_senado else "false" if apresentacao_inicio is not None: params["dataApresentacaoInicio"] = str(apresentacao_inicio) if apresentacao_fim is not None: params["dataApresentacaoFim"] = str(apresentacao_fim) if situacao is not None: params["codSituacao"] = situacao if tema is not None: params["codTema"] = tema if inicio is not None: params["dataInicio"] = parse.data(inicio, "camara") if fim is not None: params["dataFim"] = parse.data(fim, "camara") if itens is not None: params["itens"] = itens cols_to_rename = { "id": "codigo", "uri": "uri", "siglaTipo": "tipo", "codTipo": "tipo_codigo", "numero": "numero", "ano": "ano", "ementa": "ementa", } return Get( endpoint="camara", path=["proposicoes"], params=params, unpack_keys=["dados"], cols_to_rename=cols_to_rename, url_cols=["uri"], remover_url=not url, index=index, verify=verificar_certificado, ).get(formato)