Skip to content

Process

Process(name, has_security_access=False, ui_data='CubeAction=1511\x0cDataAction=1503\x0cCubeLogChanges=0\x0c', parameters=None, variables=None, variables_ui_data=None, prolog_procedure='', metadata_procedure='', data_procedure='', epilog_procedure='', datasource_type='None', datasource_ascii_decimal_separator='.', datasource_ascii_delimiter_char=';', datasource_ascii_delimiter_type='Character', datasource_ascii_header_records=1, datasource_ascii_quote_character='', datasource_ascii_thousand_separator=',', datasource_data_source_name_for_client='', datasource_data_source_name_for_server='', datasource_password='', datasource_user_name='', datasource_query='', datasource_uses_unicode=True, datasource_view='', datasource_subset='', datasource_json_root_pointer='', datasource_json_variable_mapping='')

Bases: TM1Object

Abstraction of a TM1 Process.

IMPORTANT. doesn't work with Processes that were generated through the Wizard

Default construcor

Parameters:

Name Type Description Default
name str

name of the process - mandatory

required
has_security_access Optional[bool]
False
ui_data str
'CubeAction=1511\x0cDataAction=1503\x0cCubeLogChanges=0\x0c'
parameters Iterable
None
variables Iterable
None
variables_ui_data Iterable
None
prolog_procedure str
''
metadata_procedure str
''
data_procedure str
''
epilog_procedure str
''
datasource_type str
'None'
datasource_ascii_decimal_separator str
'.'
datasource_ascii_delimiter_char str
';'
datasource_ascii_delimiter_type str
'Character'
datasource_ascii_header_records int
1
datasource_ascii_quote_character str
''
datasource_ascii_thousand_separator str
','
datasource_data_source_name_for_client str
''
datasource_data_source_name_for_server str
''
datasource_password str
''
datasource_user_name str
''
datasource_query str
''
datasource_uses_unicode bool
True
datasource_view str
''
datasource_subset str
''
datasource_json_root_pointer str
''
datasource_json_variable_mapping str
''
Source code in TM1py/Objects/Process.py
def __init__(
    self,
    name: str,
    has_security_access: Optional[bool] = False,
    ui_data: str = "CubeAction=1511\fDataAction=1503\fCubeLogChanges=0\f",
    parameters: Iterable = None,
    variables: Iterable = None,
    variables_ui_data: Iterable = None,
    prolog_procedure: str = "",
    metadata_procedure: str = "",
    data_procedure: str = "",
    epilog_procedure: str = "",
    datasource_type: str = "None",
    datasource_ascii_decimal_separator: str = ".",
    datasource_ascii_delimiter_char: str = ";",
    datasource_ascii_delimiter_type: str = "Character",
    datasource_ascii_header_records: int = 1,
    datasource_ascii_quote_character: str = "",
    datasource_ascii_thousand_separator: str = ",",
    datasource_data_source_name_for_client: str = "",
    datasource_data_source_name_for_server: str = "",
    datasource_password: str = "",
    datasource_user_name: str = "",
    datasource_query: str = "",
    datasource_uses_unicode: bool = True,
    datasource_view: str = "",
    datasource_subset: str = "",
    datasource_json_root_pointer: str = "",
    datasource_json_variable_mapping: str = "",
):
    """Default construcor

    :param name: name of the process - mandatory
    :param has_security_access:
    :param ui_data:
    :param parameters:
    :param variables:
    :param variables_ui_data:
    :param prolog_procedure:
    :param metadata_procedure:
    :param data_procedure:
    :param epilog_procedure:
    :param datasource_type:
    :param datasource_ascii_decimal_separator:
    :param datasource_ascii_delimiter_char:
    :param datasource_ascii_delimiter_type:
    :param datasource_ascii_header_records:
    :param datasource_ascii_quote_character:
    :param datasource_ascii_thousand_separator:
    :param datasource_data_source_name_for_client:
    :param datasource_data_source_name_for_server:
    :param datasource_password:
    :param datasource_user_name:
    :param datasource_query:
    :param datasource_uses_unicode:
    :param datasource_view:
    :param datasource_subset:
    :param datasource_json_root_pointer:
    :param datasource_json_variable_mapping:
    """
    self._name = name
    self._has_security_access = has_security_access
    self._ui_data = ui_data
    self._parameters = list(parameters) if parameters else []
    self._variables = list(variables) if variables else []
    if variables_ui_data:
        # Handle encoding issue in variable_ui_data for async requests
        self._variables_ui_data = [entry.replace("€", "\f") for entry in variables_ui_data]
    else:
        self._variables_ui_data = []
    self._prolog_procedure = Process.add_generated_string_to_code(prolog_procedure)
    self._metadata_procedure = Process.add_generated_string_to_code(metadata_procedure)
    self._data_procedure = Process.add_generated_string_to_code(data_procedure)
    self._epilog_procedure = Process.add_generated_string_to_code(epilog_procedure)
    self._datasource_type = datasource_type
    self._datasource_ascii_decimal_separator = datasource_ascii_decimal_separator
    self._datasource_ascii_delimiter_char = datasource_ascii_delimiter_char
    self._datasource_ascii_delimiter_type = datasource_ascii_delimiter_type
    self._datasource_ascii_header_records = datasource_ascii_header_records
    self._datasource_ascii_quote_character = datasource_ascii_quote_character
    self._datasource_ascii_thousand_separator = datasource_ascii_thousand_separator
    self._datasource_data_source_name_for_client = datasource_data_source_name_for_client
    self._datasource_data_source_name_for_server = datasource_data_source_name_for_server
    self._datasource_password = datasource_password
    self._datasource_user_name = datasource_user_name
    self._datasource_query = datasource_query
    self._datasource_uses_unicode = datasource_uses_unicode
    self._datasource_view = datasource_view
    self._datasource_subset = datasource_subset
    self._datasource_json_root_pointer = datasource_json_root_pointer
    self._datasource_json_variable_mapping = datasource_json_variable_mapping

