source.archives

  1from dictionary.sql import search_user_archives_quantity, search_user_archives_name
  2from dictionary.vars import to_remove_list, to_remove_archive_list
  3from functions.query_executor import QueryExecutor
  4from functions.login import Login
  5from time import sleep
  6import streamlit as st
  7
  8
  9class Archives:
 10    """
 11    Classe que representa os arquivos, com as quatro funções básicas de um CRUD.
 12    """
 13
 14    def check_if_archive_name_already_exists(self, archive_name: str):
 15        """
 16        Verifica se o nome do arquivo já foi utilizado anteriormente.
 17
 18        Returns
 19        -------
 20        is_archive_name_available (bool): Se o nome do arquivo está disponível ou não.
 21        """
 22        is_archive_name_available: bool
 23
 24        logged_user_name, logged_user_document = Login().get_user_data(return_option="user_login_password")
 25
 26        cards_with_parameter_name_query = """SELECT COUNT(id_arquivo) FROM arquivo_texto WHERE nome_arquivo = %s AND usuario_associado = %s AND documento_usuario_associado = %s;"""
 27        query_values = (archive_name, logged_user_name, logged_user_document)
 28
 29        archives_with_parameter_name_quantity = QueryExecutor().simple_consult_query(query=cards_with_parameter_name_query, params=query_values)
 30        archives_with_parameter_name_quantity = QueryExecutor().treat_simple_result(value_to_treat=archives_with_parameter_name_quantity, values_to_remove=to_remove_list)
 31        archives_with_parameter_name_quantity = int(archives_with_parameter_name_quantity)
 32
 33        if archives_with_parameter_name_quantity == 0:
 34            is_archive_name_available = True
 35        else:
 36            is_archive_name_available = False
 37
 38        return is_archive_name_available
 39
 40    def get_user_archives_quantity(self):
 41        """
 42        Consulta a quantidade de arquivos registrados pelo usuário.
 43
 44        Returns
 45        -------
 46        user_archives_quantity (int): A quantidade de arquivos registrados pelo usuário.
 47        """
 48        logged_user_name, logged_user_document = Login().get_user_data(return_option="user_doc_name")
 49
 50        user_archives_quantity = QueryExecutor().simple_consult_query(search_user_archives_quantity, params=(logged_user_name, logged_user_document))
 51        user_archives_quantity = QueryExecutor().treat_simple_result(user_archives_quantity, to_remove_list)
 52        user_archives_quantity = int(user_archives_quantity)
 53
 54        return user_archives_quantity
 55
 56    def get_archives_names(self):
 57        """
 58        Consulta o nome dos arquivos.
 59
 60        Returns
 61        -------
 62        archives_names (list): A lista com o nome dos arquivos.
 63        """
 64        logged_user_name, logged_user_document = Login().get_user_data(return_option="user_doc_name")
 65
 66        archives_names = []
 67        user_archives_name = QueryExecutor().complex_consult_query(search_user_archives_name, params=(logged_user_name, logged_user_document))
 68        user_archives_name = QueryExecutor().treat_numerous_simple_result(user_archives_name, to_remove_list)
 69
 70        for i in range(0, len(user_archives_name)):
 71            archives_names.append(user_archives_name[i])
 72
 73        return archives_names
 74
 75    def create_new_archive(self):
 76        """
 77        Função para criação de um novo arquivo.
 78        """
 79        logged_user_name, logged_user_document = Login().get_user_data(return_option="user_doc_name")
 80        logged_user, logged_user_password = Login().get_user_data(return_option="user_login_password")
 81
 82        col1, col2 = st.columns(2)
 83
 84        with col1:
 85            with st.expander(label="Entrada de Dados", expanded=True):
 86                archive_name = st.text_input(label="Nome do arquivo", max_chars=100,help="É necessário definir um nome para identificação e consulta posterior.")
 87                uploaded_file = st.file_uploader(label="Escolha um arquivo de texto", type=["txt"], help="São permitidos arquivos de texto, na extensão '.txt'. O tamanho do arquivo não pode exceder 200 MB.")
 88
 89                content = None
 90
 91                if uploaded_file:
 92                    content = uploaded_file.read().decode("utf-8")
 93                    with col2:
 94                        with st.spinner(text="Carregando arquivo..."):
 95                            sleep(2.5)
 96                        if content != "":
 97                            with st.expander(label="Conteudo do arquivo carregado", expanded=True):
 98                                st.info(content)
 99                        elif content == "":
