from datetime import datetime as dt, timezone as tz from flask import current_app from sqlalchemy.exc import SQLAlchemyError from common.extensions import cache_manager, minio_client, db from common.models.interaction import EveAIAsset, EveAIAssetVersion from common.utils.document_utils import mark_tenant_storage_dirty from common.utils.model_logging_utils import set_logging_information def create_asset_stack(api_input, tenant_id): type_version = cache_manager.assets_version_tree_cache.get_latest_version(api_input['type']) api_input['type_version'] = type_version new_asset = create_asset(api_input, tenant_id) new_asset_version = create_version_for_asset(new_asset, tenant_id) db.session.add(new_asset) db.session.add(new_asset_version) try: db.session.commit() except SQLAlchemyError as e: current_app.logger.error(f"Could not add asset for tenant {tenant_id}: {str(e)}") db.session.rollback() raise e return new_asset, new_asset_version def create_asset(api_input, tenant_id): new_asset = EveAIAsset() new_asset.name = api_input['name'] new_asset.description = api_input['description'] new_asset.type = api_input['type'] new_asset.type_version = api_input['type_version'] if api_input['valid_from'] and api_input['valid_from'] != '': new_asset.valid_from = api_input['valid_from'] else: new_asset.valid_from = dt.now(tz.utc) new_asset.valid_to = api_input['valid_to'] set_logging_information(new_asset, dt.now(tz.utc)) return new_asset def create_version_for_asset(asset, tenant_id): new_asset_version = EveAIAssetVersion() new_asset_version.asset = asset new_asset_version.bucket_name = minio_client.create_tenant_bucket(tenant_id) set_logging_information(new_asset_version, dt.now(tz.utc)) return new_asset_version def add_asset_version_file(asset_version, field_name, file, tenant_id): object_name, file_size = minio_client.upload_file(asset_version.bucket_name, asset_version.id, field_name, file.content_type) mark_tenant_storage_dirty(tenant_id) return object_name