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)
示例#2
0
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)