100                            with col2:
101                                st.error(body="O Conteudo do arquivo está vazio.")
102
103            register_archive_button = st.button(":floppy_disk: Fazer upload do arquivo")
104
105            if register_archive_button and uploaded_file is not None and content != "" and archive_name != "":
106                is_archive_name_available = self.check_if_archive_name_already_exists(archive_name=archive_name)
107
108                if is_archive_name_available:
109                    with col2:
110                        with st.expander(label="Validação dos dados", expanded=True):
111                            st.success(body="Nome de arquivo disponível.")
112
113                    archive_query = "INSERT INTO arquivo_texto (nome_arquivo, conteudo, usuario_associado, documento_usuario_associado) VALUES (%s, %s, %s, %s)"
114                    archive_values = (archive_name, content, logged_user_name, logged_user_document)
115
116                    if content is not None:
117                        QueryExecutor().insert_query(archive_query, archive_values,"Upload do arquivo realizado com sucesso!", "Erro ao fazer upload do arquivo:")
118
119                        log_query = """INSERT INTO logs_atividades (usuario_log, tipo_log, conteudo_log) VALUES(%s, %s, %s)"""
120                        log_query_values = (logged_user, "Cadastro", "Fez o upload do arquivo {}.".format(archive_name))
121                        QueryExecutor().insert_query(log_query, log_query_values, "Log gravado.", "Erro ao gravar log:")
122
123                else:
124                    with col2:
125                        with st.expander(label="Validação dos dados", expanded=True):
126                            st.error(body="O nome do arquivo já está sendo utilizado.")
127
128            elif register_archive_button and (uploaded_file is None or content == "" or archive_name == ""):
129
130                with col2:
131                    with st.spinner(text=""):
132                        sleep(2.5)
133
134                    if uploaded_file is None:
135                        with st.expander(label="Validação dos dados", expanded=True):
136                            st.error(body="Não foi feito o upload de um arquivo.")
137                    if archive_name == "":
138                        with st.expander(label="Validação dos dados", expanded=True):
139                            st.error(body="Não foi informado um nome para o arquivo.")
140
141    def read_archive(self):
142        """
143        Função para a consulta de um arquivo.
144        """
145        logged_user_name, logged_user_document = Login().get_user_data(return_option="user_doc_name")
146        logged_user, logged_user_password = Login().get_user_data(return_option="user_login_password")
147
148        user_archives_quantity = self.get_user_archives_quantity()
149
150        if user_archives_quantity >= 1:
151            col1, col2 = st.columns(2)
152
153            archives_names = self.get_archives_names()
154
155            with col1:
156
157                with st.expander(label="Consulta", expanded=True):
158                    selected_archive = st.selectbox(label="Selecione o arquivo", options=archives_names)
159                    safe_password = st.text_input(label="Informe sua senha", type="password", help="Corresponde a senha utilizada para acessar a aplicação.")
160                    confirm_safe_password = st.text_input(label="Confirme sua senha", type="password", help="Deve ser idêntica a senha informada acima.")
161                    confirm_selection = st.checkbox(label="Confirmar dados", value=False)
162
163                consult_button = st.button(label=":file_folder: Consultar arquivo")
164
165                if consult_button and confirm_selection:
166                    
167                    is_password_valid, hashed_password = Login().check_login(logged_user, safe_password)
168
169                    if safe_password != "" and confirm_safe_password != "" and safe_password == confirm_safe_password and is_password_valid == True:
170                        with st.spinner(text="Aguarde..."):
171                            sleep(2.5)
172
173                            archive_content_query = """
174                            SELECT 
175                                arquivo_texto.conteudo
176                            FROM
177                                arquivo_texto
178                            INNER JOIN
179                                usuarios ON arquivo_texto.usuario_associado = usuarios.nome
180                            AND arquivo_texto.documento_usuario_associado = usuarios.documento_usuario
181                            WHERE
182                                arquivo_texto.nome_arquivo = %s
183                            AND
184                                arquivo_texto.usuario_associado = %s
185                            AND
186                                arquivo_texto.documento_usuario_associado = %s;"""
187
188                            archive_content = (QueryExecutor().simple_consult_query(archive_content_query, params=(selected_archive, logged_user_name, logged_user_document)))
189                            archive_content = (QueryExecutor().treat_simple_result(archive_content, to_remove_archive_list))
190                            archive_content = archive_content.replace("\\n", " ")
191                            archive_content = archive_content.replace("  ", " ")
192                            archive_content = archive_content.split(" ")
193
194                            for i in range(0, len(archive_content)):
195                                if archive_content[i] == "":
196                                    del archive_content[i]
197
198                            with col2:
199                                with st.expander(label="Conteudo", expanded=True):
200
201                                    display_content = ""
202                                    for i in range(0, len(archive_content)):
203                                        display_content += str(archive_content[i]) + "\n\n"
204                                    st.code(display_content)
205
206                    elif safe_password != "" and confirm_safe_password != "" and safe_password == confirm_safe_password and is_password_valid == False:
207                        with col2:
208                            with st.spinner(text="Aguarde..."):
209                                sleep(0.5)
210                            with st.expander(label="Validação dos dados", expanded=True):
211                                st.error(body="A senha informada é inválida.")
212
213                    elif safe_password != confirm_safe_password:
214                        with col2:
215                            with st.spinner(text="Aguarde..."):
216                                sleep(0.5)
217                            with st.expander(label="Validação dos dados", expanded=True):
218                                st.error(body="As senhas informadas não coincidem.")
219
220                elif consult_button and confirm_selection == False:
221                    with col2:
222                        with st.spinner(text="Aguarde..."):
223                            sleep(0.5)
224                        with st.expander(label="Validação dos dados", expanded=True):
225                            st.warning(body="Confirme a seleção dos dados.")
226
227        elif user_archives_quantity == 0:
228            col1, col2, col3 = st.columns(3)
229            with col2:
230                st.warning(body="Você ainda não possui arquivos registrados.")
231
232    def update_archive(self):
233        """
234        Função para a atualização de um arquivo.
235        """
236        logged_user_name, logged_user_document = Login().get_user_data(return_option="user_doc_name")
237        logged_user, logged_user_password = Login().get_user_data(return_option="user_login_password")
238
239        user_archives_quantity = self.get_user_archives_quantity()
240
241        if user_archives_quantity >= 1:
242            col1, col2 = st.columns(2)
243
244            archives_names = self.get_archives_names()
245
246            with col1:
247
248                with st.expander(label="Consulta", expanded=True):
249                    selected_archive = st.selectbox(label="Selecione o arquivo", options=archives_names)
250                    safe_password = st.text_input(label="Informe sua senha", type="password", help="Corresponde a senha utilizada para acessar a aplicação.")
251                    confirm_safe_password = st.text_input(label="Confirme sua senha", type="password", help="Deve ser idêntica a senha informada acima.")
252                    confirm_selection = st.checkbox(label="Confirmar dados", value=False)
253
254                    if confirm_selection:
255                        is_password_valid, hashed_password = Login().check_login(logged_user, safe_password)
256
257                        if safe_password != "" and confirm_safe_password != "" and safe_password == confirm_safe_password and is_password_valid == True:
258                            with st.spinner(text="Aguarde..."):
259                                sleep(0.5)
260
261                            archive_content_query = """
262                            SELECT
263                                arquivo_texto.nome_arquivo,
264                                arquivo_texto.conteudo
265                            FROM
266                                arquivo_texto
267                            INNER JOIN
268                                usuarios ON arquivo_texto.usuario_associado = usuarios.nome
269                            AND arquivo_texto.documento_usuario_associado = usuarios.documento_usuario
270                            WHERE
271                                arquivo_texto.nome_arquivo = %s
272                            AND
273                            arquivo_texto.usuario_associado = %s
274                            AND arquivo_texto.documento_usuario_associado = %s;
275                            """
276
277                            archive_content = (QueryExecutor().complex_compund_query(query=archive_content_query, list_quantity=2, params=(selected_archive, logged_user_name, logged_user_document)))
278                            archive_content = (QueryExecutor().treat_complex_result(archive_content, to_remove_archive_list))
279
280                            for i in range(0, len(archive_content)):
281                                if archive_content[i] == "":
282                                    del archive_content[i]
283
284                            with col1:
285                                with st.expander(label="Conteudo", expanded=True):
286
287                                    display_content = ""
288                                    for i in range(0, len(archive_content)):
289                                        display_content += str(
290                                            archive_content[i]) + "\n\n"
291
292                                    st.code(display_content)
293
294                            with col2:
295                                with st.spinner(text="Aguarde..."):
296                                    sleep(0.5)
297
298                                with st.expander(label="Novos dados", expanded=True):
299                                    new_archive_name = st.text_input(label="Novo nome do arquivo", max_chars=100, help="É necessário definir um nome para identificação e consulta posterior.")
300                                    new_uploaded_file = st.file_uploader(label="Escolha um arquivo de texto", type=["txt"], help="São permitidos arquivos de texto, na extensão '.txt'. O tamanho do arquivo não pode exceder 200 MB.")
301                                    confirm_new_data = st.checkbox(label="Confirmar novos dados")
302
303                                    content = None
304
305                                    if new_uploaded_file:
306                                        content = new_uploaded_file.read().decode("utf-8")
307                                        with col2:
308                                            with st.spinner(text="Carregando arquivo..."):
309                                                sleep(0.5)
310                                            if content != "":
311                                                with st.expander(label="Conteudo do arquivo carregado", expanded=True):
312                                                    st.info(content)
313                                            elif content == "":
314                                                with col2:
315                                                    st.error(body="O Conteudo do arquivo está vazio.")
316
317                                update_archive_button = st.button(label=":arrows_counterclockwise: Atualizar arquivo")
318
319                            if confirm_new_data and update_archive_button:
320
321                                with st.spinner(text="Aguarde..."):
322                                    sleep(2.5)
323
324                                if new_archive_name != "" and content is not None:
325
326                                    is_archive_name_available = self.check_if_archive_name_already_exists(archive_name=new_archive_name)
327
328                                    if is_archive_name_available:
329                                        with col1:
330                                            with st.expander(label="Validação dos dados", expanded=True):
331                                                st.success(body="Nome do arquivo disponível.")
332
333                                        archive_query = "INSERT INTO arquivo_texto (nome_arquivo, conteudo, usuario_associado, documento_usuario_associado) VALUES (%s, %s, %s, %s)"
334                                        archive_values = (new_archive_name, content, logged_user_name, logged_user_document)
335
336                                        if content is not None:
337                                            QueryExecutor().insert_query(archive_query, archive_values, "Upload do arquivo realizado com sucesso!", "Erro ao fazer upload do arquivo:")
338
339                                            log_query = """INSERT INTO logs_atividades (usuario_log, tipo_log, conteudo_log) VALUES(%s, %s, %s)"""
340                                            log_query_values = (logged_user, "Atualização", "Atualizou os dados do arquivo {}.".format(new_archive_name))
341                                            QueryExecutor().insert_query(log_query, log_query_values,"Log gravado.", "Erro ao gravar log:")
342
343                                    else:
344                                        with col1:
345                                            with st.expander(label="Validação dos dados", expanded=True):
346                                                st.error(body="O nome do arquivo já está sendo utilizado.")
347
348                        elif safe_password != "" and confirm_safe_password != "" and safe_password == confirm_safe_password and is_password_valid == False:
349                            with col2:
350                                with st.spinner(text="Aguarde..."):
351                                    sleep(0.5)
352                                with st.expander(label="Validação dos dados", expanded=True):
353                                    st.error(body="A senha informada é ínválida.")
354
355                        if safe_password != confirm_safe_password:
356                            with col2:
357                                with st.spinner(text="Aguarde..."):
358                                    sleep(0.5)
359                                with st.expander(label="Validação dos dados", expanded=True):
360                                    st.error(body="As senhas informadas não coincidem.")
361
362        elif user_archives_quantity == 0:
363            col1, col2, col3 = st.columns(3)
364            with col2:
365                st.warning(body="Você ainda não possui arquivos registrados.")
366
367    def delete_archive(self):
368        """
369        Função para a exclusão de um arquivo.
370        """
371        logged_user_name, logged_user_document = Login().get_user_data(return_option="user_doc_name")
372        logged_user, logged_user_password = Login().get_user_data(return_option="user_login_password")
373
374        user_archives_quantity = self.get_user_archives_quantity()
375
376        if user_archives_quantity >= 1:
377            col1, col2 = st.columns(2)
378
379            archives_names = self.get_archives_names()
380
381            with col1:
382
383                with st.expander(label="Consulta", expanded=True):
384                    selected_archive = st.selectbox(label="Selecione o arquivo", options=archives_names)
385                    safe_password = st.text_input(label="Informe sua senha", type="password", help="Corresponde a senha utilizada para acessar a aplicação.")
386                    confirm_safe_password = st.text_input(label="Confirme sua senha", type="password", help="Deve ser idêntica a senha informada acima.")
387                    confirm_selection = st.checkbox(label="Confirmar dados", value=False)
388
389                    if confirm_selection:
390                        is_password_valid, hashed_password = Login().check_login(logged_user, safe_password)
391                        if safe_password != "" and confirm_safe_password != "" and confirm_safe_password == safe_password and is_password_valid == True:
392
393                            with st.spinner(text="Aguarde..."):
394                                sleep(0.5)
395
396                            archive_content_query = """
397                            SELECT
398                                arquivo_texto.nome_arquivo,
399                                arquivo_texto.conteudo
400                            FROM
401                                arquivo_texto
402                            INNER JOIN
403                                usuarios ON arquivo_texto.usuario_associado = usuarios.nome
404                            AND arquivo_texto.documento_usuario_associado = usuarios.documento_usuario
405                            WHERE
406                                arquivo_texto.nome_arquivo = %s
407                            AND
408                                arquivo_texto.usuario_associado = %s
409                                AND arquivo_texto.documento_usuario_associado = %s;
410                            """
411
412                            archive_content = (QueryExecutor().complex_compund_query(query=archive_content_query, list_quantity=2, params=(selected_archive, logged_user_name, logged_user_document)))
413                            archive_content = (QueryExecutor().treat_complex_result(archive_content, to_remove_archive_list))
414
415                            for i in range(0, len(archive_content)):
416                                if archive_content[i] == "":
417                                    del archive_content[i]
418
419                            with col2:
420                                with st.expander(label="Conteudo", expanded=True):
421
422                                    display_content = ""
423                                    for i in range(0, len(archive_content)):
424                                        if "\\n" in archive_content[i]:
425                                            display_content = str(archive_content[i])
426                                            display_content = display_content.replace("\\n", " ")
427                                        else:
428                                            display_content += str(archive_content[i]) + "\n\n"
429
430                                    st.code(display_content)
431                                    confirm_data_deletion = st.checkbox(label="Confirmar exclusão dos dados")
432                                delete_archive_button = st.button(label=":wastebasket: Deletar arquivo")
433
434                            if confirm_data_deletion and delete_archive_button:
435                                with col2:
436                                    with st.spinner(text="Aguarde..."):
437                                        sleep(2.5)
438
439                                    delete_archive_query = '''
440                                    DELETE arquivo_texto FROM arquivo_texto
441                                    INNER JOIN
442                                        usuarios ON arquivo_texto.usuario_associado = usuarios.nome
443                                    AND arquivo_texto.documento_usuario_associado = usuarios.documento_usuario
444                                    WHERE arquivo_texto.nome_arquivo = %s
445                                    AND arquivo_texto.usuario_associado = %s
446                                    AND arquivo_texto.documento_usuario_associado = %s;'''
447                                    archive_values = (selected_archive, logged_user_name, logged_user_document)
448
449                                    QueryExecutor().insert_query(delete_archive_query, archive_values,"Arquivo deletado com sucesso!", "Erro ao deletar arquivo:")
450
451                                    log_query = """INSERT INTO logs_atividades (usuario_log, tipo_log, conteudo_log) VALUES(%s, %s, %s)"""
452                                    log_query_values = (logged_user, "Exclusão", "Excluiu o arquivo {}.".format(selected_archive))
453                                    QueryExecutor().insert_query(log_query, log_query_values,"Log gravado.", "Erro ao gravar log:")
454
455                        elif safe_password != "" and confirm_safe_password != "" and confirm_safe_password == safe_password and is_password_valid == False:
456                            with col2:
457                                with st.spinner(text="Aguarde..."):
458                                    sleep(0.5)
459                                with st.expander(label="Validação dos dados", expanded=True):
460                                    st.error(body="A senha informada é inválida.")
461                        elif safe_password != confirm_safe_password:
462                            with col2:
463                                with st.spinner(text="Aguarde..."):
464                                    sleep(0.5)
465                                with st.expander(label="Validação dos dados", expanded=True):
466                                    st.error(body="As senhas informadas não coincidem.")
467
468        elif user_archives_quantity == 0:
469            col1, col2, col3 = st.columns(3)
470            with col2:
471                with st.spinner(text="Aguarde..."):
472                    sleep(0.5)
473                st.warning(body="Você ainda não possui arquivos registrados.")
474
475    def main_menu(self):
476        """
477        Menu principal.
478        """
479
480        col1, col2, col3 = st.columns(3)
481
482        with col1:
483            st.header(body=":spiral_note_pad: Arquivos")
484
485        with col2:
486            menu_options = ["Registrar arquivo", "Consultar arquivo","Atualizar arquivo", "Deletar arquivo"]
487
488            selected_option = st.selectbox(label="Menu", options=menu_options)
489
490        st.divider()
491        if selected_option == menu_options[0]:
492            self.create_new_archive()
493        elif selected_option == menu_options[1]:
494            self.read_archive()
495        elif selected_option == menu_options[2]:
496            self.update_archive()
497        elif selected_option == menu_options[3]:
498            self.delete_archive()
class Archives:
 10class Archives:
 11    """
 12    Classe que representa os arquivos, com as quatro funções básicas de um CRUD.
 13    """
 14
 15    def check_if_archive_name_already_exists(self, archive_name: str):
 16        """
 17        Verifica se o nome do arquivo já foi utilizado anteriormente.
 18
 19        Returns
 20        -------
 21        is_archive_name_available (bool): Se o nome do arquivo está disponível ou não.
 22        """
 23        is_archive_name_available: bool
 24
 25        logged_user_name, logged_user_document = Login().get_user_data(return_option="user_login_password")
 26
 27        cards_with_parameter_name_query = """SELECT COUNT(id_arquivo) FROM arquivo_texto WHERE nome_arquivo = %s AND usuario_associado = %s AND documento_usuario_associado = %s;"""
 28        query_values = (archive_name, logged_user_name, logged_user_document)
 29
 30        archives_with_parameter_name_quantity = QueryExecutor().simple_consult_query(query=cards_with_parameter_name_query, params=query_values)
 31        archives_with_parameter_name_quantity = QueryExecutor().treat_simple_result(value_to_treat=archives_with_parameter_name_quantity, values_to_remove=to_remove_list)
 32        archives_with_parameter_name_quantity = int(archives_with_parameter_name_quantity)
 33
 34        if archives_with_parameter_name_quantity == 0:
 35            is_archive_name_available = True
 36        else:
 37            is_archive_name_available = False
 38
 39        return is_archive_name_available
 40
 41    def get_user_archives_quantity(self):
 42        """
 43        Consulta a quantidade de arquivos registrados pelo usuário.
 44
 45        Returns
 46        -------
 47        user_archives_quantity (int): A quantidade de arquivos registrados pelo usuário.
 48        """
 49        logged_user_name, logged_user_document = Login().get_user_data(return_option="user_doc_name")
 50
 51        user_archives_quantity = QueryExecutor().simple_consult_query(search_user_archives_quantity, params=(logged_user_name, logged_user_document))
 52        user_archives_quantity = QueryExecutor().treat_simple_result(user_archives_quantity, to_remove_list)
 53        user_archives_quantity = int(user_archives_quantity)
 54
 55        return user_archives_quantity
 56
 57    def get_archives_names(self):
 58        """
 59        Consulta o nome dos arquivos.
 60
 61        Returns
 62        -------
 63        archives_names (list): A lista com o nome dos arquivos.
 64        """
 65        logged_user_name, logged_user_document = Login().get_user_data(return_option="user_doc_name")
 66
 67        archives_names = []
 68        user_archives_name = QueryExecutor().complex_consult_query(search_user_archives_name, params=(logged_user_name, logged_user_document))
 69        user_archives_name = QueryExecutor().treat_numerous_simple_result(user_archives_name, to_remove_list)
 70
 71        for i in range(0, len(user_archives_name)):
 72            archives_names.append(user_archives_name[i])
 73
 74        return archives_names
 75
 76    def create_new_archive(self):
 77        """
 78        Função para criação de um novo arquivo.
 79        """
 80        logged_user_name, logged_user_document = Login().get_user_data(return_option="user_doc_name")
 81        logged_user, logged_user_password = Login().get_user_data(return_option="user_login_password")
 82
 83        col1, col2 = st.columns(2)
 84
 85        with col1:
 86            with st.expander(label="Entrada de Dados", expanded=True):
 87                archive_name = st.text_input(label="Nome do arquivo", max_chars=100,help="É necessário definir um nome para identificação e consulta posterior.")
 88                uploaded_file = st.file_uploader(label="Escolha um arquivo de texto", type=["txt"], help="São permitidos arquivos de texto, na extensão '.txt'. O tamanho do arquivo não pode exceder 200 MB.")
 89
 90                content = None
 91
 92                if uploaded_file:
 93                    content = uploaded_file.read().decode("utf-8")
 94                    with col2:
 95                        with st.spinner(text="Carregando arquivo..."):
 96                            sleep(2.5)
 97                        if content != "":
 98                            with st.expander(label="Conteudo do arquivo carregado", expanded=True):
 99                                st.info(content)
