csc-cia-stne 0.0.43__py3-none-any.whl
Sign up to get free protection for your applications and to get access to all the features.
- csc_cia_stne/__init__.py +89 -0
- csc_cia_stne/bc_correios.py +529 -0
- csc_cia_stne/bc_sta.py +416 -0
- csc_cia_stne/email.py +239 -0
- csc_cia_stne/gcp_bigquery.py +224 -0
- csc_cia_stne/google_drive.py +268 -0
- csc_cia_stne/karavela.py +135 -0
- csc_cia_stne/logger_json.py +92 -0
- csc_cia_stne/logger_rich.py +249 -0
- csc_cia_stne/provio.py +103 -0
- csc_cia_stne/servicenow.py +689 -0
- csc_cia_stne/slack.py +227 -0
- csc_cia_stne/stne_admin.py +597 -0
- csc_cia_stne/utilitarios/__init__.py +9 -0
- csc_cia_stne/utilitarios/functions/__init__.py +14 -0
- csc_cia_stne/utilitarios/functions/func_b64.py +50 -0
- csc_cia_stne/utilitarios/functions/func_converters.py +18 -0
- csc_cia_stne/utilitarios/functions/func_recriar_pastas.py +29 -0
- csc_cia_stne/utilitarios/functions/func_settings.py +66 -0
- csc_cia_stne/utilitarios/functions/func_titulo.py +141 -0
- csc_cia_stne/utilitarios/validations/GcpBigQueryValidator.py +133 -0
- csc_cia_stne/utilitarios/validations/GoogleDriveValidator.py +144 -0
- csc_cia_stne/utilitarios/validations/ServiceNowValidator.py +403 -0
- csc_cia_stne/utilitarios/validations/__init__.py +3 -0
- csc_cia_stne-0.0.43.dist-info/LICENCE +21 -0
- csc_cia_stne-0.0.43.dist-info/METADATA +33 -0
- csc_cia_stne-0.0.43.dist-info/RECORD +29 -0
- csc_cia_stne-0.0.43.dist-info/WHEEL +5 -0
- csc_cia_stne-0.0.43.dist-info/top_level.txt +1 -0
csc_cia_stne/slack.py
ADDED
@@ -0,0 +1,227 @@
|
|
1
|
+
import base64
|
2
|
+
from slack_sdk import WebClient
|
3
|
+
from pydantic import BaseModel, ValidationError, field_validator
|
4
|
+
from typing import Union
|
5
|
+
|
6
|
+
|
7
|
+
class InitParamsValidator(BaseModel):
|
8
|
+
"""
|
9
|
+
Classe para validar os parâmetros de inicialização.
|
10
|
+
Atributos:
|
11
|
+
- token_slack: Union[str, dict] - O token do Slack, que pode ser uma string ou um dicionário.
|
12
|
+
- channel_id: str - O ID do canal do Slack.
|
13
|
+
- on_base64: bool - Indica se o token do Slack está em base64.
|
14
|
+
Métodos:
|
15
|
+
- validate_token_slack(value, info): Valida o token do Slack.
|
16
|
+
- validate_token_slack_dict(value, info): Valida o token do Slack quando é um dicionário.
|
17
|
+
- validate_token_slack(value, info): Valida o valor de on_base64.
|
18
|
+
"""
|
19
|
+
|
20
|
+
token_slack: Union[str, dict]
|
21
|
+
channel_id:str
|
22
|
+
on_base64:bool
|
23
|
+
|
24
|
+
"""
|
25
|
+
Valida o token do Slack.
|
26
|
+
Parâmetros:
|
27
|
+
- value: str - O valor do token do Slack.
|
28
|
+
- info: dict - Informações adicionais sobre o campo.
|
29
|
+
Retorna:
|
30
|
+
- str: O valor do token do Slack, se for válido.
|
31
|
+
Lança:
|
32
|
+
- ValueError: Se o valor não for uma string ou estiver vazio.
|
33
|
+
"""
|
34
|
+
@field_validator('channel_id')
|
35
|
+
def validate_str(cls, value, info):
|
36
|
+
if not isinstance(value, str) or not value.strip():
|
37
|
+
raise ValueError(f"O campo '{info.field_name}' deve ser strings e não {type(value)}")
|
38
|
+
return value
|
39
|
+
|
40
|
+
"""
|
41
|
+
Valida o token do Slack quando é um dicionário.
|
42
|
+
Parâmetros:
|
43
|
+
- value: dict - O valor do token do Slack.
|
44
|
+
- info: dict - Informações adicionais sobre o campo.
|
45
|
+
Retorna:
|
46
|
+
- dict: O valor do token do Slack, se for válido.
|
47
|
+
Lança:
|
48
|
+
- ValueError: Se o valor não for um dicionário ou uma string vazia.
|
49
|
+
"""
|
50
|
+
@field_validator('token_slack')
|
51
|
+
def validate_dict(cls, value, info):
|
52
|
+
if not isinstance(value, dict) and (not isinstance(value, str) or not value.strip()):
|
53
|
+
raise ValueError(f"O campo '{info.field_name}' deve ser strings e não {type(value)}")
|
54
|
+
return value
|
55
|
+
|
56
|
+
"""
|
57
|
+
Valida o valor de on_base64.
|
58
|
+
Parâmetros:
|
59
|
+
- value: bool - O valor de on_base64.
|
60
|
+
- info: dict - Informações adicionais sobre o campo.
|
61
|
+
Retorna:
|
62
|
+
- bool: O valor de on_base64, se for válido.
|
63
|
+
Lança:
|
64
|
+
- ValueError: Se o valor não for um booleano.
|
65
|
+
"""
|
66
|
+
@field_validator('on_base64')
|
67
|
+
def validate_bool(cls, value, info):
|
68
|
+
if not isinstance(value, bool):
|
69
|
+
raise ValueError(f"O campo '{info.field_name}' deve ser strings e não {type(value)}")
|
70
|
+
return value
|
71
|
+
|
72
|
+
|
73
|
+
class SendSlackMessageParamsValidator(BaseModel):
|
74
|
+
"""
|
75
|
+
Valida os parâmetros para enviar uma mensagem no Slack.
|
76
|
+
Atributos:
|
77
|
+
- message (str): A mensagem a ser enviada.
|
78
|
+
- highlights (list): Uma lista de destaques.
|
79
|
+
- files (list): Uma lista de arquivos.
|
80
|
+
Métodos:
|
81
|
+
- validate_message(value, info): Valida o campo 'message' para garantir que seja uma string não vazia.
|
82
|
+
- validate_list(value, info): Valida os campos 'highlights' e 'files' para garantir que sejam listas.
|
83
|
+
"""
|
84
|
+
|
85
|
+
message:str
|
86
|
+
highlights:list
|
87
|
+
file_list:list
|
88
|
+
|
89
|
+
@field_validator('message')
|
90
|
+
def validate_message(cls, value, info):
|
91
|
+
if not isinstance(value, str) or not value.strip():
|
92
|
+
raise ValueError(f"O campo '{info.field_name}' deve ser strings e não {type(value)}")
|
93
|
+
return value
|
94
|
+
|
95
|
+
@field_validator('highlights','file_list')
|
96
|
+
def validate_list(cls, value, info):
|
97
|
+
if not isinstance(value, list):
|
98
|
+
raise ValueError(f"O campo '{info.field_name}' deve ser strings e não {type(value)}")
|
99
|
+
return value
|
100
|
+
|
101
|
+
|
102
|
+
class Slack():
|
103
|
+
|
104
|
+
|
105
|
+
def __init__(self, token_slack:Union[str, dict], channel_id, on_base64:bool=False):
|
106
|
+
"""
|
107
|
+
Inicializa a classe Slack.
|
108
|
+
Parâmetros:
|
109
|
+
- token_slack (str): O token de autenticação do Slack.
|
110
|
+
- base64 (bool, opcional): Indica se o token_slack está codificado em base64. O padrão é False.
|
111
|
+
"""
|
112
|
+
|
113
|
+
self.token_slack = token_slack
|
114
|
+
self.on_base64 = on_base64
|
115
|
+
self.channel_id = channel_id
|
116
|
+
|
117
|
+
try:
|
118
|
+
|
119
|
+
InitParamsValidator(token_slack=token_slack, on_base64=on_base64,channel_id=channel_id)
|
120
|
+
|
121
|
+
except ValidationError as e:
|
122
|
+
|
123
|
+
raise ValueError("Erro na validação dos dados de input da inicialização da instância:", e.errors())
|
124
|
+
|
125
|
+
if self.on_base64:
|
126
|
+
|
127
|
+
self.token_slack = base64.b64decode(self.token_slack).decode('utf-8')
|
128
|
+
|
129
|
+
self.client = WebClient(self.token_slack)
|
130
|
+
|
131
|
+
|
132
|
+
def send_message(self, message:str, highlights:list=[] , file_list:list=[]):
|
133
|
+
"""
|
134
|
+
Envia uma mensagem para o canal do Slack.
|
135
|
+
Parâmetros:
|
136
|
+
- message: str - A mensagem a ser enviada.
|
137
|
+
- highlights: list - Uma lista de destaques (attachments) a serem exibidos junto com a mensagem.
|
138
|
+
- files: list (opcional) - Uma lista de arquivos a serem anexados à mensagem.
|
139
|
+
Retorna:
|
140
|
+
Um dicionário com as seguintes chaves:
|
141
|
+
- status: bool - Indica se o envio da mensagem foi bem-sucedido.
|
142
|
+
- message: dict - A resposta da API do Slack contendo informações sobre a mensagem enviada.
|
143
|
+
- success_attachments: list - Uma lista dos anexos que foram enviados com sucesso.
|
144
|
+
- failed_success_attachments: list - Uma lista dos anexos que falharam ao serem enviados.
|
145
|
+
Caso ocorra algum erro durante o envio da mensagem, o dicionário terá a seguinte estrutura:
|
146
|
+
- status: bool - Indica se ocorreu um erro durante o envio da mensagem.
|
147
|
+
- error: dict - A resposta da API do Slack contendo informações sobre o erro ocorrido.
|
148
|
+
- success_attachments: list - Uma lista dos anexos que foram enviados com sucesso.
|
149
|
+
- failed_attachments: list - Uma lista dos anexos que falharam ao serem enviados.
|
150
|
+
"""
|
151
|
+
|
152
|
+
try:
|
153
|
+
|
154
|
+
SendSlackMessageParamsValidator(message=message, highlights=highlights, file_list=file_list)
|
155
|
+
|
156
|
+
except ValidationError as e:
|
157
|
+
|
158
|
+
raise ValueError("Erro na validação dos dados de input da inicialização da instância:", e.errors())
|
159
|
+
|
160
|
+
|
161
|
+
failed_attachments = []
|
162
|
+
|
163
|
+
success_attachments = []
|
164
|
+
|
165
|
+
result_message = self.client.chat_postMessage(
|
166
|
+
channel=self.channel_id,
|
167
|
+
text=message,
|
168
|
+
blocks=[
|
169
|
+
{
|
170
|
+
"type": "section",
|
171
|
+
"text": {
|
172
|
+
"type": "mrkdwn",
|
173
|
+
"text": message
|
174
|
+
}
|
175
|
+
},
|
176
|
+
],
|
177
|
+
attachments=highlights
|
178
|
+
)
|
179
|
+
|
180
|
+
if file_list is not None and len(file_list) > 0:
|
181
|
+
|
182
|
+
# validar os arquivos anexados
|
183
|
+
|
184
|
+
for file_item in file_list:
|
185
|
+
|
186
|
+
if 'title' in file_item and 'file' in file_item:
|
187
|
+
|
188
|
+
if file_item['title'] is not None and len(str(file_item['title']).replace(" ","")) > 0 and file_item['file'] is not None and len(str(file_item['file']).replace(" ","")) > 0:
|
189
|
+
|
190
|
+
success_attachments.append(file_item)
|
191
|
+
|
192
|
+
else:
|
193
|
+
|
194
|
+
failed_attachments.append(file_item)
|
195
|
+
|
196
|
+
else:
|
197
|
+
|
198
|
+
failed_attachments.append(file_item)
|
199
|
+
|
200
|
+
if len(success_attachments) > 0:
|
201
|
+
|
202
|
+
# Enviar mensagem com anexos
|
203
|
+
|
204
|
+
result_message = self.client.files_upload_v2(
|
205
|
+
channel=self.channel_id,
|
206
|
+
initial_comment="anexos",
|
207
|
+
file_uploads=success_attachments
|
208
|
+
)
|
209
|
+
|
210
|
+
if result_message.get('ok', True):
|
211
|
+
|
212
|
+
return {
|
213
|
+
'status':True,
|
214
|
+
'message':result_message,
|
215
|
+
'success_attachments':success_attachments,
|
216
|
+
'failed_success_attachments':failed_attachments
|
217
|
+
}
|
218
|
+
|
219
|
+
else:
|
220
|
+
|
221
|
+
return {
|
222
|
+
'status':False,
|
223
|
+
'error':result_message,
|
224
|
+
'success_attachments':success_attachments,
|
225
|
+
'failed_attachments':failed_attachments
|
226
|
+
}
|
227
|
+
|