modular_sdk/models/tenant.py (97 lines of code) (raw):

from typing import Optional from pynamodb.attributes import (UnicodeAttribute, ListAttribute, MapAttribute) from pynamodb.indexes import AllProjection from modular_sdk.commons.constants import ALLOWED_TENANT_PARENT_MAP_KEYS from modular_sdk.models.base_meta import BaseMeta, TABLES_PREFIX from modular_sdk.models.pynamodb_extension.base_model import M3BooleanAttribute, \ BaseGSI from modular_sdk.models.pynamodb_extension.base_role_access_model import \ BaseRoleAccessModel from modular_sdk.models.region import RegionAttr CREDENTIALS_FORMAT_ERROR_PATTERN = 'Credentials was not fully registered ' \ 'for tenant {0}: {1} is absent' TENANT_NAME = 'n' MANAGEMENT_PARENT_ID = 'mpid' DISPLAY_NAME = 'dn' ACTIVATION_DATE = 'ad' DEACTIVATION_DATE = 'dd' DNTL_NAME_KEY = 'dntl' GENERAL_PROJECT_ID = 'acc' PRIMARY_CONTACTS = 'pc' SECONDARY_CONTACTS = 'sc' TENANT_MANAGER = 'tmc' DEFAULT_INSTANCE_OWNER = 'do' TENANT_CONTACT = 'ct' REGIONS = 'r' READ_ONLY = 'ro' IS_ACTIVE = 'act' CUSTOMER_NAME = 'ctmr' CLOUD = 'c' PARENT_MAP = 'pid' MODULAR_TENANTS_TABLE_NAME = 'Tenants' class Contacts(MapAttribute): primary_contacts = ListAttribute(attr_name=PRIMARY_CONTACTS, null=True) secondary_contacts = ListAttribute(attr_name=SECONDARY_CONTACTS, null=True) tenant_manager_contacts = ListAttribute(attr_name=TENANT_MANAGER, null=True) default_owner = UnicodeAttribute(attr_name=DEFAULT_INSTANCE_OWNER, null=True) class DisplayNameToLowerCloudIndex(BaseGSI): """ This class represents a Tenant display name + Cloud global secondary index """ class Meta(BaseMeta): index_name = 'dntl-c-index' read_capacity_units = 1 write_capacity_units = 1 projection = AllProjection() display_name_to_lower = UnicodeAttribute(attr_name=DNTL_NAME_KEY, hash_key=True) cloud = UnicodeAttribute(attr_name=CLOUD, range_key=True) class ProjectIndex(BaseGSI): """ This class represents a Project global secondary index """ class Meta(BaseMeta): index_name = 'ac-index' read_capacity_units = 1 write_capacity_units = 1 projection = AllProjection() project = UnicodeAttribute(attr_name=GENERAL_PROJECT_ID, hash_key=True) class CustomerNameIndex(BaseGSI): class Meta(BaseMeta): index_name = f"{CUSTOMER_NAME}-index" read_capacity_units = 1 write_capacity_units = 1 projection = AllProjection() customer_name = UnicodeAttribute(hash_key=True, attr_name=CUSTOMER_NAME) class Tenant(BaseRoleAccessModel): class Meta(BaseMeta): table_name = f'{TABLES_PREFIX}{MODULAR_TENANTS_TABLE_NAME}' name = UnicodeAttribute(hash_key=True, attr_name=TENANT_NAME) display_name = UnicodeAttribute(attr_name=DISPLAY_NAME) display_name_to_lower = UnicodeAttribute(attr_name=DNTL_NAME_KEY) read_only = M3BooleanAttribute(attr_name=READ_ONLY, null=True) is_active = M3BooleanAttribute(attr_name=IS_ACTIVE, null=True) customer_name = UnicodeAttribute(attr_name=CUSTOMER_NAME) cloud = UnicodeAttribute(attr_name=CLOUD) activation_date = UnicodeAttribute(attr_name=ACTIVATION_DATE, null=True) deactivation_date = UnicodeAttribute(attr_name=DEACTIVATION_DATE, null=True) management_parent_id = UnicodeAttribute(attr_name=MANAGEMENT_PARENT_ID, null=True) project = UnicodeAttribute(attr_name=GENERAL_PROJECT_ID, null=True) regions = ListAttribute(of=RegionAttr, attr_name=REGIONS, default=list) contacts = Contacts(attr_name=TENANT_CONTACT, null=True) parent_map = MapAttribute(attr_name=PARENT_MAP, default=dict) customer_name_index = CustomerNameIndex() project_index = ProjectIndex() dntl_c_index = DisplayNameToLowerCloudIndex() def get_parent_id(self, type_: str) -> Optional[str]: assert type_ in ALLOWED_TENANT_PARENT_MAP_KEYS if type_ in self.parent_map: return self.parent_map[type_] return @property def accN_index(self): return self.project_index @property def account_number(self) -> str | None: return self.project @account_number.setter def account_number(self, value: str | None): self.project = value