100                        elif content == "":
101                            with col2:
102                                st.error(body="O Conteudo do arquivo está vazio.")
103
104            register_archive_button = st.button(":floppy_disk: Fazer upload do arquivo")
105
106            if register_archive_button and uploaded_file is not None and content != "" and archive_name != "":
107                is_archive_name_available = self.check_if_archive_name_already_exists(archive_name=archive_name)
108
109                if is_archive_name_available:
110                    with col2:
111                        with st.expander(label="Validação dos dados", expanded=True):
112                            st.success(body="Nome de arquivo disponível.")
113
114                    archive_query = "INSERT INTO arquivo_texto (nome_arquivo, conteudo, usuario_associado, documento_usuario_associado) VALUES (%s, %s, %s, %s)"
115                    archive_values = (archive_name, content, logged_user_name, logged_user_document)
116
117                    if content is not None:
118                        QueryExecutor().insert_query(archive_query, archive_values,"Upload do arquivo realizado com sucesso!", "Erro ao fazer upload do arquivo:")
119
120                        log_query = """INSERT INTO logs_atividades (usuario_log, tipo_log, conteudo_log) VALUES(%s, %s, %s)"""
121                        log_query_values = (logged_user, "Cadastro", "Fez o upload do arquivo {}.".format(archive_name))
122                        QueryExecutor().insert_query(log_query, log_query_values, "Log gravado.", "Erro ao gravar log:")
123
124                else:
125                    with col2:
126                        with st.expander(label="Validação dos dados", expanded=True):
127                            st.error(body="O nome do arquivo já está sendo utilizado.")
128
129            elif register_archive_button and (uploaded_file is None or content == "" or archive_name == ""):
130
131                with col2:
132                    with st.spinner(text=""):
133                        sleep(2.5)
134
135                    if uploaded_file is None:
136                        with st.expander(label="Validação dos dados", expanded=True):
137                            st.error(body="Não foi feito o upload de um arquivo.")
138                    if archive_name == "":
139                        with st.expander(label="Validação dos dados", expanded=True):
140                            st.error(body="Não foi informado um nome para o arquivo.")
141
142    def read_archive(self):
143        """
144        Função para a consulta de um arquivo.
145        """
146        logged_user_name, logged_user_document = Login().get_user_data(return_option="user_doc_name")
147        logged_user, logged_user_password = Login().get_user_data(return_option="user_login_password")
148
149        user_archives_quantity = self.get_user_archives_quantity()
150
151        if user_archives_quantity >= 1:
152            col1, col2 = st.columns(2)
153
154            archives_names = self.get_archives_names()
155
156            with col1:
157
158                with st.expander(label="Consulta", expanded=True):
159                    selected_archive = st.selectbox(label="Selecione o arquivo", options=archives_names)
160                    safe_password = st.text_input(label="Informe sua senha", type="password", help="Corresponde a senha utilizada para acessar a aplicação.")
161                    confirm_safe_password = st.text_input(label="Confirme sua senha", type="password", help="Deve ser idêntica a senha informada acima.")
162                    confirm_selection = st.checkbox(label="Confirmar dados", value=False)
163
164                consult_button = st.button(label=":file_folder: Consultar arquivo")
165
166                if consult_button and confirm_selection:
167                    
168                    is_password_valid, hashed_password = Login().check_login(logged_user, safe_password)
169
170                    if safe_password != "" and confirm_safe_password != "" and safe_password == confirm_safe_password and is_password_valid == True:
171                        with st.spinner(text="Aguarde..."):
172                            sleep(2.5)
173
174                            archive_content_query = """
175                            SELECT 
176                                arquivo_texto.conteudo
177                            FROM
178                                arquivo_texto
179                            INNER JOIN
180                                usuarios ON arquivo_texto.usuario_associado = usuarios.nome
181                            AND arquivo_texto.documento_usuario_associado = usuarios.documento_usuario
182                            WHERE
183                                arquivo_texto.nome_arquivo = %s
184                            AND
185                                arquivo_texto.usuario_associado = %s
186                            AND
187                                arquivo_texto.documento_usuario_associado = %s;"""
188
189                            archive_content = (QueryExecutor().simple_consult_query(archive_content_query, params=(selected_archive, logged_user_name, logged_user_document)))
190                            archive_content = (QueryExecutor().treat_simple_result(archive_content, to_remove_archive_list))
191                            archive_content = archive_content.replace("\\n", " ")
192                            archive_content = archive_content.replace("  ", " ")
193                            archive_content = archive_content.split(" ")
194
195                            for i in range(0, len(archive_content)):
196                                if archive_content[i] == "":
197                                    del archive_content[i]
198
199                            with col2:
200                                with st.expander(label="Conteudo", expanded=True):
201
202                                    display_content = ""
203                                    for i in range(0, len(archive_content)):
204                                        display_content += str(archive_content[i]) + "\n\n"
205                                    st.code(display_content)
206
207                    elif safe_password != "" and confirm_safe_password != "" and safe_password == confirm_safe_password and is_password_valid == False:
208                        with col2:
209                            with st.spinner(text="Aguarde..."):
210                                sleep(0.5)
211                            with st.expander(label="Validação dos dados", expanded=True):
212                                st.error(body="A senha informada é inválida.")
213
214                    elif safe_password != confirm_safe_password:
215                        with col2:
216                            with st.spinner(text="Aguarde..."):
217                                sleep(0.5)
218                            with st.expander(label="Validação dos dados", expanded=True):
219                                st.error(body="As senhas informadas não coincidem.")
220
221                elif consult_button and confirm_selection == False:
222                    with col2:
223                        with st.spinner(text="Aguarde..."):
224                            sleep(0.5)
225                        with st.expander(label="Validação dos dados", expanded=True):
226                            st.warning(body="Confirme a seleção dos dados.")
227
228        elif user_archives_quantity == 0:
229            col1, col2, col3 = st.columns(3)
230            with col2:
231                st.warning(body="Você ainda não possui arquivos registrados.")
232
233    def update_archive(self):
234        """
235        Função para a atualização de um arquivo.
236        """
237        logged_user_name, logged_user_document = Login().get_user_data(return_option="user_doc_name")
238        logged_user, logged_user_password = Login().get_user_data(return_option="user_login_password")
239
240        user_archives_quantity = self.get_user_archives_quantity()
241
242        if user_archives_quantity >= 1:
243            col1, col2 = st.columns(2)
244
245            archives_names = self.get_archives_names()
246
247            with col1:
248
249                with st.expander(label="Consulta", expanded=True):
250                    selected_archive = st.selectbox(label="Selecione o arquivo", options=archives_names)
251                    safe_password = st.text_input(label="Informe sua senha", type="password", help="Corresponde a senha utilizada para acessar a aplicação.")
252                    confirm_safe_password = st.text_input(label="Confirme sua senha", type="password", help="Deve ser idêntica a senha informada acima.")
253                    confirm_selection = st.checkbox(label="Confirmar dados", value=False)
254
255                    if confirm_selection:
256                        is_password_valid, hashed_password = Login().check_login(logged_user, safe_password)
257
258                        if safe_password != "" and confirm_safe_password != "" and safe_password == confirm_safe_password and is_password_valid == True:
259                            with st.spinner(text="Aguarde..."):
260                                sleep(0.5)
261
262                            archive_content_query = """
263                            SELECT
264                                arquivo_texto.nome_arquivo,
265                                arquivo_texto.conteudo
266                            FROM
267                                arquivo_texto
268                            INNER JOIN
269                                usuarios ON arquivo_texto.usuario_associado = usuarios.nome
270                            AND arquivo_texto.documento_usuario_associado = usuarios.documento_usuario
271                            WHERE
272                                arquivo_texto.nome_arquivo = %s
273                            AND
274                            arquivo_texto.usuario_associado = %s
275                            AND arquivo_texto.documento_usuario_associado = %s;
276                            """
277
278                            archive_content = (QueryExecutor().complex_compund_query(query=archive_content_query, list_quantity=2, params=(selected_archive, logged_user_name, logged_user_document)))
279                            archive_content = (QueryExecutor().treat_complex_result(archive_content, to_remove_archive_list))
280
281                            for i in range(0, len(archive_content)):
282                                if archive_content[i] == "":
283                                    del archive_content[i]
284
285                            with col1:
286                                with st.expander(label="Conteudo", expanded=True):
287
288                                    display_content = ""
289                                    for i in range(0, len(archive_content)):
290                                        display_content += str(
291                                            archive_content[i]) + "\n\n"
292
293                                    st.code(display_content)
294
295                            with col2:
296                                with st.spinner(text="Aguarde..."):
297                                    sleep(0.5)
298
299                                with st.expander(label="Novos dados", expanded=True):
300                                    new_archive_name = st.text_input(label="Novo nome do arquivo", max_chars=100, help="É necessário definir um nome para identificação e consulta posterior.")
301                                    new_uploaded_file = st.file_uploader(label="Escolha um arquivo de texto", type=["txt"], help="São permitidos arquivos de texto, na extensão '.txt'. O tamanho do arquivo não pode exceder 200 MB.")
302                                    confirm_new_data = st.checkbox(label="Confirmar novos dados")
303
304                                    content = None
305
306                                    if new_uploaded_file:
307                                        content = new_uploaded_file.read().decode("utf-8")
308                                        with col2:
309                                            with st.spinner(text="Carregando arquivo..."):
310                                                sleep(0.5)
311                                            if content != "":
312                                                with st.expander(label="Conteudo do arquivo carregado", expanded=True):
313                                                    st.info(content)
314                                            elif content == "":
315                                                with col2:
316                                                    st.error(body="O Conteudo do arquivo está vazio.")
317
318                                update_archive_button = st.button(label=":arrows_counterclockwise: Atualizar arquivo")
319
320                            if confirm_new_data and update_archive_button:
321
322                                with st.spinner(text="Aguarde..."):
323                                    sleep(2.5)
324
325                                if new_archive_name != "" and content is not None:
326
327                                    is_archive_name_available = self.check_if_archive_name_already_exists(archive_name=new_archive_name)
328
329                                    if is_archive_name_available:
330                                        with col1:
331                                            with st.expander(label="Validação dos dados", expanded=True):
332                                                st.success(body="Nome do arquivo disponível.")
333
334                                        archive_query = "INSERT INTO arquivo_texto (nome_arquivo, conteudo, usuario_associado, documento_usuario_associado) VALUES (%s, %s, %s, %s)"
335                                        archive_values = (new_archive_name, content, logged_user_name, logged_user_document)
336
337                                        if content is not None:
338                                            QueryExecutor().insert_query(archive_query, archive_values, "Upload do arquivo realizado com sucesso!", "Erro ao fazer upload do arquivo:")
339
340                                            log_query = """INSERT INTO logs_atividades (usuario_log, tipo_log, conteudo_log) VALUES(%s, %s, %s)"""
341                                            log_query_values = (logged_user, "Atualização", "Atualizou os dados do arquivo {}.".format(new_archive_name))
342                                            QueryExecutor().insert_query(log_query, log_query_values,"Log gravado.", "Erro ao gravar log:")
343
344                                    else:
345                                        with col1:
346                                            with st.expander(label="Validação dos dados", expanded=True):
347                                                st.error(body="O nome do arquivo já está sendo utilizado.")
348
349                        elif safe_password != "" and confirm_safe_password != "" and safe_password == confirm_safe_password and is_password_valid == False:
350                            with col2:
351                                with st.spinner(text="Aguarde..."):
352                                    sleep(0.5)
353                                with st.expander(label="Validação dos dados", expanded=True):
354                                    st.error(body="A senha informada é ínválida.")
355
356                        if safe_password != confirm_safe_password:
357                            with col2:
358                                with st.spinner(text="Aguarde..."):
359                                    sleep(0.5)
360                                with st.expander(label="Validação dos dados", expanded=True):
361                                    st.error(body="As senhas informadas não coincidem.")
362
363        elif user_archives_quantity == 0:
364            col1, col2, col3 = st.columns(3)
365            with col2:
366                st.warning(body="Você ainda não possui arquivos registrados.")
367
368    def delete_archive(self):
369        """
370        Função para a exclusão de um arquivo.
371        """
372        logged_user_name, logged_user_document = Login().get_user_data(return_option="user_doc_name")
373        logged_user, logged_user_password = Login().get_user_data(return_option="user_login_password")
374
375        user_archives_quantity = self.get_user_archives_quantity()
376
377        if user_archives_quantity >= 1:
378            col1, col2 = st.columns(2)
379
380            archives_names = self.get_archives_names()
381
382            with col1:
383
384                with st.expander(label="Consulta", expanded=True):
385                    selected_archive = st.selectbox(label="Selecione o arquivo", options=archives_names)
386                    safe_password = st.text_input(label="Informe sua senha", type="password", help="Corresponde a senha utilizada para acessar a aplicação.")
387                    confirm_safe_password = st.text_input(label="Confirme sua senha", type="password", help="Deve ser idêntica a senha informada acima.")
388                    confirm_selection = st.checkbox(label="Confirmar dados", value=False)
389
390                    if confirm_selection:
391                        is_password_valid, hashed_password = Login().check_login(logged_user, safe_password)
392                        if safe_password != "" and confirm_safe_password != "" and confirm_safe_password == safe_password and is_password_valid == True:
393
394                            with st.spinner(text="Aguarde..."):
395                                sleep(0.5)
396
397                            archive_content_query = """
398                            SELECT
399                                arquivo_texto.nome_arquivo,
400                                arquivo_texto.conteudo
401                            FROM
402                                arquivo_texto
403                            INNER JOIN
404                                usuarios ON arquivo_texto.usuario_associado = usuarios.nome
405                            AND arquivo_texto.documento_usuario_associado = usuarios.documento_usuario
406                            WHERE
407                                arquivo_texto.nome_arquivo = %s
408                            AND
409                                arquivo_texto.usuario_associado = %s
410                                AND arquivo_texto.documento_usuario_associado = %s;
411                            """
412
413                            archive_content = (QueryExecutor().complex_compund_query(query=archive_content_query, list_quantity=2, params=(selected_archive, logged_user_name, logged_user_document)))
414                            archive_content = (QueryExecutor().treat_complex_result(archive_content, to_remove_archive_list))
415
416                            for i in range(0, len(archive_content)):
417                                if archive_content[i] == "":
418                                    del archive_content[i]
419
420                            with col2:
421                                with st.expander(label="Conteudo", expanded=True):
422
423                                    display_content = ""
424                                    for i in range(0, len(archive_content)):
425                                        if "\\n" in archive_content[i]:
426                                            display_content = str(archive_content[i])
427                                            display_content = display_content.replace("\\n", " ")
428                                        else:
429                                            display_content += str(archive_content[i]) + "\n\n"
430
431                                    st.code(display_content)
432                                    confirm_data_deletion = st.checkbox(label="Confirmar exclusão dos dados")
433                                delete_archive_button = st.button(label=":wastebasket: Deletar arquivo")
434
435                            if confirm_data_deletion and delete_archive_button:
436                                with col2:
437                                    with st.spinner(text="Aguarde..."):
438                                        sleep(2.5)
439
440                                    delete_archive_query = '''
441                                    DELETE arquivo_texto FROM arquivo_texto
442                                    INNER JOIN
443                                        usuarios ON arquivo_texto.usuario_associado = usuarios.nome
444                                    AND arquivo_texto.documento_usuario_associado = usuarios.documento_usuario
445                                    WHERE arquivo_texto.nome_arquivo = %s
446                                    AND arquivo_texto.usuario_associado = %s
447                                    AND arquivo_texto.documento_usuario_associado = %s;'''
448                                    archive_values = (selected_archive, logged_user_name, logged_user_document)
449
450                                    QueryExecutor().insert_query(delete_archive_query, archive_values,"Arquivo deletado com sucesso!", "Erro ao deletar arquivo:")
451
452                                    log_query = """INSERT INTO logs_atividades (usuario_log, tipo_log, conteudo_log) VALUES(%s, %s, %s)"""
453                                    log_query_values = (logged_user, "Exclusão", "Excluiu o arquivo {}.".format(selected_archive))
454                                    QueryExecutor().insert_query(log_query, log_query_values,"Log gravado.", "Erro ao gravar log:")
455
456                        elif safe_password != "" and confirm_safe_password != "" and confirm_safe_password == safe_password and is_password_valid == False:
457                            with col2:
458                                with st.spinner(text="Aguarde..."):
459                                    sleep(0.5)
460                                with st.expander(label="Validação dos dados", expanded=True):
461                                    st.error(body="A senha informada é inválida.")
462                        elif safe_password != confirm_safe_password:
463                            with col2:
464                                with st.spinner(text="Aguarde..."):
465                                    sleep(0.5)
466                                with st.expander(label="Validação dos dados", expanded=True):
467                                    st.error(body="As senhas informadas não coincidem.")
468
469        elif user_archives_quantity == 0:
470            col1, col2, col3 = st.columns(3)
471            with col2:
472                with st.spinner(text="Aguarde..."):
473                    sleep(0.5)
474                st.warning(body="Você ainda não possui arquivos registrados.")
475
476    def main_menu(self):
477        """
478        Menu principal.
479        """
480
481        col1, col2, col3 = st.columns(3)
482
483        with col1:
484            st.header(body=":spiral_note_pad: Arquivos")
485
486        with col2:
487            menu_options = ["Registrar arquivo", "Consultar arquivo","Atualizar arquivo", "Deletar arquivo"]
488
489            selected_option = st.selectbox(label="Menu", options=menu_options)
490
491        st.divider()
492        if selected_option == menu_options[0]:
493            self.create_new_archive()
494        elif selected_option == menu_options[1]:
495            self.read_archive()
496        elif selected_option == menu_options[2]:
497            self.update_archive()
498        elif selected_option == menu_options[3]:
499            self.delete_archive()