AUTO_GENERATED_STATEMENTS = '{}\r\n{}\r\n'.format(BEGIN_GENERATED_STATEMENTS, END_GENERATED_STATEMENTS) class-attribute instance-attribute

BEGIN_GENERATED_STATEMENTS = '#****Begin: Generated Statements***' class-attribute instance-attribute

END_GENERATED_STATEMENTS = '#****End: Generated Statements****' class-attribute instance-attribute

MAX_STATEMENTS = 16380 class-attribute instance-attribute

MAX_STATEMENTS_POST_11_8_015 = 100000 class-attribute instance-attribute

all_procedures property

body property

body_as_dict property

data_procedure property writable

datasource_ascii_decimal_separator property writable

datasource_ascii_delimiter_char property writable

datasource_ascii_delimiter_type property writable

datasource_ascii_header_records property writable

datasource_ascii_quote_character property writable

datasource_ascii_thousand_separator property writable

datasource_data_source_name_for_client property writable

datasource_data_source_name_for_server property writable

datasource_json_root_pointer property writable

datasource_json_variable_mapping property writable

datasource_password property writable

datasource_query property writable

datasource_subset property writable

datasource_type property writable

datasource_user_name property writable

datasource_uses_unicode property writable

datasource_view property writable

epilog_procedure property writable

has_security_access property writable

metadata_procedure property writable

name property writable

parameters property

prolog_procedure property writable

variables property

add_generated_string_to_code(code) staticmethod

Source code in TM1py/Objects/Process.py
@staticmethod
def add_generated_string_to_code(code: str) -> str:
    pattern = r"(?s)#\*\*\*\*Begin: Generated Statements(.*)#\*\*\*\*End: Generated Statements\*\*\*\*"
    if re.search(pattern=pattern, string=code):
        return code
    else:
        return Process.AUTO_GENERATED_STATEMENTS + code

add_parameter(name, prompt, value, parameter_type=None)

Parameters:

Name Type Description Default
name str
required
prompt str
required
value Union[str, int, float]
required
parameter_type Optional[str]

introduced in TM1 11 REST API, therefor optional. if Not given type is derived from value

None

Returns:

Type Description
Source code in TM1py/Objects/Process.py
def add_parameter(
    self, name: str, prompt: str, value: Union[str, int, float], parameter_type: Optional[str] = None
):
    """

    :param name:
    :param prompt:
    :param value:
    :param parameter_type: introduced in TM1 11 REST API, therefor optional. if Not given type is derived from value
    :return:
    """
    if not parameter_type:
        parameter_type = "String" if isinstance(value, str) else "Numeric"
    parameter = {"Name": name, "Prompt": prompt, "Value": value, "Type": parameter_type}
    self._parameters.append(parameter)

add_variable(name, variable_type)

add variable to the process

Parameters:

Name Type Description Default
name str

-

required
variable_type str

'String' or 'Numeric'

required

Returns:

Type Description
Source code in TM1py/Objects/Process.py
def add_variable(self, name: str, variable_type: str):
    """add variable to the process

    :param name: -
    :param variable_type: 'String' or 'Numeric'
    :return:
    """
    # variable consists of actual variable and UI-Information ('ignore','other', etc.)
    # 1. handle Variable info
    variable = {
        "Name": name,
        "Type": variable_type,
        "Position": len(self._variables) + 1,
        "StartByte": 0,
        "EndByte": 0,
    }
    self._variables.append(variable)
    # 2. handle UI info
    var_type = 33 if variable_type == "Numeric" else 32
    # '\f' !
    variable_ui_data = "VarType=" + str(var_type) + "\f" + "ColType=" + str(827) + "\f"
    """
    mapping VariableUIData:
        VarType 33 -> Numeric
        VarType 32 -> String
        ColType 827 -> Other
    """
    self._variables_ui_data.append(variable_ui_data)

