csc-cia-stne 0.1.20__tar.gz → 0.1.22__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/PKG-INFO +1 -1
- {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/pyproject.toml +1 -1
- {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne/bc_sta.py +81 -70
- {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne.egg-info/PKG-INFO +1 -1
- {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/LICENCE +0 -0
- {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/README.md +0 -0
- {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/README_PYPI.md +0 -0
- {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/setup.cfg +0 -0
- {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne/__init__.py +0 -0
- {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne/bc_correios.py +0 -0
- {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne/email.py +0 -0
- {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne/ftp.py +0 -0
- {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne/gcp_bigquery.py +0 -0
- {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne/gcp_bucket.py +0 -0
- {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne/google_drive.py +0 -0
- {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne/karavela.py +0 -0
- {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne/logger_json.py +0 -0
- {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne/logger_rich.py +0 -0
- {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne/provio.py +0 -0
- {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne/servicenow.py +0 -0
- {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne/slack.py +0 -0
- {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne/stne_admin.py +0 -0
- {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne/utilitarios/__init__.py +0 -0
- {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne/utilitarios/functions/__init__.py +0 -0
- {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne/utilitarios/functions/func_b64.py +0 -0
- {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne/utilitarios/functions/func_converters.py +0 -0
- {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne/utilitarios/functions/func_datetime.py +0 -0
- {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne/utilitarios/functions/func_delete.py +0 -0
- {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne/utilitarios/functions/func_get_secret.py +0 -0
- {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne/utilitarios/functions/func_recriar_pastas.py +0 -0
- {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne/utilitarios/functions/func_settings.py +0 -0
- {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne/utilitarios/functions/func_titulo.py +0 -0
- {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne/utilitarios/functions/func_validate_json.py +0 -0
- {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne/utilitarios/validations/GcpBigQueryValidator.py +0 -0
- {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne/utilitarios/validations/GoogleDriveValidator.py +0 -0
- {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne/utilitarios/validations/ServiceNowValidator.py +0 -0
- {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne/utilitarios/validations/__init__.py +0 -0
- {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne/utilitarios/validations/ftp.py +0 -0
- {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne/utilitarios/validations/gcp_bucket.py +0 -0
- {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne/utilitarios/validations/waccess.py +0 -0
- {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne/utilitarios/validations/web_validator.py +0 -0
- {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne/utilitarios/web_screen/__init__.py +0 -0
- {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne/utilitarios/web_screen/web_screen_abstract.py +0 -0
- {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne/utilitarios/web_screen/web_screen_botcity.py +0 -0
- {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne/utilitarios/web_screen/web_screen_selenium.py +0 -0
- {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne/wacess.py +0 -0
- {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne/web.py +0 -0
- {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne.egg-info/SOURCES.txt +0 -0
- {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne.egg-info/dependency_links.txt +0 -0
- {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne.egg-info/requires.txt +0 -0
- {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne.egg-info/top_level.txt +0 -0
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
4
4
|
|
5
5
|
[project]
|
6
6
|
name = "csc_cia_stne"
|
7
|
-
version = "0.1.
|
7
|
+
version = "0.1.22"
|
8
8
|
license = { text = "MIT" }
|
9
9
|
description = "Biblioteca do time CSC-CIA utilizada no desenvolvimento de RPAs"
|
10
10
|
keywords = ["karavela", "csc", "cia", "stone", "rpa", "botcity", "stne"]
|
@@ -509,84 +509,95 @@ class BC_STA:
|
|
509
509
|
tipo_arquivo: list = None):
|
510
510
|
resultados = []
|
511
511
|
|
512
|
-
|
513
|
-
|
514
|
-
|
515
|
-
|
516
|
-
|
517
|
-
|
518
|
-
|
519
|
-
|
520
|
-
|
521
|
-
|
522
|
-
# Monta a URL usando a data atual do cursor
|
523
|
-
_inicio_str = ultima_dt.strftime("%Y-%m-%dT%H:%M:%S")
|
524
|
-
url = f"{self.base_url}/arquivos?tipoConsulta=AVANC&nivelDetalhe={nivel}"
|
525
|
-
url += f"&dataHoraInicio={_inicio_str}"
|
526
|
-
if situacao:
|
527
|
-
url += f"&situacaoTransmissao={situacao}"
|
528
|
-
if identificadorDocumento:
|
529
|
-
url += f"&identificadorDocumento={identificadorDocumento}"
|
530
|
-
if dt_fim:
|
531
|
-
_fim_str = dt_fim.strftime("%Y-%m-%dT%H:%M:%S")
|
532
|
-
url += f"&dataHoraFim={_fim_str}"
|
533
|
-
url += f"&qtdMaxResultados={qtd}"
|
534
|
-
|
535
|
-
response = requests.get(
|
536
|
-
url, headers=self.headers, auth=self.auth, timeout=60,
|
537
|
-
)
|
538
|
-
|
539
|
-
if response.status_code != 200:
|
540
|
-
log.error(f"Erro ao listar arquivos: response code {response.status_code}\n{response.text}")
|
541
|
-
return False
|
542
|
-
|
543
|
-
try:
|
544
|
-
dados = xml_response_to_json(response.text)
|
545
|
-
if not dados:
|
546
|
-
break # sem mais resultados
|
512
|
+
try:
|
513
|
+
# Parse seguro para datetime (assume formato ISO 'AAAA-MM-DDTHH:MM:SS')
|
514
|
+
dt_inicio = datetime.fromisoformat(inicio)
|
515
|
+
dt_fim = datetime.fromisoformat(fim) if fim else None
|
516
|
+
ultima_dt = dt_inicio
|
517
|
+
|
518
|
+
while True:
|
519
|
+
# Se já passamos do fim, encerra antes de chamar a API
|
520
|
+
if dt_fim and ultima_dt >= dt_fim:
|
521
|
+
break
|
547
522
|
|
548
|
-
#
|
549
|
-
|
523
|
+
# Monta a URL usando a data atual do cursor
|
524
|
+
_inicio_str = ultima_dt.strftime("%Y-%m-%dT%H:%M:%S")
|
525
|
+
url = f"{self.base_url}/arquivos?tipoConsulta=AVANC&nivelDetalhe={nivel}"
|
526
|
+
url += f"&dataHoraInicio={_inicio_str}"
|
527
|
+
if situacao:
|
528
|
+
url += f"&situacaoTransmissao={situacao}"
|
529
|
+
if identificadorDocumento:
|
530
|
+
url += f"&identificadorDocumento={identificadorDocumento}"
|
531
|
+
if dt_fim:
|
532
|
+
_fim_str = dt_fim.strftime("%Y-%m-%dT%H:%M:%S")
|
533
|
+
url += f"&dataHoraFim={_fim_str}"
|
534
|
+
url += f"&qtdMaxResultados={qtd}"
|
535
|
+
|
536
|
+
response = requests.get(
|
537
|
+
url, headers=self.headers, auth=self.auth, timeout=60,
|
538
|
+
)
|
539
|
+
|
540
|
+
if response.status_code != 200:
|
541
|
+
log.error(f"Erro ao listar arquivos: response code {response.status_code}\n{response.text}")
|
542
|
+
resposta = {"success": False, "status_code": int(response.status_code), "content": response.text}
|
543
|
+
return resposta
|
550
544
|
|
551
|
-
|
552
|
-
|
553
|
-
|
545
|
+
try:
|
546
|
+
dados = xml_response_to_json(response.text)
|
547
|
+
if not dados:
|
548
|
+
break # sem mais resultados
|
549
|
+
|
550
|
+
# Normaliza dados para lista
|
551
|
+
itens = dados if isinstance(dados, list) else [dados]
|
552
|
+
|
553
|
+
# (opcional) filtra por tipo_arquivo
|
554
|
+
if tipo_arquivo is not None:
|
555
|
+
itens = [a for a in itens if a.get("TipoArquivo") in tipo_arquivo]
|
556
|
+
|
557
|
+
resultados.extend(itens)
|
558
|
+
|
559
|
+
# Atualiza o cursor a partir do último item retornado
|
560
|
+
# Busca o último com DataHoraDisponibilizacao
|
561
|
+
ultimo = None
|
562
|
+
for cand in reversed(itens):
|
563
|
+
if "DataHoraDisponibilizacao" in cand and cand["DataHoraDisponibilizacao"]:
|
564
|
+
ultimo = cand["DataHoraDisponibilizacao"]
|
565
|
+
break
|
566
|
+
|
567
|
+
if not ultimo:
|
568
|
+
# fallback: se o JSON bruto vier como dict/list diferente, tente no original
|
569
|
+
if isinstance(dados, list) and dados and "DataHoraDisponibilizacao" in dados[-1]:
|
570
|
+
ultimo = dados[-1]["DataHoraDisponibilizacao"]
|
571
|
+
elif isinstance(dados, dict) and "DataHoraDisponibilizacao" in dados:
|
572
|
+
ultimo = dados["DataHoraDisponibilizacao"]
|
573
|
+
|
574
|
+
if not ultimo:
|
575
|
+
log.error("Campo 'DataHoraDisponibilizacao' não encontrado ou estrutura inesperada.")
|
576
|
+
resposta = {"success": False, "status_code": 500, "content": "Campo 'DataHoraDisponibilizacao' não encontrado ou estrutura inesperada."}
|
577
|
+
return resposta
|
578
|
+
#return False
|
554
579
|
|
555
|
-
|
580
|
+
# Cursor: último + 1s para evitar repetir o mesmo registro
|
581
|
+
proxima_dt = datetime.fromisoformat(ultimo) + timedelta(seconds=1)
|
556
582
|
|
557
|
-
|
558
|
-
|
559
|
-
ultimo = None
|
560
|
-
for cand in reversed(itens):
|
561
|
-
if "DataHoraDisponibilizacao" in cand and cand["DataHoraDisponibilizacao"]:
|
562
|
-
ultimo = cand["DataHoraDisponibilizacao"]
|
583
|
+
# Se a próxima dt já ultrapassa o fim, encerramos sem nova chamada
|
584
|
+
if dt_fim and proxima_dt > dt_fim:
|
563
585
|
break
|
564
586
|
|
565
|
-
|
566
|
-
# fallback: se o JSON bruto vier como dict/list diferente, tente no original
|
567
|
-
if isinstance(dados, list) and dados and "DataHoraDisponibilizacao" in dados[-1]:
|
568
|
-
ultimo = dados[-1]["DataHoraDisponibilizacao"]
|
569
|
-
elif isinstance(dados, dict) and "DataHoraDisponibilizacao" in dados:
|
570
|
-
ultimo = dados["DataHoraDisponibilizacao"]
|
571
|
-
|
572
|
-
if not ultimo:
|
573
|
-
log.error("Campo 'DataHoraDisponibilizacao' não encontrado ou estrutura inesperada.")
|
574
|
-
return False
|
587
|
+
ultima_dt = proxima_dt
|
575
588
|
|
576
|
-
|
577
|
-
|
578
|
-
|
579
|
-
|
580
|
-
|
581
|
-
break
|
582
|
-
|
583
|
-
ultima_dt = proxima_dt
|
584
|
-
|
585
|
-
except ET.ParseError as e:
|
586
|
-
log.error(f"Erro ao processar XML: {e}")
|
587
|
-
return False
|
589
|
+
except ET.ParseError as e:
|
590
|
+
log.error(f"Erro ao processar XML: {e}")
|
591
|
+
resposta = {"success": False, "status_code": 500, "content": f"Erro ao processar XML: {e}"}
|
592
|
+
return resposta
|
593
|
+
#return False
|
588
594
|
|
589
|
-
|
595
|
+
return {"success": True, "status_code": 200, "content": resultados}
|
596
|
+
#return resultados
|
597
|
+
except Exception as e:
|
598
|
+
log.error(f"Erro em BC_STA:listar_arquivos: {e}")
|
599
|
+
resposta = {"success": False, "status_code": 500, "content": f"Erro em BC_STA:listar_arquivos: {e}"}
|
600
|
+
return resposta
|
590
601
|
|
591
602
|
def download_arquivo(self,protocolo:str,filename:str=None):
|
592
603
|
"""Faz o download de um arquivo de um protocolo especifico
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne/utilitarios/functions/__init__.py
RENAMED
File without changes
|
{csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne/utilitarios/functions/func_b64.py
RENAMED
File without changes
|
File without changes
|
{csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne/utilitarios/functions/func_datetime.py
RENAMED
File without changes
|
{csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne/utilitarios/functions/func_delete.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
{csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne/utilitarios/functions/func_settings.py
RENAMED
File without changes
|
{csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne/utilitarios/functions/func_titulo.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne/utilitarios/validations/__init__.py
RENAMED
File without changes
|
File without changes
|
{csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne/utilitarios/validations/gcp_bucket.py
RENAMED
File without changes
|
{csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne/utilitarios/validations/waccess.py
RENAMED
File without changes
|
File without changes
|
{csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne/utilitarios/web_screen/__init__.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|