Classe que representa os arquivos, com as quatro funções básicas de um CRUD.

def check_if_archive_name_already_exists(self, archive_name: str):
15    def check_if_archive_name_already_exists(self, archive_name: str):
16        """
17        Verifica se o nome do arquivo já foi utilizado anteriormente.
18
19        Returns
20        -------
21        is_archive_name_available (bool): Se o nome do arquivo está disponível ou não.
22        """
23        is_archive_name_available: bool
24
25        logged_user_name, logged_user_document = Login().get_user_data(return_option="user_login_password")
26
27        cards_with_parameter_name_query = """SELECT COUNT(id_arquivo) FROM arquivo_texto WHERE nome_arquivo = %s AND usuario_associado = %s AND documento_usuario_associado = %s;"""
28        query_values = (archive_name, logged_user_name, logged_user_document)
29
30        archives_with_parameter_name_quantity = QueryExecutor().simple_consult_query(query=cards_with_parameter_name_query, params=query_values)
31        archives_with_parameter_name_quantity = QueryExecutor().treat_simple_result(value_to_treat=archives_with_parameter_name_quantity, values_to_remove=to_remove_list)
32        archives_with_parameter_name_quantity = int(archives_with_parameter_name_quantity)
33
34        if archives_with_parameter_name_quantity == 0:
35            is_archive_name_available = True
36        else:
37            is_archive_name_available = False
38
39        return is_archive_name_available

