def cli(self):
        '''
        Método que inicia a visão CLI.

        Cria uma instância da classe Cli enviando a lista de BDs encontrados no diretório.
        O usuário escolhe um BD e uma temporada para iniciar o programa.
        
        Em seguida inicia-se um laço que recebe instruções do usuário e executa ações no
        BD modelado pelo script banco.py
        '''
        def escolha_tabela():
            '''
            Função invocada para que se defina uma temporada.

            Caso haja mais de uma, a visão mostra ao usuário opções de escolha;
            Caso haja apenas uma, esta temporada é escolhida;
            Caso não haja nenhuma, é criada uma temporada com numeração do ano atual.
            '''

            tabelas = bd.verifica_tabelas()
            tabelas = [x[0] for x in tabelas]

            if len(tabelas) > 1:
                temporada = self.visao.escolhe_temporada(tabelas).replace(
                    "temporada_", "")

            elif len(tabelas) == 1:
                temporada = tabelas[0].replace("temporada_", "")

            else:
                temporada = datetime.now().year

            return temporada

        self.visao = Cli(self.bancos)
        nome_bd, temporada = self.visao.escolhe_banco()

        bd = BD(self.diretorio + nome_bd)

        if temporada == 0:
            temporada = escolha_tabela()

        bd.define_tabela(temporada)

        while True:
            escolha_menu, parametro = self.visao.menu(nome_bd, bd.tabela)
            if "Sair" in escolha_menu:
                bd.encerra()
                quit()

            elif "Consultar outras estatísticas" in escolha_menu:
                estats_1, estats_2, colunas_1, colunas_2 = bd.printa_tabela_2()
                self.visao.consultar_tabela(estats_1, colunas_1)
                self.visao.consultar_tabela(estats_2, colunas_2)

            elif "Alterar BD" in escolha_menu:
                self.busca_bds()
                self.bancos.remove(nome_bd)
                if len(self.bancos) < 1:
                    escolha = self.visao.opcoes_BD("abortar", escolha_menu)

                else:
                    escolha = self.visao.opcoes_BD(self.bancos, escolha_menu)

                if "Sair" not in escolha:
                    bd.encerra()
                    bd = BD(self.diretorio + escolha)
                    nome_bd = escolha

                    temporada = escolha_tabela()
                    bd.define_tabela(temporada)

            elif "Deletar BD" in escolha_menu:
                self.busca_bds()
                self.bancos.remove(nome_bd)

                if len(self.bancos) < 1:
                    escolha = self.visao.opcoes_BD("abortar", escolha_menu)

                else:
                    escolha = self.visao.opcoes_BD(self.bancos, escolha_menu)

                    if "Sair" not in escolha:
                        if os.path.isfile(self.diretorio + escolha):
                            os.remove(self.diretorio + escolha)

            elif "Deletar temporada" in escolha_menu:
                escolha = self.visao.deletar_temporada(bd.verifica_tabelas(),
                                                       parametro)
                if "Sair" not in escolha:
                    bd.deleta_tabela(escolha)

            elif "Alterar/Criar temporada" in escolha_menu:
                escolha, temporada = self.visao.alterar_temporada(
                    bd.verifica_tabelas(), bd.tabela)

                if "Criar nova temporada" in escolha:
                    bd.tabela = f"temporada_{temporada}"
                    bd.cria_tabela()

                elif "temporada_" in escolha:
                    bd.tabela = escolha

            elif "Consultar estatísticas" in escolha_menu:
                dados = bd.printa_tabela()
                self.visao.consultar_tabela(dados[0], dados[1])

            elif "Adicionar um jogo" in escolha_menu:
                itens_serie = bd.retorna_tabela("inteira")

                if len(itens_serie) > 0:
                    ultima_linha = bd.retorna_tabela("última linha")[0][2:]
                    placar_min, placar_max, quebra_min, quebra_max = ultima_linha

                    tipo = "normal"

                    if parametro < placar_min:
                        tipo = "novo mínimo"
                        quebra_min += 1
                        print(
                            "Um novo placar mínimo foi registrado na temporada!"
                        )

                    elif parametro > placar_max:
                        tipo = "novo máximo"
                        quebra_max += 1
                        print(
                            "Um novo placar máximo foi registrado na temporada!"
                        )

                    bd.adiciona_placar([
                        parametro, placar_min, placar_max, quebra_min,
                        quebra_max
                    ], tipo)

                else:
                    bd.adiciona_placar(parametro, "primeiro jogo")
