Release v0.1.7
All checks were successful
Dependency Audit / dependency-audit (push) Successful in 1m35s

This commit is contained in:
2026-07-11 02:46:04 +02:00
parent edb4687826
commit a00ef54821
25 changed files with 2740 additions and 201 deletions

View File

@@ -1,9 +1,17 @@
from __future__ import annotations
import argparse
import json
from pathlib import Path
from govoplan_core.db.bootstrap import bootstrap_dev_data
from govoplan_core.db.migrations import migrate_database
from govoplan_core.db.migrations import (
ModuleMigrationTaskExecutionError,
POST_MIGRATION_TASK_PHASES,
PRE_MIGRATION_TASK_PHASES,
migrate_database,
run_registered_module_migration_tasks,
)
from govoplan_core.db.session import configure_database, get_database
from govoplan_core.settings import settings
@@ -11,12 +19,43 @@ from govoplan_core.settings import settings
def main() -> None:
parser = argparse.ArgumentParser(description="Initialize the GovOPlaN database")
parser.add_argument("--database-url", default=settings.database_url, help="Database URL to migrate")
parser.add_argument("--enabled-module", action="append", default=[], help="Target enabled module id used to discover module migrations; may be repeated.")
parser.add_argument("--migration-module", action="append", default=[], help="Module id whose migration heads should be upgraded in this order before final heads.")
parser.add_argument("--migration-task-record-output", type=Path, help="Write executed module migration task records to this JSON file.")
parser.add_argument("--with-dev-data", action="store_true", help="Create default tenant/user/roles and a development API key")
parser.add_argument("--dev-api-key", default=settings.dev_bootstrap_api_key, help="Development API key secret to create")
args = parser.parse_args()
configure_database(args.database_url)
migration = migrate_database(database_url=args.database_url)
enabled_modules = tuple(args.enabled_module) if args.enabled_module else None
migration_order = tuple(args.migration_module) if args.migration_module else None
task_records: list[dict[str, object]] = []
try:
_run_migration_tasks(
task_records,
database_url=args.database_url,
enabled_modules=enabled_modules,
migration_order=migration_order,
phases=PRE_MIGRATION_TASK_PHASES,
)
migration = migrate_database(
database_url=args.database_url,
enabled_modules=enabled_modules,
migration_module_order=migration_order,
)
_run_migration_tasks(
task_records,
database_url=args.database_url,
enabled_modules=enabled_modules,
migration_order=migration_order,
phases=POST_MIGRATION_TASK_PHASES,
)
finally:
if args.migration_task_record_output:
args.migration_task_record_output.parent.mkdir(parents=True, exist_ok=True)
args.migration_task_record_output.write_text(json.dumps(task_records, indent=2, sort_keys=True) + "\n", encoding="utf-8")
if task_records:
print(f"Executed {len(task_records)} module migration task(s).")
if migration.reconciled_revision:
print(f"Reconciled legacy database marker to {migration.reconciled_revision}.")
print(f"Database schema upgraded to {migration.current_revision}.")
@@ -33,5 +72,26 @@ def main() -> None:
print("Development API key already exists or was not requested.")
def _run_migration_tasks(
target: list[dict[str, object]],
*,
database_url: str,
enabled_modules: tuple[str, ...] | None,
migration_order: tuple[str, ...] | None,
phases: tuple[str, ...],
) -> None:
try:
records = run_registered_module_migration_tasks(
database_url=database_url,
enabled_modules=enabled_modules,
migration_module_order=migration_order,
phases=phases,
)
except ModuleMigrationTaskExecutionError as exc:
target.extend(exc.records)
raise
target.extend(records)
if __name__ == "__main__":
main()