Verifica se o nome do arquivo já foi utilizado anteriormente.

Returns
  • is_archive_name_available (bool) (Se o nome do arquivo está disponível ou não.):
def get_user_archives_quantity(self):
41    def get_user_archives_quantity(self):
42        """
43        Consulta a quantidade de arquivos registrados pelo usuário.
44
45        Returns
46        -------
47        user_archives_quantity (int): A quantidade de arquivos registrados pelo usuário.
48        """
49        logged_user_name, logged_user_document = Login().get_user_data(return_option="user_doc_name")
50
51        user_archives_quantity = QueryExecutor().simple_consult_query(search_user_archives_quantity, params=(logged_user_name, logged_user_document))
52        user_archives_quantity = QueryExecutor().treat_simple_result(user_archives_quantity, to_remove_list)
53        user_archives_quantity = int(user_archives_quantity)
54
55        return user_archives_quantity

Consulta a quantidade de arquivos registrados pelo usuário.

Returns
  • user_archives_quantity (int) (A quantidade de arquivos registrados pelo usuário.):
def get_archives_names(self):
57    def get_archives_names(self):
58        """
59        Consulta o nome dos arquivos.
60
61        Returns
62        -------
63        archives_names (list): A lista com o nome dos arquivos.
64        """
65        logged_user_name, logged_user_document = Login().get_user_data(return_option="user_doc_name")
66
67        archives_names = []
68        user_archives_name = QueryExecutor().complex_consult_query(search_user_archives_name, params=(logged_user_name, logged_user_document))
69        user_archives_name = QueryExecutor().treat_numerous_simple_result(user_archives_name, to_remove_list)
70
71        for i in range(0, len(user_archives_name)):
72            archives_names.append(user_archives_name[i])
73
74        return archives_names

