chore: clean legacy setup artifacts
This commit is contained in:
@@ -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. 退出登录或切换项目可通过顶部右侧下拉。
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
from __future__ import annotations
|
||||
from typing import Optional
|
||||
|
||||
import uuid
|
||||
from datetime import datetime
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
from __future__ import annotations
|
||||
from typing import Optional
|
||||
|
||||
import uuid
|
||||
from datetime import datetime
|
||||
|
||||
@@ -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", "")
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 },
|
||||
|
||||
@@ -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": "" },
|
||||
|
||||
@@ -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}"
|
||||
|
||||
|
||||
Reference in New Issue
Block a user