Skip to main content

Teste de geração de biblioteca

Project description

Teste.

"""Módulo para utilizar o SAP com Python.""" from typing import List

import psutil import PySimpleGUI as sg import win32com.client

class Sap: """Classe para uso do SAP."""

__sap_gui: win32com.client.CDispatch = None
__scripting_engine: win32com.client.CDispatch = None
__connection: win32com.client.CDispatch = None
__active_connection: win32com.client.CDispatch = None
__session: win32com.client.CDispatch = None
__active_session: win32com.client.CDispatch = None
__active_window: win32com.client.CDispatch = None
sg.theme('DarkAmber')

def __init__(self):
    """Método construtor para o objeto SAP."""
    self.__check_process()

def __check_process(self) -> None:
    """Método para checar se o aplicativo SAP está aberto."""
    if "saplogon.exe" in (
        process.name() for process in psutil.process_iter()
    ):
        for process in psutil.process_iter(attrs=['name', 'connections']):
            if process.info['name'] == 'saplogon.exe':
                number_connections: int = len(process.info['connections'])
        if number_connections > 0:
            self.__initialize_logged_in_process()
        else:
            sg.popup_ok(
                'Workspaces e ambientes do SAP não foram selecionados!',
                title='Atenção!'
            )
            raise ValueError('Aplicação encerrada!')
    else:
        sg.popup_ok(
            'O Sap Logon não está ativo!',
            title='Atenção!'
        )
        raise ValueError('Aplicação encerrada!')

def __initialize_logged_in_process(self) -> None:
    """Método para inicializar com o SAP logado."""
    self.__get_object_sap_gui()
    self.__get_scripting_engine_sap_gui()
    self.__connection_sap_gui()
    self.__active_connection_sap_gui()
    self.__session_sap_gui()
    self.__active_session_sap_gui()
    self.__window_sap_gui()
    self.maximize()
    if self.check_logon_screen():
        sg.popup_ok(
            'O SAP não está logado!',
            title='Atenção!'
        )
        self.disconnect()
        raise ValueError('Aplicação encerrada!')
    if not self.check_session_manager():
        definition = sg.popup_yes_no(
            "O sistema está em uso, deseja continuar?",
            title="Atenção!"
        )
        if definition == "Yes":
            self.end_transaction()
        else:
            self.disconnect()
            raise ValueError('Aplicação encerrada!')

def __get_object_sap_gui(self) -> None:
    """Método para criar o objeto SAPGUI."""
    self.__sap_gui = win32com.client.GetObject('SAPGUI')

@property
def sapgui(self) -> win32com.client.CDispatch:
    """Métodod para retornar o objeto SAPGUI."""
    return self.__sap_gui

def __get_scripting_engine_sap_gui(self) -> None:
    """Método para criar o objeto SAPGUI habilitado para script."""
    self.__scripting_engine = self.__sap_gui.GetScriptingEngine

@property
def scripting(self):
    """Método para retornar o objeto SAPGUI habilitado para script."""
    return self.__scripting_engine

def __connection_sap_gui(self) -> None:
    """Método para criar a conexao com o objeto SAPGUI."""
    self.__connection = self.__scripting_engine.Connections

@property
def connections(self):
    """Método para retornar a conexao com o SAPGUI."""
    return self.__connection

def __active_connection_sap_gui(self) -> None:
    """Método para ativar a conexão do objeto SAPGUI."""
    self.__active_connection = self.__connection[
        self.__connection.Count - 1
    ]

@property
def connection(self):
    """Método para retornar o objeto SAPGUI com a conexão ativa."""
    return self.__active_connection

def __session_sap_gui(self) -> None:
    """Método para criar a sessão do objeto SAPGUI."""
    self.__session = self.__active_connection.Sessions

@property
def sessions(self):
    """Método para retornar a sessão do objeto SAPGUI."""
    return self.__session

def __active_session_sap_gui(self) -> None:
    """Método para ativar a sessão do objeto SAPGUI."""
    self.__active_session = self.__session[self.__session.Count - 1]