Consulta o nome dos arquivos.

Returns
  • archives_names (list) (A lista com o nome dos arquivos.):
def create_new_archive(self):
 76    def create_new_archive(self):
 77        """
 78        Função para criação de um novo arquivo.
 79        """
 80        logged_user_name, logged_user_document = Login().get_user_data(return_option="user_doc_name")
 81        logged_user, logged_user_password = Login().get_user_data(return_option="user_login_password")
 82
 83        col1, col2 = st.columns(2)
 84
 85        with col1:
 86            with st.expander(label="Entrada de Dados", expanded=True):
 87                archive_name = st.text_input(label="Nome do arquivo", max_chars=100,help="É necessário definir um nome para identificação e consulta posterior.")
 88                uploaded_file = st.file_uploader(label="Escolha um arquivo de texto", type=["txt"], help="São permitidos arquivos de texto, na extensão '.txt'. O tamanho do arquivo não pode exceder 200 MB.")
 89
 90                content = None
 91
 92                if uploaded_file:
 93                    content = uploaded_file.read().decode("utf-8")
 94                    with col2:
 95                        with st.spinner(text="Carregando arquivo..."):
 96                            sleep(2.5)
 97                        if content != "":
 98                            with st.expander(label="Conteudo do arquivo carregado", expanded=True):
 99                                st.info(content)
100                        elif content == "":
101                            with col2:
102                                st.error(body="O Conteudo do arquivo está vazio.")
103
104            register_archive_button = st.button(":floppy_disk: Fazer upload do arquivo")
105
106            if register_archive_button and uploaded_file is not None and content != "" and archive_name != "":
107                is_archive_name_available = self.check_if_archive_name_already_exists(archive_name=archive_name)
108
109                if is_archive_name_available:
110                    with col2:
111                        with st.expander(label="Validação dos dados", expanded=True):
112                            st.success(body="Nome de arquivo disponível.")
113
114                    archive_query = "INSERT INTO arquivo_texto (nome_arquivo, conteudo, usuario_associado, documento_usuario_associado) VALUES (%s, %s, %s, %s)"
115                    archive_values = (archive_name, content, logged_user_name, logged_user_document)
116
117                    if content is not None:
118                        QueryExecutor().insert_query(archive_query, archive_values,"Upload do arquivo realizado com sucesso!", "Erro ao fazer upload do arquivo:")
119
120                        log_query = """INSERT INTO logs_atividades (usuario_log, tipo_log, conteudo_log) VALUES(%s, %s, %s)"""
121                        log_query_values = (logged_user, "Cadastro", "Fez o upload do arquivo {}.".format(archive_name))
122                        QueryExecutor().insert_query(log_query, log_query_values, "Log gravado.", "Erro ao gravar log:")
123
124                else:
125                    with col2:
126                        with st.expander(label="Validação dos dados", expanded=True):
127                            st.error(body="O nome do arquivo já está sendo utilizado.")
128
129            elif register_archive_button and (uploaded_file is None or content == "" or archive_name == ""):
130
131                with col2:
132                    with st.spinner(text=""):
133                        sleep(2.5)
134
135                    if uploaded_file is None:
136                        with st.expander(label="Validação dos dados", expanded=True):
137                            st.error(body="Não foi feito o upload de um arquivo.")
138                    if archive_name == "":
139                        with st.expander(label="Validação dos dados", expanded=True):
140                            st.error(body="Não foi informado um nome para o arquivo.")

