import os import sys from logging.config import fileConfig from sqlalchemy import engine_from_config, pool from alembic import context # Add server directory to path for imports sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) # Import all models so they are registered on Base.metadata from app.audit.models import * # noqa: F401, F403, E402 from app.auth.models import * # noqa: F401, F403, E402 from app.core.database import Base # noqa: E402 from app.core.database_tls import database_engine_options # noqa: E402 from app.core.workflow_journal.models import ( # noqa: F401, E402 WorkflowRun, WorkflowStepEvent, ) from app.domains.asset.models import * # noqa: F401, F403, E402 from app.domains.auditor.models import ( # noqa: F401, E402 AccessCertification, AccessCertificationItem, AuditorCertExpiry, AuditorEvidencePack, AuditorMfaStatus, AuditorPatAudit, AuditorPublicExposureFinding, AuditorRiskScore, AuditorSecretRotationRecord, AuditorSigninEvent, ) from app.domains.cmdb.models import ( # noqa: F401 CmdbDomain, CmdbServer, CmdbSyncJob, CmdbUserMapping, ) from app.domains.data_access.models import ( # noqa: F401, E402 DataAccessBinding, DataAccessCompiledEffect, DataAccessEffectRun, DataAccessEntitlement, DataAccessRequest, DataAccessRequestItem, DataAccessResource, ) from app.domains.finance_flux.models import * # noqa: F401, F403, E402 from app.domains.hr.holiday_models import ( # noqa: F401, E402 HrPublicHoliday, HrPublicHolidayCalendar, ) from app.domains.hr.leave_insights_models import ( # noqa: F401, E402 HrLeaveInsightSnapshot, ) from app.domains.hr.leave_models import ( # noqa: F401, E402 HrLeaveAccount, HrLeavePosting, ) from app.domains.hr.models import * # noqa: F401, F403, E402 from app.domains.leaver_blocked.models import ( # noqa: F401, E402 LeaverBlockAudit, LeaverDualSignOverride, ) from app.domains.procurement.models import * # noqa: F401, F403, E402 from app.domains.relationships.models import RelRelationship # noqa: F401, E402 from app.identity.person_models import * # noqa: F401, F403, E402 from app.integrations.models import ( # noqa: F401, E402 Integration, IntegrationApprovalFlow, PlatformSetting, ) from app.intelligence.models import ( # noqa: F401, E402 IntelligenceAnalysis, IntelligenceGenerationLease, IntelligenceRecommendation, IntelligenceSnapshot, ) config = context.config if config.config_file_name is not None: fileConfig(config.config_file_name) target_metadata = Base.metadata # Override sqlalchemy.url from environment variable if set url = os.environ.get("DATABASE_URL_SYNC") url = url or config.get_main_option("sqlalchemy.url") url, connect_args = database_engine_options(url) config.set_main_option("sqlalchemy.url", url.replace("%", "%%")) def run_migrations_offline() -> None: url = config.get_main_option("sqlalchemy.url") context.configure( url=url, target_metadata=target_metadata, literal_binds=True, dialect_opts={"paramstyle": "named"}, ) with context.begin_transaction(): context.run_migrations() def run_migrations_online() -> None: connectable = engine_from_config( config.get_section(config.config_ini_section, {}), prefix="sqlalchemy.", poolclass=pool.NullPool, connect_args=connect_args, ) with connectable.connect() as connection: context.configure(connection=connection, target_metadata=target_metadata) with context.begin_transaction(): context.run_migrations() if context.is_offline_mode(): run_migrations_offline() else: run_migrations_online()