コード例 #1
0
    def update(self, dimension: Dimension, **kwargs):
        """ Update an existing dimension

        :param dimension: instance of TM1py.Dimension
        :return: None
        """
        # delete hierarchies that have been removed from the dimension object
        hierarchies_to_be_removed = CaseAndSpaceInsensitiveSet(
            *self.hierarchies.get_all_names(dimension.name, **kwargs))
        for hierarchy in dimension.hierarchy_names:
            hierarchies_to_be_removed.discard(hierarchy)

        for hierarchy_name in hierarchies_to_be_removed:
            self.hierarchies.delete(dimension_name=dimension.name,
                                    hierarchy_name=hierarchy_name,
                                    **kwargs)

        # update all Hierarchies except for the implicitly maintained 'Leaves' Hierarchy
        for hierarchy in dimension:
            if not case_and_space_insensitive_equals(hierarchy.name, "Leaves"):
                if self.hierarchies.exists(hierarchy.dimension_name,
                                           hierarchy.name, **kwargs):
                    self.hierarchies.update(hierarchy, **kwargs)
                else:
                    self.hierarchies.create(hierarchy, **kwargs)
コード例 #2
0
    def get_custom_security_groups(self, **kwargs) -> List[str]:
        custom_groups = CaseAndSpaceInsensitiveSet(*self.get_all_groups(**kwargs))
        custom_groups.discard('Admin')
        custom_groups.discard('DataAdmin')
        custom_groups.discard('SecurityAdmin')
        custom_groups.discard('OperationsAdmin')
        custom_groups.discard('}tp_Everyone')

        return list(custom_groups)
コード例 #3
0
    def update(self, dimension: Dimension, **kwargs):
        """ Update an existing dimension

        :param dimension: instance of TM1py.Dimension
        :return: None
        """
        # delete hierarchies that have been removed from the dimension object
        hierarchies_to_be_removed = CaseAndSpaceInsensitiveSet(
            *self.hierarchies.get_all_names(dimension.name, **kwargs))
        for hierarchy in dimension.hierarchy_names:
            hierarchies_to_be_removed.discard(hierarchy)

        # update all Hierarchies except for the implicitly maintained 'Leaves' Hierarchy
        for hierarchy in dimension:
            if not case_and_space_insensitive_equals(hierarchy.name, "Leaves"):
                if self.hierarchies.exists(hierarchy.dimension_name,
                                           hierarchy.name, **kwargs):
                    self.hierarchies.update(hierarchy, **kwargs)
                else:
                    self.hierarchies.create(hierarchy, **kwargs)

        # Edge case: elements in leaves hierarchy that do not exist in other hierarchies
        if "Leaves" in dimension:
            existing_leaves = CaseAndSpaceInsensitiveSet(
                self.hierarchies.elements.get_leaf_element_names(
                    dimension.name, "Leaves"))

            leaves_to_create = list()
            for leaf in dimension.get_hierarchy("Leaves"):
                if leaf.name not in existing_leaves:
                    leaves_to_create.append(leaf)

            if leaves_to_create:
                self.hierarchies.elements.add_elements(
                    dimension_name=dimension.name,
                    hierarchy_name="Leaves",
                    elements=leaves_to_create)

        for hierarchy_name in hierarchies_to_be_removed:
            if not case_and_space_insensitive_equals(hierarchy_name, "Leaves"):
                self.hierarchies.delete(dimension_name=dimension.name,
                                        hierarchy_name=hierarchy_name,
                                        **kwargs)
