def controller_menu_psw_contrato_sem_dados(user, *args): menu_titulo("Menu PSW") if not user.is_authenticated: mensagem(({'type': 0, 'texto': 'Usuário não autenticado'}, )) return controller_menu_inicial(user) if not DRIVER.autenticado: mensagem(({'type': 0, 'texto': 'Usuário não autenticado no PSW'}, )) return controller_psw_login(user) opcoes = ( { 'texto': 'Retornar ao menu principal', 'controller': controller_menu_principal, }, { 'texto': 'Inserir contrato na lista de contratos pendentes de baixa', 'controller': controller_ont_lista, }, { 'texto': 'Buscar outro contrato', 'controller': controller_psw_busca_contrato, }, ) context = { 'opcoes': opcoes, } return menu(user, context, controller_menu_psw_contrato_sem_dados, *args)
def menu(user, context, controller, *args): assert context['opcoes'], 'Você deve fornecer opções para o menu' for i in range(len(context['opcoes'])): print(INIT_SPACE + '(' + str(i) + ') ' + context['opcoes'][i]['texto']) print() opcao_usuario = str(input(INIT_SPACE + 'Escolha uma das opções acima: ')) if opcao_usuario.isdigit(): opcao_usuario = int(opcao_usuario) if (opcao_usuario + 1) > len(context['opcoes']) or opcao_usuario < 0: mensagem(({'type': 0, 'texto': 'Digite uma opção válida'}, )) return controller(user, *args) limpa_tela() return context['opcoes'][opcao_usuario]['controller'](user, *args) else: mensagem(( { 'type': 0, 'texto': 'Digite apenas números' }, { 'type': 0, 'texto': 'Digite uma opção válida' }, )) return controller(user, *args)
def controller_ont_baixa(user, *args): headers = { "Authorization": 'Token ' + user.token, } json = {} dados = args[0] for dado in dados: # print(dado) json[dado['id']] = dado['valor'] json['token'] = user.token try: response_url = requests.post( 'http://127.0.0.1:8000/almoxarifado/cont/api/ont/baixa/', json=json, headers=headers) except ConnectionError: mensagem(({ 'type': 0, 'texto': 'O sistema Constel.tk não está respondendo, contate o administrador' }, )) return controller_menu_principal(user, *args) print() print(SEPARADOR) if response_url.status_code == 201: user = response_url.json()['username'] user_name = response_url.json( )['first_name'] + " " + response_url.json()['last_name'] print(INIT_SPACE + "Ont baixada de:") print(INIT_SPACE + "Matrícula: " + user) print(INIT_SPACE + "Nome: " + user_name) elif response_url.status_code == 400: errors = response_url.json()['non_field_errors'] for error in errors: print(INIT_SPACE + "ERRO: " + error) else: print( INIT_SPACE + "Ocorreu um erro desconhecido, entre em contato com o administrador" ) print(response_url.json()) print(SEPARADOR) return controller_menu_psw_contrato(user, *args)
def controller_login_web_constel(user, *args): if user.is_authenticated: mensagem(({'type': 0, 'texto': 'Usuário logado'}, )) return controller_menu_principal(user, *args) fields = ( { 'id': 'username', 'name': 'login', }, { 'id': 'password', 'name': 'senha', }, ) response = form(user, fields) try: response_url = requests.post(CONSTEL_WEB_LOGIN_URL, json=response) except ConnectionError: mensagem(({ 'type': 0, 'texto': 'O sistema Constel.tk não está respondendo, contate o administrador' }, )) return controller_menu_inicial(user, *args) if response_url.status_code == 200: user.login = response['username'] user.password = response['password'] user.token = response_url.json()['token'] user.authentidate() mensagem(({'type': 2, 'texto': 'Seja bem vindo(a)'}, )) return controller_menu_principal(user, *args) elif response_url.status_code == 400: mensagem(({'type': 0, 'texto': 'Usuário e/ou senha incorretos'}, )) return controller_menu_inicial(user, *args) else: mensagem(({ 'type': 0, 'texto': 'Falha na conexão com o sistema Constel.tk' }, )) return controller_menu_inicial(user, *args)
def psw_login(self, username, password): """ Aqui o webdriver já iniciado acessa a URL do site do PSW e envia as informações de login e senha do usuário para então realizar a autenticação no sistema. :param username: string com o nome de usuário que é fornecido pelo usuário no formuário de login do PSW :param password: string com o nome de usuário que é fornecido pelo usuário no formuário de login do PSW :return: True para usuário autenticado com sucesso, e False para falha na autenticação """ self._driver.get(PSW_URL) self._driver.implicitly_wait(1) try: usuario = self._driver.find_element_by_name('j_username') usuario.send_keys(username) senha = self._driver.find_element_by_name('j_password') senha.send_keys(password) senha.submit() except NoSuchElementException: try: self._driver.find_element_by_name('form:contrato') except NoSuchElementException: self.autenticado = False mensagem(({'type': 0, 'texto': 'Falha ao conectar-se com o PSW'},)) else: self.autenticado = True return self.autenticado else: self._driver.implicitly_wait(1) if self._driver.current_url == 'https://www.copel.com/pswweb/paginas/j_security_check': self.autenticado = False mensagem(({'type': 0, 'texto': 'Chave Copel e/ou senha incorretos'}, )) return self.autenticado elif self._driver.current_url == PSW_URL: self.autenticado = True return self.autenticado else: return False
def controller_psw_login(user, *args): if not user.is_authenticated: mensagem(({'type': 0, 'texto': 'Usuário não autenticado'}, )) return controller_menu_inicial(user, *args) if DRIVER.autenticado: mensagem(({'type': 0, 'texto': 'Usuário não autenticado no PSW'}, )) return controller_psw_busca_contrato(user, *args) fields = ( { 'id': 'username', 'name': 'Chave da Copel', }, { 'id': 'password', 'name': 'Senha da Copel', }, ) response = form(user, fields) DRIVER.psw_login(response['username'], response['password']) return controller_psw_busca_contrato(user, *args)
def controller_psw_busca_contrato(user, *args): if not user.is_authenticated: mensagem(({'type': 0, 'texto': 'Usuário não autenticado'}, )) return controller_menu_inicial(user, *args) if not DRIVER.autenticado: mensagem(({'type': 0, 'texto': 'Usuário não autenticado no PSW'}, )) return controller_menu_principal(user, *args) fields = ({ 'id': 'contrato', 'name': 'Contrato', }, ) response = form(user, fields) dados = DRIVER.psw_contrato(response['contrato']) if len(dados) < 2: return controller_psw_busca_contrato(user, *args) print(INIT_SPACE + 'INFORMAÇÕES DO CONTRATO:') print(tabulate(dados['informacoes'], tablefmt="fancy_grid")) print() print(INIT_SPACE + 'DADOS DO CONTRATO:') print(tabulate(dados['dados'], tablefmt="fancy_grid")) dados['dados'].append({ 'id': 'contrato', 'nome': 'contrato', 'valor': response['contrato'] }) if len(dados['dados']) == 2: return controller_menu_psw_contrato_sem_dados(user, dados['dados']) else: return controller_menu_psw_contrato_sucesso(user, dados['dados'])
def psw_contrato(self, contrato): """ Aqui o webdriver que já deve estar com o usuário autenticado, realiza a busca do contrato informado pelo usuário no sistema da Copel; E obtem de volta as informações pertinentes, são elas: - Nome do cliente; - Status do contrato; - Porta; - Estado do Link; - Nível ONT [dB]; - Nível OLT [dB]; - Nível OLT TX:; - Número Serial; - Modelo ONT; dentre outras. A principal informação requisitada é o núemro de serial e o modelo da ONT, pois com esses é realizada a a baixa do equipamento da carga do técnico que realizou a instalação, no sistema principal (Constel.tk). Porém todas as informações são enviadas para o sistema principal e armazenadas no banco de dados. :param contrato: string contendo o contrato informado pelo usuário no formulário de busca de contrato :return: returna um dicionário com as informações pertinentes ao contrato informado """ if not self.autenticado: return False self._driver.get(PSW_URL) self._driver.implicitly_wait(2) try: self._driver.find_element_by_name('form:contrato').send_keys(contrato) self._driver.find_element_by_name('form:j_idt115').click() except NoSuchElementException: try: self._driver.find_element_by_name('j_username') self.autenticado = False mensagem(({'type': 0, 'texto': 'Seção expirada, faça login novamente'},)) except NoSuchElementException: self.autenticado = False mensagem(({'type': 0, 'texto': 'Falha ao conectar-se com o PSW'},)) return False self._driver.implicitly_wait(2) tempo_maximo = 20 tempo = 0 carregado = None informacoes = [] dados = [] while tempo <= tempo_maximo and carregado is None: response_info = Bs(self._driver.page_source, 'lxml') informacoes = response_info.find('div', {"id": 'form:painel_content'}) carregado = informacoes.find_next('span', string='Estado técnico: ') informacoes = informacoes.findAllNext('span', {'style': re.compile('.*font-weight:bold.*')}) sleep(0.2) tempo += 0.2 info_cliente = [] for i in informacoes: info_cliente.append([i.text, ]) tempo = 0 tempo_maximo = 30 while tempo <= tempo_maximo and dados == []: response = self._driver.page_source self._driver.implicitly_wait(1) response_info = Bs(response, 'lxml') dados = response_info.find('tbody', {'id': 'form:cli_data'}) sleep(0.2) tempo += 0.2 dados_cliente = [] if dados: celulas = dados.findAllNext('td') rotulos = [ ['porta', 'Porta:', ], ['estado_link', 'Estado do Link', ], ['nivel_ont', 'Nível ONT [dB]', ], ['nivel_olt', 'Nível OLT [dB]', ], ['nivel_olt_tx', 'Nível OLT TX', ], ['serial', 'Número Serial', ], ['modelo', 'Modelo ONT', ], ] for i in range(7): dados_cliente.append({'id': rotulos[i][0], 'nome': rotulos[i][1], 'valor': celulas[i].text}) if not len(info_cliente): info_cliente = [['Não foi possível carregar informações', ], ] if not len(dados_cliente): dados_cliente = [{'nome': 'Não foi possível carregar dados'}] context = { 'informacoes': info_cliente, 'dados': dados_cliente, } return context
def controller_ont_lista(user, *args): mensagem(({'type': 0, 'texto': 'Função indisponível no momento'}, )) return controller_menu_psw_contrato(user, *args)