Example #2
0
class ControladorGui:    
    '''
    Classe que atua como controlador do programa quando se utiliza interface gráfica.
    '''
    
    def __init__(self):
        '''
        A classe inicializa o método "busca_bds" para que se tenha uma lista de BDs.
        '''
        
        self.busca_bds()


    def busca_bds(self):
        '''
        Método que faz uma busca pelos bancos de dados no diretório do programa
        '''
        
        self.diretorio = os.path.dirname(__file__) + "\\BD\\"        
        self.bancos = [file for file in os.listdir(self.diretorio) if file.endswith(".db")]


    def conecta(self, nome_bd):
        '''
        Método que inicia uma conexão com o BD.
        
        Parâmetro:
        ----------
        nome_bd : str
            Nome do BD a ser conectado.
        '''
        
        self.bd = BD(nome_bd)
        

    def encerra(self):
        '''
        Método que encerra uma conexão com o BD.
        '''
        
        self.bd.encerra()
        

    def altera_cria_bd(self, param):
        '''
        Método que altera ou cria um BD.

        Primeiro encerra a atual conexão e então cria uma nova com base nos
        parâmetros recebidos. Em seguida, define qual tabela será usada no
        BD.

        Retorna para interface gráfica informações para que possam ser definidas
        as variáveis globais relativas aos nomes do BD e da temporada em uso
        no script gui.py.
        
        Parâmetro:
        ----------
        param : list
            Lista que contem o nome do banco e a numeração da temporada.
        '''
        
        self.encerra()            
        self.conecta(f".\\BD\\{param[0]}")
        
        if param[1] != None:            
            self.tabela("escolhe", param[1])
            return param[1]

        else:
            try:
                self.tabela("escolhe", self.tabela("consulta")[0])
                return self.tabela("consulta")[0]

            except:
                self.tabela("escolhe", str(datetime.now().year))
                return str(datetime.now().year)               
            

    def tabela(self, tipo, param = ""):
        '''
        Método que consulta as tabelas do BD ou define uma.

        Se o tipo escolhido for "consulta", retorna uma lista das temporadas
        existentes no BD.

        Parâmetros:
        ----------
        tipo : str
            Qual tipo de ação o método deve executar.
            
        param : str (opcional)
            Parâmetro relativo a numeração da temporada.
        '''
        
        if tipo == "consulta":
            return [x[0].replace("temporada_", "") for x in self.bd.verifica_tabelas()]

        if tipo == "escolhe":
            self.bd.define_tabela(param)
            

    def retorna_dados(self):
        '''
        Método para retornar dados da tabela ativa no BD.

        Retorna:
        uma lista com a tabela inteira;
        duas listas, uma com os cinco melhores e outra com os
        cinco piores placares registrados;
        a soma dos placares registrados.
        '''
        
        return self.bd.retorna_tabela("inteira"), self.bd.top_5("lista"), self.bd.top_5_piores("lista"), self.bd.soma_placares()


    def altera_cria_temp(self, etapa, param = ""):
        '''
        Método que fornece informações ou executa ações na tabela ativa no BD.

        O método pode retornar à interface GUI uma lista com as tabelas ativas bem
        como o nome da atual tabela em uso.
        
        Parâmetros:
        ----------
        etapa : str
            Indica ao método qual tipo de ação a executar.

        param : str (opcional)
            Parâmetro relativo a numeração da temporada.
        '''
        
        if etapa == "inicial":
            tabelas = self.bd.verifica_tabelas()
            tabelas = [x[0] for x in tabelas] 
            tabelas.remove(self.bd.tabela)

            return tabelas, self.bd.tabela

        if etapa == "criação":            
            self.bd.tabela = f"temporada_{param}"
            self.bd.cria_tabela()

        if etapa == "alterar":    
            self.bd.tabela = param
            

    def deletar(self, etapa, param = ""):
        '''
        Método que possibilita deletar um BD ou uma temporada.
        
        Parâmetros:
        ----------
        etapa : str
            Indica ao método qual tipo de ação a executar.

        param : str (opcional)
            Parâmetro relativo a numeração da temporada.
        '''

        if etapa == "deletar temporada":
            self.bd.deleta_tabela(param)

            
        if etapa == "deletar BD":            
            if os.path.isfile(self.diretorio + param):
                os.remove(self.diretorio + param)
            

    def add_placar(self, placar):
        '''
        Método que envia da interface gráfica ao BD o placar a ser adicionado.

        Efetua verificações se o novo placar quebra os recordes mínimos ou máximos
        da temporada.

        Retorna à interface o tipo de inserção na tabela:
        se gerou um novo placar máximo;
        se gerou um novo placar mínimo;
        se não gerou nenhuma quebra de recorde;
        se foi o primeiro jogo da tabela.
        
        Parâmetro:
        ----------
        placar : int
            Qual o placar a ser adicionado na tabela.
        '''
        
        tipo = "normal"

        if len(self.bd.retorna_tabela("inteira")) > 0:                 
            ultima_linha = self.bd.retorna_tabela("última linha")[0][2:]
            placar_min, placar_max, quebra_min, quebra_max = ultima_linha            

            if placar < placar_min:
                tipo = "novo mínimo"
                quebra_min += 1
                
            elif placar > placar_max:
                tipo = "novo máximo"
                quebra_max += 1

            self.bd.adiciona_placar([placar, placar_min, placar_max, quebra_min, quebra_max], tipo)

        else:          
            self.bd.adiciona_placar(placar, "primeiro jogo")

        return tipo