@property
def session(self):
    """Método para retornar o objeto SAPGUI com a sessão ativa."""
    return self.__active_session

def __window_sap_gui(
    self,
    item_window: str = "0"
) -> None:
    """Método para ativar a janela do objeto SAPGUI.

    Args:
        item_window (str, optional): Item da janela utilizada.
            Defaults to "0".
    """
    self.__active_window = self.__active_session.findById(
        f"wnd[{item_window}]"
    )

@property
def window(self):
    """Método para retornar o objeto SAPGUI com a janela ativa."""
    return self.__active_window

def get_session_info(self) -> dict:
    """Método para retornar informações da session."""
    IsLowSpeedConnection = self.__active_session.Info.IsLowSpeedConnection
    return {
        'is active': self.__active_session.IsActive,
        'is busy': self.__active_session.Busy,
        'connection index': self.__active_session.Parent.Id,
        'session index': self.__active_session.Id,
        'Application Server': self.__active_session.Info.ApplicationServer,
        'Code Page': self.__active_session.Info.Codepage,
        'Group': self.__active_session.Info.Group,
        'GuiCodepage': self.__active_session.Info.GuiCodepage,
        'IsLowSpeedConnection': IsLowSpeedConnection,
        'Language': self.__active_session.Info.Language,
        'MessageServer': self.__active_session.Info.MessageServer,
        'ResponseTime': self.__active_session.Info.ResponseTime,
        'ScreenNumber': self.__active_session.Info.ScreenNumber,
        'SessionNumber': self.__active_session.Info.SessionNumber,
        'SystemNumber': self.__active_session.Info.SystemNumber,
        'SystemSessionId': self.__active_session.Info.SystemSessionId,
        'System Name': self.__active_session.Info.SystemName,
        'Client': self.__active_session.Info.Client,
        'User ID': self.__active_session.Info.User,
        'Program': self.__active_session.Info.Program,
        'Transaction': self.__active_session.Info.Transaction
    }

def find_object(
    self,
    name_find_object: str,
    type_find_object: str = "",
    item_find_object: int = 0,
    item_window: str = "0"
) -> win32com.client:
    """Método para localizar um objeto.

    Args:
        name_find_object (str): Informar o nome da área da tela.
        type_find_object (str, optional): Informar o tipo do objeto.
            Defaults to "".
        item_find_object (int, optional): Qual objeto deseja retornar.
            Defaults to 0.
        item_window (str, optional): Qual janela deseja utilizar.
            Defaults to 0.

    Returns:
        win32com.client: Retorna o objeto localizado.
    """
    self.__window_sap_gui(item_window)
    return self.__active_window.FindAllByName(
        name_find_object,
        type_find_object
    ).Item(item_find_object)

def get_text(
    self,
    name_get_text_object: str,
    type_get_text_object: str = "",
    item_get_text_object: int = 0,
    item_window: str = "0"
) -> str:
    """Método para retornar o texto de um objeto.

    Args:
        name_get_text_object (str): Informar o nome da área da tela.
        type_get_text_object (str, optional)): Informar o tipo do objeto.
            Defaults to "".
        item_get_text_object (int, optional): Qual objeto deseja retornar.
            Defaults to 0.
        item_window (str, optional): Qual janela deseja utilizar.
            Defaults to 0.

    Returns:
        str: Retorna o texto do objeto.
    """
    return self.find_object(
        name_get_text_object,
        type_get_text_object,
        item_get_text_object,
        item_window
    ).Text