Função para criação de um novo arquivo.

def read_archive(self):
142    def read_archive(self):
143        """
144        Função para a consulta de um arquivo.
145        """
146        logged_user_name, logged_user_document = Login().get_user_data(return_option="user_doc_name")
147        logged_user, logged_user_password = Login().get_user_data(return_option="user_login_password")
148
149        user_archives_quantity = self.get_user_archives_quantity()
150
151        if user_archives_quantity >= 1:
152            col1, col2 = st.columns(2)
153
154            archives_names = self.get_archives_names()
155
156            with col1:
157
158                with st.expander(label="Consulta", expanded=True):
159                    selected_archive = st.selectbox(label="Selecione o arquivo", options=archives_names)
160                    safe_password = st.text_input(label="Informe sua senha", type="password", help="Corresponde a senha utilizada para acessar a aplicação.")
161                    confirm_safe_password = st.text_input(label="Confirme sua senha", type="password", help="Deve ser idêntica a senha informada acima.")
162                    confirm_selection = st.checkbox(label="Confirmar dados", value=False)
163
164                consult_button = st.button(label=":file_folder: Consultar arquivo")
165
166                if consult_button and confirm_selection:
167                    
168                    is_password_valid, hashed_password = Login().check_login(logged_user, safe_password)
169
170                    if safe_password != "" and confirm_safe_password != "" and safe_password == confirm_safe_password and is_password_valid == True:
171                        with st.spinner(text="Aguarde..."):
172                            sleep(2.5)
173
174                            archive_content_query = """
175                            SELECT 
176                                arquivo_texto.conteudo
177                            FROM
178                                arquivo_texto
179                            INNER JOIN
180                                usuarios ON arquivo_texto.usuario_associado = usuarios.nome
181                            AND arquivo_texto.documento_usuario_associado = usuarios.documento_usuario
182                            WHERE
183                                arquivo_texto.nome_arquivo = %s
184                            AND
185                                arquivo_texto.usuario_associado = %s
186                            AND
187                                arquivo_texto.documento_usuario_associado = %s;"""
188
189                            archive_content = (QueryExecutor().simple_consult_query(archive_content_query, params=(selected_archive, logged_user_name, logged_user_document)))
190                            archive_content = (QueryExecutor().treat_simple_result(archive_content, to_remove_archive_list))
191                            archive_content = archive_content.replace("\\n", " ")
192                            archive_content = archive_content.replace("  ", " ")
193                            archive_content = archive_content.split(" ")
194
195                            for i in range(0, len(archive_content)):
196                                if archive_content[i] == "":
197                                    del archive_content[i]
198
199                            with col2:
200                                with st.expander(label="Conteudo", expanded=True):
201
202                                    display_content = ""
203                                    for i in range(0, len(archive_content)):
204                                        display_content += str(archive_content[i]) + "\n\n"
205                                    st.code(display_content)
206
207                    elif safe_password != "" and confirm_safe_password != "" and safe_password == confirm_safe_password and is_password_valid == False:
208                        with col2:
209                            with st.spinner(text="Aguarde..."):
210                                sleep(0.5)
211                            with st.expander(label="Validação dos dados", expanded=True):
212                                st.error(body="A senha informada é inválida.")
213
214                    elif safe_password != confirm_safe_password:
215                        with col2:
216                            with st.spinner(text="Aguarde..."):
217                                sleep(0.5)
218                            with st.expander(label="Validação dos dados", expanded=True):
219                                st.error(body="As senhas informadas não coincidem.")
220
221                elif consult_button and confirm_selection == False:
222                    with col2:
223                        with st.spinner(text="Aguarde..."):
224                            sleep(0.5)
225                        with st.expander(label="Validação dos dados", expanded=True):
226                            st.warning(body="Confirme a seleção dos dados.")
227
228        elif user_archives_quantity == 0:
229            col1, col2, col3 = st.columns(3)
230            with col2:
231                st.warning(body="Você ainda não possui arquivos registrados.")

Função para a consulta de um arquivo.

def update_archive(self):
233    def update_archive(self):
234        """
235        Função para a atualização de um arquivo.
236        """
237        logged_user_name, logged_user_document = Login().get_user_data(return_option="user_doc_name")
238        logged_user, logged_user_password = Login().get_user_data(return_option="user_login_password")
239
240        user_archives_quantity = self.get_user_archives_quantity()
241
242        if user_archives_quantity >= 1:
243            col1, col2 = st.columns(2)
244
245            archives_names = self.get_archives_names()
246
247            with col1:
248
249                with st.expander(label="Consulta", expanded=True):
250                    selected_archive = st.selectbox(label="Selecione o arquivo", options=archives_names)
251                    safe_password = st.text_input(label="Informe sua senha", type="password", help="Corresponde a senha utilizada para acessar a aplicação.")
252                    confirm_safe_password = st.text_input(label="Confirme sua senha", type="password", help="Deve ser idêntica a senha informada acima.")
253                    confirm_selection = st.checkbox(label="Confirmar dados", value=False)
254
255                    if confirm_selection:
256                        is_password_valid, hashed_password = Login().check_login(logged_user, safe_password)
257
258                        if safe_password != "" and confirm_safe_password != "" and safe_password == confirm_safe_password and is_password_valid == True:
259                            with st.spinner(text="Aguarde..."):
260                                sleep(0.5)
261
262                            archive_content_query = """
263                            SELECT
264                                arquivo_texto.nome_arquivo,
265                                arquivo_texto.conteudo
266                            FROM
267                                arquivo_texto
268                            INNER JOIN
269                                usuarios ON arquivo_texto.usuario_associado = usuarios.nome
270                            AND arquivo_texto.documento_usuario_associado = usuarios.documento_usuario
271                            WHERE
272                                arquivo_texto.nome_arquivo = %s
273                            AND
274                            arquivo_texto.usuario_associado = %s
275                            AND arquivo_texto.documento_usuario_associado = %s;
276                            """
277
278                            archive_content = (QueryExecutor().complex_compund_query(query=archive_content_query, list_quantity=2, params=(selected_archive, logged_user_name, logged_user_document)))
279                            archive_content = (QueryExecutor().treat_complex_result(archive_content, to_remove_archive_list))
280
281                            for i in range(0, len(archive_content)):
282                                if archive_content[i] == "":
283                                    del archive_content[i]
284
285                            with col1:
286                                with st.expander(label="Conteudo", expanded=True):
287
288                                    display_content = ""
289                                    for i in range(0, len(archive_content)):
290                                        display_content += str(
291                                            archive_content[i]) + "\n\n"
292
293                                    st.code(display_content)
294
295                            with col2:
296                                with st.spinner(text="Aguarde..."):
297                                    sleep(0.5)
298
299                                with st.expander(label="Novos dados", expanded=True):
300                                    new_archive_name = st.text_input(label="Novo nome do arquivo", max_chars=100, help="É necessário definir um nome para identificação e consulta posterior.")
301                                    new_uploaded_file = st.file_uploader(label="Escolha um arquivo de texto", type=["txt"], help="São permitidos arquivos de texto, na extensão '.txt'. O tamanho do arquivo não pode exceder 200 MB.")
302                                    confirm_new_data = st.checkbox(label="Confirmar novos dados")
303
304                                    content = None
305
306                                    if new_uploaded_file:
307                                        content = new_uploaded_file.read().decode("utf-8")
308                                        with col2:
309                                            with st.spinner(text="Carregando arquivo..."):
310                                                sleep(0.5)
311                                            if content != "":
312                                                with st.expander(label="Conteudo do arquivo carregado", expanded=True):
313                                                    st.info(content)
314                                            elif content == "":
315                                                with col2:
316                                                    st.error(body="O Conteudo do arquivo está vazio.")
317
318                                update_archive_button = st.button(label=":arrows_counterclockwise: Atualizar arquivo")
319
320                            if confirm_new_data and update_archive_button:
321
322                                with st.spinner(text="Aguarde..."):
323                                    sleep(2.5)
324
325                                if new_archive_name != "" and content is not None:
326
327                                    is_archive_name_available = self.check_if_archive_name_already_exists(archive_name=new_archive_name)
328
329                                    if is_archive_name_available:
330                                        with col1:
331                                            with st.expander(label="Validação dos dados", expanded=True):
332                                                st.success(body="Nome do arquivo disponível.")
333
334                                        archive_query = "INSERT INTO arquivo_texto (nome_arquivo, conteudo, usuario_associado, documento_usuario_associado) VALUES (%s, %s, %s, %s)"
335                                        archive_values = (new_archive_name, content, logged_user_name, logged_user_document)
336
337                                        if content is not None:
338                                            QueryExecutor().insert_query(archive_query, archive_values, "Upload do arquivo realizado com sucesso!", "Erro ao fazer upload do arquivo:")
339
340                                            log_query = """INSERT INTO logs_atividades (usuario_log, tipo_log, conteudo_log) VALUES(%s, %s, %s)"""
341                                            log_query_values = (logged_user, "Atualização", "Atualizou os dados do arquivo {}.".format(new_archive_name))
342                                            QueryExecutor().insert_query(log_query, log_query_values,"Log gravado.", "Erro ao gravar log:")
343
344                                    else:
345                                        with col1:
346                                            with st.expander(label="Validação dos dados", expanded=True):
347                                                st.error(body="O nome do arquivo já está sendo utilizado.")
348
349                        elif safe_password != "" and confirm_safe_password != "" and safe_password == confirm_safe_password and is_password_valid == False:
350                            with col2:
351                                with st.spinner(text="Aguarde..."):
352                                    sleep(0.5)
353                                with st.expander(label="Validação dos dados", expanded=True):
354                                    st.error(body="A senha informada é ínválida.")
355
356                        if safe_password != confirm_safe_password:
357                            with col2:
358                                with st.spinner(text="Aguarde..."):
359                                    sleep(0.5)
360                                with st.expander(label="Validação dos dados", expanded=True):
361                                    st.error(body="As senhas informadas não coincidem.")
362
363        elif user_archives_quantity == 0:
364            col1, col2, col3 = st.columns(3)
365            with col2:
366                st.warning(body="Você ainda não possui arquivos registrados.")