コード例 #4
0
class User(TM1Object):
    """ Abstraction of a TM1 User
    
    """
    def __init__(self,
                 name: str,
                 groups: Iterable[str],
                 friendly_name: Optional[str] = None,
                 password: Optional[str] = None,
                 user_type: Union[UserType, str] = None,
                 enabled: bool = None):
        self._name = name
        self._groups = CaseAndSpaceInsensitiveSet(*groups)
        self._friendly_name = friendly_name
        self._password = password
        self._enabled = enabled
        self._user_type = user_type
        # determine user_type
        if user_type is None:
            if str(UserType.Admin) in self._groups:
                self.user_type = UserType.Admin
            elif str(UserType.SecurityAdmin) in self._groups:
                self.user_type = UserType.SecurityAdmin
            elif str(UserType.DataAdmin) in self._groups:
                self.user_type = UserType.DataAdmin
            elif str(UserType.OperationsAdmin) in self._groups:
                self.user_type = UserType.OperationsAdmin
            else:
                self.user_type = UserType.User
        else:
            self.user_type = user_type

    @property
    def name(self) -> str:
        return self._name

    @property
    def user_type(self) -> UserType:
        return self._user_type

    @property
    def friendly_name(self) -> str:
        return self._friendly_name

    @property
    def password(self) -> str:
        if self._password:
            return self._password

    @property
    def is_admin(self) -> bool:
        return 'ADMIN' in self.groups

    @property
    def groups(self) -> List[str]:
        return [group for group in self._groups]

    @property
    def enabled(self) -> bool:
        return self._enabled

    @name.setter
    def name(self, value: str):
        self._name = value

    @friendly_name.setter
    def friendly_name(self, value: str):
        self._friendly_name = value

    @password.setter
    def password(self, value: str):
        self._password = value

    @enabled.setter
    def enabled(self, value: Union[bool, None]):
        self._enabled = value

    @user_type.setter
    def user_type(self, value: Union[str, UserType]):
        if not isinstance(value, str) and not isinstance(value, UserType):
            raise ValueError(
                "argument 'user_type' must be of type str or UserType")

        self._user_type = UserType(value)
        # update groups as well, since TM1 doesn't react to change in user_type property
        if self._user_type is not UserType.User:
            self.add_group(str(self._user_type))

    def add_group(self, group_name: str):
        self._groups.add(group_name)

    def remove_group(self, group_name: str):
        self._groups.discard(group_name)

    @classmethod
    def from_json(cls, user_as_json: str):
        """ Alternative constructor

        :param user_as_json: user as JSON string
        :return: user, an instance of this class
        """
        user_as_dict = json.loads(user_as_json)
        return cls.from_dict(user_as_dict)

    @classmethod
    def from_dict(cls, user_as_dict: Dict) -> 'User':
        """ Alternative constructor

        :param user_as_dict: user as dict
        :return: user, an instance of this class
        """
        return cls(name=user_as_dict['Name'],
                   friendly_name=user_as_dict['FriendlyName'],
                   enabled=user_as_dict["Enabled"],
                   user_type=user_as_dict["Type"],
                   groups=[group["Name"] for group in user_as_dict['Groups']])

    @property
    def body(self) -> str:
        return self.construct_body()

    def construct_body(self) -> str:
        """
        construct body (json) from the class attributes
        :return: String, TM1 JSON representation of a user
        """
        body_as_dict = collections.OrderedDict()
        body_as_dict['Name'] = self.name
        body_as_dict['FriendlyName'] = self.friendly_name or self.name
        body_as_dict['Enabled'] = self._enabled
        body_as_dict['Type'] = str(self._user_type)
        if self.password:
            body_as_dict['Password'] = self._password
        body_as_dict['*****@*****.**'] = [
            format_url("Groups('{}')", group) for group in self.groups
        ]
        return json.dumps(body_as_dict, ensure_ascii=False)
コード例 #5
0
ファイル: User.py プロジェクト: kathys007/tm1py
class User(TM1Object):
    """ Abstraction of a TM1 User
    
    """
    def __init__(self, name, groups, friendly_name=None, password=None):
        self._name = name
        self._groups = CaseAndSpaceInsensitiveSet(*groups)
        self._friendly_name = friendly_name
        self._password = password

    @property
    def name(self):
        return self._name

    @property
    def friendly_name(self):
        return self._friendly_name

    @property
    def password(self):
        if self._password:
            return self._password

    @property
    def is_admin(self):
        return 'ADMIN' in self.groups

    @property
    def groups(self):
        return [group for group in self._groups]

    @name.setter
    def name(self, value):
        self._name = value

    @friendly_name.setter
    def friendly_name(self, value):
        self._friendly_name = value

    @password.setter
    def password(self, value):
        self._password = value

    def add_group(self, group_name):
        self._groups.add(group_name)

    def remove_group(self, group_name):
        self._groups.discard(group_name)

    @classmethod
    def from_json(cls, user_as_json):
        """ Alternative constructor

        :param user_as_json: user as JSON string
        :return: user, an instance of this class
        """
        user_as_dict = json.loads(user_as_json)
        return cls.from_dict(user_as_dict)

    @classmethod
    def from_dict(cls, user_as_dict):
        """ Alternative constructor

        :param user_as_dict: user as dict
        :return: user, an instance of this class
        """
        return cls(name=user_as_dict['Name'],
                   friendly_name=user_as_dict['FriendlyName'],
                   groups=[group["Name"] for group in user_as_dict['Groups']])

    @property
    def body(self):
        return self.construct_body()

    def construct_body(self):
        """
        construct body (json) from the class attributes
        :return: String, TM1 JSON representation of a user
        """
        body_as_dict = collections.OrderedDict()
        body_as_dict['Name'] = self.name
        body_as_dict['FriendlyName'] = self.friendly_name
        if self.password:
            body_as_dict['Password'] = self._password
        body_as_dict['*****@*****.**'] = [
            'Groups(\'{}\')'.format(group) for group in self.groups
        ]
        return json.dumps(body_as_dict, ensure_ascii=False)