def set_text(
    self,
    text_set_text_object: str,
    name_set_text_object: str,
    type_set_text_object: str = "",
    item_set_text_object: int = 0,
    item_window: str = "0"
) -> None:
    """Método para inserir um texto em um objeto.

    Args:
        text_set_text_object (str): Informar o texto que deseja inserir.
        name_set_text_object (str): Informar o nome da área da tela.
        type_set_text_object (str, optional): Informar o tipo do objeto.
            Defaults to "".
        item_set_text_object (int, optional): Qual objeto deseja retornar.
            Defaults to 0.
        item_window (str, optional): Qual janela deseja utilizar.
            Defaults to 0.

    Returns:
        str: Insere o texto no objeto.
    """
    self.find_object(
        name_set_text_object,
        type_set_text_object,
        item_set_text_object,
        item_window
    ).Text = text_set_text_object

def send_v_key(self, key_SendVKey: int) -> None:
    """Método para pressionar uma técla de atalho.

    Args:
        key_SendVKey (int): Inserir código da tecla de atalho.
    """
    self.__active_window.SendVKey(key_SendVKey)

def start_transaction(self, transaction: str) -> None:
    """Método para inicair uma transação.

    Args:
        transaction (str): Informar código da transação.
    """
    self.__active_session.StartTransaction(transaction)

def end_transaction(self) -> None:
    """Método para encerrar uma transação."""
    self.__active_session.EndTransaction()

def check_logon_screen(self) -> bool:
    """Método para verificar se a tela é de logon.

    Returns:
        bool: Retornar verdadeiro ou falso.
    """
    if (
        self.get_session_info()["Transaction"] == "S000" and
        self.get_session_info()["Client"] == "000" and
        self.get_session_info()["User ID"] == ""
    ):
        return True
    return False

def check_session_manager(self) -> bool:
    """Método para vewrificar se está na tela inicial.

    Returns:
        bool: Retorna verdadeiro ou falso.
    """
    if (
        self.get_session_info()["Transaction"] == "SESSION_MANAGER" or
        self.get_session_info()["Transaction"] == "SMEN"
    ):
        return True
    return False

def disconnect(self) -> None:
    """Método para desconectar do SAP logon."""
    self.__active_window = None
    self.__active_session = None
    self.__session = None
    self.__active_connection = None
    self.__connection = None
    self.__scripting_engine = None
    self.__sap_gui = None

def maximize(self) -> None:
    """Método para maximizar a tela principal."""
    self.__active_window.Maximize()

def print_screen(self, path_and_name_imagem: str) -> None:
    """Método para printar a tela em uso.

    Args:
        path_and_name_imagem (str): Inserir caminho e nome do arquivo.
    """
    with open(f"{path_and_name_imagem}.bmp", "wb") as file:
        file.write(
            self.__active_window.HardCopyToMemory(0)
        )

def press(
    self,
    name_press_object: str,
    type_press_object: str = "",
    item_press_object: int = 0,
    item_window: str = "0"
) -> None:
    """Método para pressionar um objeto.

    Args:
        name_press_object (str): Inserir nome do objeto.
        type_press_object (str, optional): Inserir tipo do objeto.
            Defaults to "".
        item_press_object (int, optional): Inserir item do objeto.
            Defaults to 0.
        item_window (str, optional): Qual janela deseja utilizar.
            Defaults to 0.
    """
    self.find_object(
        name_press_object,
        type_press_object,
        item_press_object,
        item_window
    ).Press()

def select(
    self,
    name_press_object: str,
    type_press_object: str = "",
    item_press_object: int = 0,
    item_window: str = "0"
) -> None:
    """Método para selecionar um objeto.

    Args:
        name_press_object (str): Inserir nome do objeto.
        type_press_object (str, optional): Inserir tipo do objeto.
            Defaults to "".
        item_press_object (int, optional): Inserir item do objeto.
            Defaults to 0.
        item_window (str, optional): Qual janela deseja utilizar.
            Defaults to 0.
    """
    self.find_object(
        name_press_object,
        type_press_object,
        item_press_object,
        item_window
    ).Select()

def find_object_id(
    self,
    id_find: str
) -> win32com.client:
    """Método para localizar um objeto pelo seu Id.

    Args:
        id_find (str): Informar o Id do objeto.
    """
    return self.__active_session.FindById(id_find)