Função para a atualização de um arquivo.

def delete_archive(self):
368    def delete_archive(self):
369        """
370        Função para a exclusão de um arquivo.
371        """
372        logged_user_name, logged_user_document = Login().get_user_data(return_option="user_doc_name")
373        logged_user, logged_user_password = Login().get_user_data(return_option="user_login_password")
374
375        user_archives_quantity = self.get_user_archives_quantity()
376
377        if user_archives_quantity >= 1:
378            col1, col2 = st.columns(2)
379
380            archives_names = self.get_archives_names()
381
382            with col1:
383
384                with st.expander(label="Consulta", expanded=True):
385                    selected_archive = st.selectbox(label="Selecione o arquivo", options=archives_names)
386                    safe_password = st.text_input(label="Informe sua senha", type="password", help="Corresponde a senha utilizada para acessar a aplicação.")
387                    confirm_safe_password = st.text_input(label="Confirme sua senha", type="password", help="Deve ser idêntica a senha informada acima.")
388                    confirm_selection = st.checkbox(label="Confirmar dados", value=False)
389
390                    if confirm_selection:
391                        is_password_valid, hashed_password = Login().check_login(logged_user, safe_password)
392                        if safe_password != "" and confirm_safe_password != "" and confirm_safe_password == safe_password and is_password_valid == True:
393
394                            with st.spinner(text="Aguarde..."):
395                                sleep(0.5)
396
397                            archive_content_query = """
398                            SELECT
399                                arquivo_texto.nome_arquivo,
400                                arquivo_texto.conteudo
401                            FROM
402                                arquivo_texto
403                            INNER JOIN
404                                usuarios ON arquivo_texto.usuario_associado = usuarios.nome
405                            AND arquivo_texto.documento_usuario_associado = usuarios.documento_usuario
406                            WHERE
407                                arquivo_texto.nome_arquivo = %s
408                            AND
409                                arquivo_texto.usuario_associado = %s
410                                AND arquivo_texto.documento_usuario_associado = %s;
411                            """
412
413                            archive_content = (QueryExecutor().complex_compund_query(query=archive_content_query, list_quantity=2, params=(selected_archive, logged_user_name, logged_user_document)))
414                            archive_content = (QueryExecutor().treat_complex_result(archive_content, to_remove_archive_list))
415
416                            for i in range(0, len(archive_content)):
417                                if archive_content[i] == "":
418                                    del archive_content[i]
419
420                            with col2:
421                                with st.expander(label="Conteudo", expanded=True):
422
423                                    display_content = ""
424                                    for i in range(0, len(archive_content)):
425                                        if "\\n" in archive_content[i]:
426                                            display_content = str(archive_content[i])
427                                            display_content = display_content.replace("\\n", " ")
428                                        else:
429                                            display_content += str(archive_content[i]) + "\n\n"
430
431                                    st.code(display_content)
432                                    confirm_data_deletion = st.checkbox(label="Confirmar exclusão dos dados")
433                                delete_archive_button = st.button(label=":wastebasket: Deletar arquivo")
434
435                            if confirm_data_deletion and delete_archive_button:
436                                with col2:
437                                    with st.spinner(text="Aguarde..."):
438                                        sleep(2.5)
439
440                                    delete_archive_query = '''
441                                    DELETE arquivo_texto FROM arquivo_texto
442                                    INNER JOIN
443                                        usuarios ON arquivo_texto.usuario_associado = usuarios.nome
444                                    AND arquivo_texto.documento_usuario_associado = usuarios.documento_usuario
445                                    WHERE arquivo_texto.nome_arquivo = %s
446                                    AND arquivo_texto.usuario_associado = %s
447                                    AND arquivo_texto.documento_usuario_associado = %s;'''
448                                    archive_values = (selected_archive, logged_user_name, logged_user_document)
449
450                                    QueryExecutor().insert_query(delete_archive_query, archive_values,"Arquivo deletado com sucesso!", "Erro ao deletar arquivo:")
451
452                                    log_query = """INSERT INTO logs_atividades (usuario_log, tipo_log, conteudo_log) VALUES(%s, %s, %s)"""
453                                    log_query_values = (logged_user, "Exclusão", "Excluiu o arquivo {}.".format(selected_archive))
454                                    QueryExecutor().insert_query(log_query, log_query_values,"Log gravado.", "Erro ao gravar log:")
455
456                        elif safe_password != "" and confirm_safe_password != "" and confirm_safe_password == safe_password and is_password_valid == False:
457                            with col2:
458                                with st.spinner(text="Aguarde..."):
459                                    sleep(0.5)
460                                with st.expander(label="Validação dos dados", expanded=True):
461                                    st.error(body="A senha informada é inválida.")
462                        elif safe_password != confirm_safe_password:
463                            with col2:
464                                with st.spinner(text="Aguarde..."):
465                                    sleep(0.5)
466                                with st.expander(label="Validação dos dados", expanded=True):
467                                    st.error(body="As senhas informadas não coincidem.")
468
469        elif user_archives_quantity == 0:
470            col1, col2, col3 = st.columns(3)
471            with col2:
472                with st.spinner(text="Aguarde..."):
473                    sleep(0.5)
474                st.warning(body="Você ainda não possui arquivos registrados.")

Função para a exclusão de um arquivo.

def main_menu(self):
476    def main_menu(self):
477        """
478        Menu principal.
479        """
480
481        col1, col2, col3 = st.columns(3)
482
483        with col1:
484            st.header(body=":spiral_note_pad: Arquivos")
485
486        with col2:
487            menu_options = ["Registrar arquivo", "Consultar arquivo","Atualizar arquivo", "Deletar arquivo"]
488
489            selected_option = st.selectbox(label="Menu", options=menu_options)
490
491        st.divider()
492        if selected_option == menu_options[0]:
493            self.create_new_archive()
494        elif selected_option == menu_options[1]:
495            self.read_archive()
496        elif selected_option == menu_options[2]:
497            self.update_archive()
498        elif selected_option == menu_options[3]:
499            self.delete_archive()

Menu principal.