drop_parameter_types()

Source code in TM1py/Objects/Process.py
def drop_parameter_types(self):
    for p in range(len(self.parameters)):
        if "Type" in self.parameters[p]:
            del self.parameters[p]["Type"]

from_dict(process_as_dict) classmethod

Parameters:

Name Type Description Default
process_as_dict Dict

Dictionary, process as dictionary

required

Returns:

Type Description
Process

an instance of this class

Source code in TM1py/Objects/Process.py
@classmethod
def from_dict(cls, process_as_dict: Dict) -> "Process":
    """
    :param process_as_dict: Dictionary, process as dictionary
    :return: an instance of this class
    """
    return cls(
        name=process_as_dict["Name"],
        has_security_access=process_as_dict["HasSecurityAccess"],
        ui_data=process_as_dict.get("UIData", ""),
        parameters=process_as_dict["Parameters"],
        variables=process_as_dict["Variables"],
        variables_ui_data=process_as_dict.get("VariablesUIData", ""),
        prolog_procedure=process_as_dict["PrologProcedure"],
        metadata_procedure=process_as_dict["MetadataProcedure"],
        data_procedure=process_as_dict["DataProcedure"],
        epilog_procedure=process_as_dict["EpilogProcedure"],
        datasource_type=process_as_dict["DataSource"].get("Type", ""),
        datasource_ascii_decimal_separator=process_as_dict["DataSource"].get("asciiDecimalSeparator", ""),
        datasource_ascii_delimiter_char=process_as_dict["DataSource"].get("asciiDelimiterChar", ""),
        datasource_ascii_delimiter_type=process_as_dict["DataSource"].get("asciiDelimiterType", ""),
        datasource_ascii_header_records=process_as_dict["DataSource"].get("asciiHeaderRecords", ""),
        datasource_ascii_quote_character=process_as_dict["DataSource"].get("asciiQuoteCharacter", ""),
        datasource_ascii_thousand_separator=process_as_dict["DataSource"].get("asciiThousandSeparator", ""),
        datasource_data_source_name_for_client=process_as_dict["DataSource"].get("dataSourceNameForClient", ""),
        datasource_data_source_name_for_server=process_as_dict["DataSource"].get("dataSourceNameForServer", ""),
        datasource_password=process_as_dict["DataSource"].get("password", ""),
        datasource_user_name=process_as_dict["DataSource"].get("userName", ""),
        datasource_query=process_as_dict["DataSource"].get("query", ""),
        datasource_uses_unicode=process_as_dict["DataSource"].get("usesUnicode", ""),
        datasource_view=process_as_dict["DataSource"].get("view", ""),
        datasource_subset=process_as_dict["DataSource"].get("subset", ""),
        datasource_json_root_pointer=process_as_dict["DataSource"].get("jsonRootPointer", ""),
        datasource_json_variable_mapping=process_as_dict["DataSource"].get("jsonVariableMapping", ""),
    )

from_json(process_as_json) classmethod

Parameters:

Name Type Description Default
process_as_json str

response of /Processes('x')?$expand=*

required

Returns:

Type Description
Process

an instance of this class

Source code in TM1py/Objects/Process.py
@classmethod
def from_json(cls, process_as_json: str) -> "Process":
    """
    :param process_as_json: response of /Processes('x')?$expand=*
    :return: an instance of this class
    """
    process_as_dict = json.loads(process_as_json)
    return cls.from_dict(process_as_dict)

max_statements(version) staticmethod

Source code in TM1py/Objects/Process.py
@staticmethod
def max_statements(version: str):
    if verify_version(required_version="11.8.015", version=version):
        return Process.MAX_STATEMENTS_POST_11_8_015

    return Process.MAX_STATEMENTS

remove_parameter(name)

Source code in TM1py/Objects/Process.py
def remove_parameter(self, name: str):
    for parameter in self.parameters[:]:
        if parameter["Name"] == name:
            self._parameters.remove(parameter)

remove_variable(name)

Source code in TM1py/Objects/Process.py
def remove_variable(self, name: str):
    for variable in self.variables[:]:
        if variable["Name"] == name:
            vuid = self._variables_ui_data[self._variables.index(variable)]
            self._variables_ui_data.remove(vuid)
            self._variables.remove(variable)