def tree_expand_node(
    self,
    id_find: str,
    node_key: str
) -> None:
    """Método para expandir o nó de uma árvore.

    Args:
        id_find (str): Informar o Id do objeto.
        node_key (str): Informar a chave do nó.
    """
    self.find_object_id(id_find).ExpandNode(node_key)

def tree_select_node(
    self,
    id_find: str,
    node_key: str
) -> None:
    """Método para selecionar o nó de uma árvore.

    Args:
        id_find (str): Informar o Id do objeto.
        node_key (str): Informar a chave do nó.
    """
    self.find_object_id(id_find).SelectNode(node_key)

def tree_doble_click_node(
    self,
    id_find: str,
    node_key: str
) -> None:
    """Método para efetuar o duplo clique em um nó de uma árvore.

    Args:
        id_find (str): Informar o Id do objeto.
        node_key (str): Informar a chave do nó.
    """
    self.find_object_id(id_find).DoubleClickNode(node_key)

def tree_unselect_node(
    self,
    id_find: str,
    node_key: str
) -> None:
    """Método para deselecionar o nó de uma árvore.

    Args:
        id_find (str): Informar o Id do objeto.
        node_key (str): Informar a chave do nó.
    """
    self.find_object_id(id_find).UnselectNode(node_key)

def insert_dynamic_selection(
    self,
    id_find: str,
    node_key_expand: str,
    node_key_select: str
) -> None:
    """Método para inserir um item de seleção dinamica.

    Args:
        id_find (str): Informar o Id do objeto.
        node_key (str): Informar a chave do nó.
    """
    self.tree_expand_node(id_find, node_key_expand)
    self.tree_select_node(id_find, node_key_select)
    self.tree_doble_click_node(id_find, node_key_select)
    self.tree_unselect_node(id_find, node_key_select)

def show_context_menu(
    self,
    name_find_object: str,
    type_find_object: str = "",
    item_find_object: int = 0,
    item_window: str = "0"
) -> None:
    """Método para mostar o menu de contexto de um objeto.

    Args:
        name_find_object (str): Informar o nome da área da tela.
        type_find_object (str, optional): Informar o tipo do objeto.
            Defaults to "".
        item_find_object (int, optional): Qual objeto deseja retornar.
            Defaults to 0.
        item_window (str, optional): Qual janela deseja utilizar.
            Defaults to 0.
    """
    self.find_object(
        name_find_object,
        type_find_object,
        item_find_object,
        item_window
    ).ShowContextMenu()

def select_context_menu(
    self,
    select_context: str
) -> None:
    """Método para selecionar o contexto.

    Args:
        select_context (str): Inserir nome do contexto.
    """
    self.find_object("usr").SelectContextMenuItem(select_context)

def apply_context(
    self,
    select_context: str,
    list_apply_context: list,
    item_find_object: int = 0,
    item_window: str = "0"
) -> None:
    """Método para aplicar um contexto do menu.

    Args:
        select_context (str): Inserir nome do contexto.
        list_apply_context: Lista com nomes e tipos dos objetos.
        item_find_object (int, optional): Qual objeto deseja retornar.
            Defaults to 0.
        item_window (str, optional): Qual janela deseja utilizar.
            Defaults to 0.
    """
    for name_context, type_context in list_apply_context:
        self.show_context_menu(
            name_context,
            type_context,
            item_find_object,
            item_window
        )
        self.select_context_menu(select_context)

def set_text_cell(
    self,
    list_itens: list,
    name_find_object: str,
    type_find_object: str = "",
    item_find_object: int = 0,
    item_window: str = "0",
    column_itens: int = 1
) -> None:
    """Método para inserir um texto em uma célula.

    Args:
        list_itens (list): Informar a lista de itens a serem inseridos.
        name_find_object (str): Informar o nome da área da tela.
        type_find_object (str, optional): Informar o tipo do objeto.
            Defaults to "".
        item_find_object (int, optional): Qual objeto deseja retornar.
            Defaults to 0.
        item_window (str, optional): Qual janela deseja utilizar.
            Defaults to 0.
        column_itens (int, optional): Qual coluna deseja utilizar.
            Defaults to 1.
    """
    for index, login in enumerate(list_itens, start=1):
        table_control = self.find_object(
            name_find_object,
            type_find_object,
            item_find_object,
            item_window
        )
        if index == 1:
            table_control.GetCell(0, column_itens).Text = login
        else:
            table_control.GetCell(1, column_itens).Text = login
            table_control.VerticalScrollbar.Position = index

