From 6c2f61eebdbf5069af952559b999a2197107925f Mon Sep 17 00:00:00 2001 From: Cheng Zhou Date: Mon, 25 May 2026 14:35:24 +0800 Subject: [PATCH] chore: clean legacy setup artifacts --- README.md | 2 +- backend/app/db/base.py | 3 ++ backend/app/main.py | 3 -- backend/app/models/api_endpoint_permission.py | 1 - backend/app/models/api_endpoint_registry.py | 1 - backend/scripts/smoke_setup_config.py | 2 +- backend/tests/test_app_startup.py | 39 +++++++++++++++++++ docs/guides/setup-config-api.md | 2 +- .../local.postman_environment.example.json | 2 +- .../setup-config.postman_collection.json | 2 +- docs/setup-config-curl-smoke.sh | 2 +- 11 files changed, 48 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index caf34ebf..6fa3e34a 100644 --- a/README.md +++ b/README.md @@ -48,7 +48,7 @@ - 文档入口见 `docs/README.md`;当前约束集中在分支治理、发布清单和治理审计文档,操作手册集中在 `docs/guides/`,历史交付记录集中在 `docs/reports/` 与 `docs/plans/`。 ## 常用流程 -1. 用管理员账号登录前端(默认 `admin@example.com / admin123`)。 +1. 用管理员账号登录前端(默认 `admin@huapont.cn / admin123`)。 2. 进入左侧导航「账号治理」「项目治理」进行用户、项目、中心等全局管理;或在“项目列表”选择项目后进入项目内工作区。 3. Dashboard 查看进度、待办;左侧导航进入“里程碑”“任务”等页面。 4. 退出登录或切换项目可通过顶部右侧下拉。 diff --git a/backend/app/db/base.py b/backend/app/db/base.py index 58286541..95f29bc9 100644 --- a/backend/app/db/base.py +++ b/backend/app/db/base.py @@ -37,6 +37,9 @@ from app.models.study_setup_config import StudySetupConfig # noqa: F401 from app.models.study_setup_config_version import StudySetupConfigVersion # noqa: F401 from app.models.study_monitoring_strategy import StudyMonitoringStrategy # noqa: F401 from app.models.study_center_confirm import StudyCenterConfirm # noqa: F401 +from app.models.api_endpoint_permission import ApiEndpointPermission # noqa: F401 +from app.models.api_endpoint_registry import ApiEndpointRegistry # noqa: F401 from app.models.permission_access_log import PermissionAccessLog # noqa: F401 from app.models.permission_metric_snapshot import PermissionMetricSnapshot # noqa: F401 +from app.models.permission_template import PermissionTemplate, PermissionTemplateVersion # noqa: F401 from app.models.security_access_log import SecurityAccessLog # noqa: F401 diff --git a/backend/app/main.py b/backend/app/main.py index 2f0cfaed..57fcd1bc 100644 --- a/backend/app/main.py +++ b/backend/app/main.py @@ -40,9 +40,6 @@ async def lifespan(_: FastAPI): aggregator_task = asyncio.create_task(run_hourly_metric_aggregation(stop_event)) await start_log_writer() await start_security_log_writer() - # Ensure models are imported so metadata is populated - from app.models import user as user_model # noqa: F401 - if settings.ENV == "development": async with engine.begin() as conn: await _ensure_legacy_primary_keys(conn) diff --git a/backend/app/models/api_endpoint_permission.py b/backend/app/models/api_endpoint_permission.py index 11291d6c..336b73cc 100644 --- a/backend/app/models/api_endpoint_permission.py +++ b/backend/app/models/api_endpoint_permission.py @@ -1,5 +1,4 @@ from __future__ import annotations -from typing import Optional import uuid from datetime import datetime diff --git a/backend/app/models/api_endpoint_registry.py b/backend/app/models/api_endpoint_registry.py index ec2a0f18..f0013617 100644 --- a/backend/app/models/api_endpoint_registry.py +++ b/backend/app/models/api_endpoint_registry.py @@ -1,5 +1,4 @@ from __future__ import annotations -from typing import Optional import uuid from datetime import datetime diff --git a/backend/scripts/smoke_setup_config.py b/backend/scripts/smoke_setup_config.py index 0254d1ec..6c0c45c2 100644 --- a/backend/scripts/smoke_setup_config.py +++ b/backend/scripts/smoke_setup_config.py @@ -13,7 +13,7 @@ from cryptography.hazmat.primitives.ciphers.aead import AESGCM BASE = os.getenv("BASE_URL", "http://localhost:8000") -ADMIN_EMAIL = os.getenv("EMAIL", "admin@example.com") +ADMIN_EMAIL = os.getenv("EMAIL", "admin@huapont.cn") ADMIN_PASSWORD = os.getenv("PASSWORD", "admin123") STUDY_ID = os.getenv("STUDY_ID", "").strip() DATABASE_URL = (os.getenv("DATABASE_URL") or "postgresql://ctms_user:secret_password@db/ctms_db").replace("+asyncpg", "") diff --git a/backend/tests/test_app_startup.py b/backend/tests/test_app_startup.py index f0482678..e43a35e8 100644 --- a/backend/tests/test_app_startup.py +++ b/backend/tests/test_app_startup.py @@ -1,4 +1,8 @@ from contextlib import asynccontextmanager +import os +from pathlib import Path +import subprocess +import sys from unittest.mock import AsyncMock import pytest @@ -7,6 +11,41 @@ from fastapi import FastAPI from app import main +def test_db_base_registers_permission_models_for_create_all(): + backend_dir = Path(__file__).resolve().parents[1] + code = """ +from app.db.base_class import Base +import app.db.base + +required_tables = { + "api_endpoint_permissions", + "api_endpoint_registries", + "permission_templates", + "permission_template_versions", +} +missing = sorted(required_tables - set(Base.metadata.tables)) +if missing: + print(",".join(missing)) + raise SystemExit(1) +""" + env = { + **os.environ, + "PYTHONDONTWRITEBYTECODE": "1", + "PYTHONPATH": str(backend_dir), + } + + result = subprocess.run( + [sys.executable, "-c", code], + cwd=backend_dir, + env=env, + capture_output=True, + text=True, + check=False, + ) + + assert result.returncode == 0, result.stdout + result.stderr + + class _DummyTask: def __init__(self): self.awaited = False diff --git a/docs/guides/setup-config-api.md b/docs/guides/setup-config-api.md index 5ec66047..08c51fe4 100644 --- a/docs/guides/setup-config-api.md +++ b/docs/guides/setup-config-api.md @@ -195,7 +195,7 @@ Content-Type: multipart/form-data ```bash chmod +x docs/setup-config-curl-smoke.sh BASE_URL=http://localhost:8888 \ -EMAIL=admin@example.com \ +EMAIL=admin@huapont.cn \ PASSWORD=admin123 \ STUDY_ID=aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa \ bash docs/setup-config-curl-smoke.sh diff --git a/docs/postman/local.postman_environment.example.json b/docs/postman/local.postman_environment.example.json index c68bb7ef..03dc8bb3 100644 --- a/docs/postman/local.postman_environment.example.json +++ b/docs/postman/local.postman_environment.example.json @@ -2,7 +2,7 @@ "name": "CTMS Local Example", "values": [ { "key": "base_url", "value": "http://localhost:8888", "type": "default", "enabled": true }, - { "key": "email", "value": "admin@example.com", "type": "default", "enabled": true }, + { "key": "email", "value": "admin@huapont.cn", "type": "default", "enabled": true }, { "key": "password", "value": "admin123", "type": "default", "enabled": true }, { "key": "study_id", "value": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa", "type": "default", "enabled": true }, { "key": "token", "value": "", "type": "default", "enabled": true }, diff --git a/docs/postman/setup-config.postman_collection.json b/docs/postman/setup-config.postman_collection.json index 07f9e509..9397b925 100644 --- a/docs/postman/setup-config.postman_collection.json +++ b/docs/postman/setup-config.postman_collection.json @@ -218,7 +218,7 @@ ], "variable": [ { "key": "base_url", "value": "http://localhost:8888" }, - { "key": "email", "value": "admin@example.com" }, + { "key": "email", "value": "admin@huapont.cn" }, { "key": "password", "value": "admin123" }, { "key": "study_id", "value": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa" }, { "key": "token", "value": "" }, diff --git a/docs/setup-config-curl-smoke.sh b/docs/setup-config-curl-smoke.sh index bf85e409..1176bd5c 100755 --- a/docs/setup-config-curl-smoke.sh +++ b/docs/setup-config-curl-smoke.sh @@ -2,7 +2,7 @@ set -euo pipefail BASE_URL="${BASE_URL:-http://localhost:8888}" -EMAIL="${EMAIL:-admin@example.com}" +EMAIL="${EMAIL:-admin@huapont.cn}" PASSWORD="${PASSWORD:-admin123}" STUDY_ID="${STUDY_ID:-aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa}"