modular_sdk/services/tenant_settings_service.py (74 lines of code) (raw):
from typing import Optional
from pynamodb.pagination import ResultIterator
from modular_sdk.commons import RESPONSE_BAD_REQUEST_CODE, deprecated
from modular_sdk.commons.exception import ModularException
from modular_sdk.models.tenant_settings import TenantSettings
RESOURCE_QUOTA = 'RESOURCE_QUOTA'
class TenantSettingsService:
@staticmethod
def create(tenant_name: str, key: str, value: Optional[dict] = None
) -> TenantSettings:
return TenantSettings(
tenant_name=tenant_name, key=key, value=value or dict()
)
@staticmethod
def get(tenant_name: str, key: str) -> Optional[TenantSettings]:
return TenantSettings.get_nullable(
hash_key=tenant_name,
range_key=key
)
@staticmethod
def delete(entity: TenantSettings):
entity.delete()
@staticmethod
def get_all_tenants(tenant) -> list:
tenants = TenantSettings.query(hash_key=tenant)
return list(tenants)
@staticmethod
def save(tenant_setting: TenantSettings):
tenant_setting.save()
@staticmethod
def update(tenant_setting: TenantSettings, actions: list) -> None:
tenant_setting.update(actions=actions)
@staticmethod
@deprecated('broken logic')
def get_tenant_by_name(tenant):
tenants = TenantSettingsService.get_all_tenants(tenant=tenant)
tenant_item = list(
filter(lambda item:
item.attribute_values.get('key') == RESOURCE_QUOTA,
tenants))
if not tenant_item:
raise ModularException(
code=RESPONSE_BAD_REQUEST_CODE,
content=f'Tenant with name {tenant} is not found'
)
# TODO what is wrong with this method?
return tenant_item[0]
@staticmethod
def i_get_by_tenant(tenant: str, key: Optional[str] = None,
limit: Optional[int] = None,
last_evaluated_key: Optional[dict] = None,
rate_limit: Optional[int] = None
) -> ResultIterator[TenantSettings]:
return TenantSettings.query(
hash_key=tenant,
limit=limit,
range_key_condition=(TenantSettings.key == key) if key else None,
last_evaluated_key=last_evaluated_key,
rate_limit=rate_limit
)
@staticmethod
def i_get_by_key(key: str, tenant: Optional[str] = None,
limit: Optional[int] = None
) -> ResultIterator[TenantSettings]:
fc = None
if tenant:
fc = (TenantSettings.tenant_name == tenant)
return TenantSettings.key_tenant_name_index.query(
hash_key=key,
limit=limit,
filter_condition=fc
)
@staticmethod
def get_dto(item: TenantSettings) -> dict:
return item.get_json()