72 lines
2.7 KiB
Python
72 lines
2.7 KiB
Python
from flask import session, current_app
|
|
from sqlalchemy.exc import SQLAlchemyError
|
|
|
|
from common.extensions import db
|
|
from common.models.user import Partner, PartnerTenant
|
|
from common.utils.eveai_exceptions import EveAINoManagementPartnerService
|
|
from common.utils.model_logging_utils import set_logging_information
|
|
from datetime import datetime as dt, timezone as tz
|
|
|
|
from common.utils.security_utils import current_user_has_role
|
|
|
|
|
|
class TenantService:
|
|
@staticmethod
|
|
def associate_tenant_with_partner(tenant_id):
|
|
"""Associate a tenant with a partner"""
|
|
try:
|
|
partner_id = session['partner']['id']
|
|
# Get partner service (MANAGEMENT_SERVICE type)
|
|
partner = Partner.query.get(partner_id)
|
|
if not partner:
|
|
return
|
|
|
|
# Find a management service for this partner
|
|
management_service = next((service for service in session['partner']['services']
|
|
if service.get('type') == 'MANAGEMENT_SERVICE'), None)
|
|
|
|
if not management_service:
|
|
current_app.logger.error(f"No Management Service defined for partner {partner_id}"
|
|
f"while associating tenant {tenant_id} with partner.")
|
|
raise EveAINoManagementPartnerService()
|
|
|
|
# Create the association
|
|
tenant_partner = PartnerTenant(
|
|
partner_service_id=management_service['id'],
|
|
tenant_id=tenant_id,
|
|
relationship_type='MANAGED',
|
|
)
|
|
set_logging_information(tenant_partner, dt.now(tz.utc))
|
|
|
|
db.session.add(tenant_partner)
|
|
db.session.commit()
|
|
|
|
except SQLAlchemyError as e:
|
|
db.session.rollback()
|
|
current_app.logger.error(f"Error associating tenant {tenant_id} with partner: {str(e)}")
|
|
raise e
|
|
|
|
@staticmethod
|
|
def can_user_edit_tenant(tenant_id) -> bool:
|
|
if current_user_has_role('Super User'):
|
|
return True
|
|
elif current_user_has_role('Partner Admin'):
|
|
partner_id = session['partner']['id']
|
|
partner_service = next((service for service in session['partner']['services']
|
|
if service.get('type') == 'MANAGEMENT_SERVICE'), None)
|
|
if not partner_service:
|
|
return False
|
|
else:
|
|
partner_tenant = PartnerTenant.query.filter(
|
|
PartnerTenant.tenant_id == tenant_id,
|
|
PartnerTenant.partner_service_id == partner_service['id'],
|
|
).first()
|
|
if partner_tenant:
|
|
return True
|
|
else:
|
|
return False
|
|
else:
|
|
return False
|
|
|
|
|