def press_cell(
    self,
    row_cell: int,
    name_find_object: str,
    type_find_object: str = "",
    item_find_object: int = 0,
    item_window: str = "0",
    column_cell: int = 0,
) -> None:
    """Método para pressionar uma célula.

    Args:
        row_cell (int): Informar a linha da célula.
        name_find_object (str): Informar o nome da área da tela.
        type_find_object (str, optional): Informar o tipo do objeto.
            Defaults to "".
        item_find_object (int, optional): Qual objeto deseja retornar.
            Defaults to 0.
        item_window (str, optional): Qual janela deseja utilizar.
            Defaults to 0.
        column_cell (int, optional): Informar a coluna da célula.
            Defaults to 0.
    """
    self.find_object(
        name_find_object,
        type_find_object,
        item_find_object,
        item_window
    ).GetCell(row_cell, column_cell).Press()

def double_click_shell(
    self,
    row_shell: int,
    column_shell: str,
    name_find_object: str,
    type_find_object: str = "",
    item_find_object: int = 0,
    item_window: str = "0"
) -> None:
    """Método para efetuar um duplo click em uma shell.

    Args:
        row_cell (int): Informar a linha da célula.
        column_shell (str): Informar o nome da coluna.
        name_find_object (str): Informar o nome da área da tela.
        type_find_object (str, optional): Informar o tipo do objeto.
            Defaults to "".
        item_find_object (int, optional): Qual objeto deseja retornar.
            Defaults to 0.
        item_window (str, optional): Qual janela deseja utilizar.
            Defaults to 0.
    """
    table_control = self.find_object(
        name_find_object,
        type_find_object,
        item_find_object,
        item_window
    )
    table_control.ClearSelection()
    table_control.DoubleClick(row_shell, column_shell)

def selected(
    self,
    type_selection: bool,
    name_find_object: str,
    type_find_object: str = "",
    item_find_object: int = 0,
    item_window: str = "0"
) -> None:
    """Método para selecionar ou descelecionar uma checkbox.

    Args:
        type_selection (bool): Informar tipo da seleção.
        name_find_object (str): Informar o nome da área da tela.
        type_find_object (str, optional): Informar o tipo do objeto.
            Defaults to "".
        item_find_object (int, optional): Qual objeto deseja retornar.
            Defaults to 0.
        item_window (str, optional): Qual janela deseja utilizar.
            Defaults to 0.
    """
    self.find_object(
        name_find_object,
        type_find_object,
        item_find_object,
        item_window
    ).Selected = type_selection

def layout(
    self,
    name_layout: str,
    column_shell: str,
    name_find_object: str,
    type_find_object: str = "",
    item_find_object: int = 0,
    item_window: str = "0"
) -> None:
    """Método para selecionar um layout.

    Args:
        name_layout (str): Informar a nome do layout.
        column_shell (str): Informar o nome da coluna.
        name_find_object (str): Informar o nome da área da tela.
        type_find_object (str, optional): Informar o tipo do objeto.
            Defaults to "".
        item_find_object (int, optional): Qual objeto deseja retornar.
            Defaults to 0.
        item_window (str, optional): Qual janela deseja utilizar.
            Defaults to 0.
    """
    table_control = self.find_object(
        name_find_object,
        type_find_object,
        item_find_object,
        item_window
    )
    table_control.ClearSelection()
    for row_table in range(table_control.RowCount):
        table_control.FirstVisibleRow = row_table
        if table_control.GetCellValue(
            row_table,
            column_shell
        ) == name_layout:
            table_control.SelectedRows = str(row_table)
            self.double_click_shell(
                row_table,
                column_shell,
                name_find_object,
                type_find_object,
                item_find_object,
                item_window
            )
            break

def select_radio_button(
    self,
    item_radio_button: int,
    name_find_object: str,
    type_find_object: str = "",
    item_find_object: int = 0,
    item_window: str = "0"
) -> None:
    """Método para selecionar um radio button.

    Args:
        item_radio_button (int): Informar o item do rádio button.
        name_find_object (str): Informar o nome da área da tela.
        type_find_object (str, optional): Informar o tipo do objeto.
            Defaults to "".
        item_find_object (int, optional): Qual objeto deseja retornar.
            Defaults to 0.
        item_window (str, optional): Qual janela deseja utilizar.
            Defaults to 0.
    """
    self.find_object(
        name_find_object,
        type_find_object,
        item_find_object,
        item_window
    ).GroupMembers.Item(item_radio_button).Select()

def message(self) -> None:
    """Método para verificar se a mensagem é de erro.

    Raises:
        Exception: Retorna a informação sobre o erro.
    """
    message = self.find_object(
        "sbar",
        "GuiStatusbar"
    )
    if message.MessageType in [
        "E",
        "A"
    ]:
        raise ValueError(
            message.MessageParameter
        )

def __return_items(
    self,
    objetc: win32com.client.CDispatch,
    index: int
) -> List[str]:
    """Método para retornar o modelo do layout de retorno.

    Args:
        objetc (win32com.client.CDispatch): Informar o objeto a ser
            tratado.
        index (int): Informar o tipo de retorno desejado.

    Returns:
        List[str]: Retorna uma lista com os objetos que se deseja
            visualizar.
    """
    if index == 0:
        return [
            objetc.Name,
            objetc.Type,
            objetc.Tooltip,
            objetc.Text,
            objetc.Parent.Parent.Name
        ]
    elif index == 1:
        return [
            objetc.Name,
            objetc.Type
        ]

def list_items(
    self,
    name_find_object: str,
    return_type: int = 0,
    search_field: str = 'all',
    search_text: str = None,
    type_find_object: str = "",
    item_find_object: int = 0,
    item_window: str = "0"
) -> List[str]:
    """Método para retornar uma lista com as informações desejadas.

    Args:
        name_find_object (str): Informar nome do objeto que se deseja
            visualizar.
        return_type (int, optional): Tipo de retorno que se deseja
            retornar. Defaults to 0.
        search_field (str, optional): Escolher o tipo de visualização
            desejada, são elas:
            all - onde não de faz filtro,
            text - onde o filtro se baseia no texto da célula e
            type onde o filtro se baseio no tipo do objeto.
            Defaults to 'all'.
        search_text (str, optional): Texto a ser localizado.
            Defaults to None.
        type_find_object (str, optional): Informar o tipo do objeto.
            Defaults to "".
        item_find_object (int, optional): Qual objeto deseja retornar.
            Defaults to 0.
        item_window (str, optional): Qual janela deseja utilizar.
            Defaults to "0".

    Returns:
        List[str]: Retorna uma lista com as informações desejadas.
    """
    list_items: List[str] = []
    for item in self.find_object(
        name_find_object=name_find_object,
        type_find_object=type_find_object,
        item_find_object=item_find_object,
        item_window=item_window
    ).Children:
        if search_field == 'all':
            list_items.append(
                self.__return_items(item, return_type)
            )
        elif search_field == 'text':
            if item.Text == search_text:
                list_items.append(
                    self.__return_items(item, return_type)
                )
        elif search_field == 'type':
            if item.Type == search_text:
                list_items.append(
                    self.__return_items(item, return_type)
                )
    return list_items

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

api_sap-0.0.1.tar.gz (14.6 kB view hashes)

Uploaded Source

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page