chore: clean legacy setup artifacts
This commit is contained in:
@@ -48,7 +48,7 @@
|
|||||||
- 文档入口见 `docs/README.md`;当前约束集中在分支治理、发布清单和治理审计文档,操作手册集中在 `docs/guides/`,历史交付记录集中在 `docs/reports/` 与 `docs/plans/`。
|
- 文档入口见 `docs/README.md`;当前约束集中在分支治理、发布清单和治理审计文档,操作手册集中在 `docs/guides/`,历史交付记录集中在 `docs/reports/` 与 `docs/plans/`。
|
||||||
|
|
||||||
## 常用流程
|
## 常用流程
|
||||||
1. 用管理员账号登录前端(默认 `admin@example.com / admin123`)。
|
1. 用管理员账号登录前端(默认 `admin@huapont.cn / admin123`)。
|
||||||
2. 进入左侧导航「账号治理」「项目治理」进行用户、项目、中心等全局管理;或在“项目列表”选择项目后进入项目内工作区。
|
2. 进入左侧导航「账号治理」「项目治理」进行用户、项目、中心等全局管理;或在“项目列表”选择项目后进入项目内工作区。
|
||||||
3. Dashboard 查看进度、待办;左侧导航进入“里程碑”“任务”等页面。
|
3. Dashboard 查看进度、待办;左侧导航进入“里程碑”“任务”等页面。
|
||||||
4. 退出登录或切换项目可通过顶部右侧下拉。
|
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_setup_config_version import StudySetupConfigVersion # noqa: F401
|
||||||
from app.models.study_monitoring_strategy import StudyMonitoringStrategy # 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.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_access_log import PermissionAccessLog # noqa: F401
|
||||||
from app.models.permission_metric_snapshot import PermissionMetricSnapshot # 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
|
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))
|
aggregator_task = asyncio.create_task(run_hourly_metric_aggregation(stop_event))
|
||||||
await start_log_writer()
|
await start_log_writer()
|
||||||
await start_security_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":
|
if settings.ENV == "development":
|
||||||
async with engine.begin() as conn:
|
async with engine.begin() as conn:
|
||||||
await _ensure_legacy_primary_keys(conn)
|
await _ensure_legacy_primary_keys(conn)
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
from typing import Optional
|
|
||||||
|
|
||||||
import uuid
|
import uuid
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
from typing import Optional
|
|
||||||
|
|
||||||
import uuid
|
import uuid
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ from cryptography.hazmat.primitives.ciphers.aead import AESGCM
|
|||||||
|
|
||||||
|
|
||||||
BASE = os.getenv("BASE_URL", "http://localhost:8000")
|
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")
|
ADMIN_PASSWORD = os.getenv("PASSWORD", "admin123")
|
||||||
STUDY_ID = os.getenv("STUDY_ID", "").strip()
|
STUDY_ID = os.getenv("STUDY_ID", "").strip()
|
||||||
DATABASE_URL = (os.getenv("DATABASE_URL") or "postgresql://ctms_user:secret_password@db/ctms_db").replace("+asyncpg", "")
|
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
|
from contextlib import asynccontextmanager
|
||||||
|
import os
|
||||||
|
from pathlib import Path
|
||||||
|
import subprocess
|
||||||
|
import sys
|
||||||
from unittest.mock import AsyncMock
|
from unittest.mock import AsyncMock
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
@@ -7,6 +11,41 @@ from fastapi import FastAPI
|
|||||||
from app import main
|
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:
|
class _DummyTask:
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.awaited = False
|
self.awaited = False
|
||||||
|
|||||||
@@ -195,7 +195,7 @@ Content-Type: multipart/form-data
|
|||||||
```bash
|
```bash
|
||||||
chmod +x docs/setup-config-curl-smoke.sh
|
chmod +x docs/setup-config-curl-smoke.sh
|
||||||
BASE_URL=http://localhost:8888 \
|
BASE_URL=http://localhost:8888 \
|
||||||
EMAIL=admin@example.com \
|
EMAIL=admin@huapont.cn \
|
||||||
PASSWORD=admin123 \
|
PASSWORD=admin123 \
|
||||||
STUDY_ID=aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa \
|
STUDY_ID=aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa \
|
||||||
bash docs/setup-config-curl-smoke.sh
|
bash docs/setup-config-curl-smoke.sh
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
"name": "CTMS Local Example",
|
"name": "CTMS Local Example",
|
||||||
"values": [
|
"values": [
|
||||||
{ "key": "base_url", "value": "http://localhost:8888", "type": "default", "enabled": true },
|
{ "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": "password", "value": "admin123", "type": "default", "enabled": true },
|
||||||
{ "key": "study_id", "value": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa", "type": "default", "enabled": true },
|
{ "key": "study_id", "value": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa", "type": "default", "enabled": true },
|
||||||
{ "key": "token", "value": "", "type": "default", "enabled": true },
|
{ "key": "token", "value": "", "type": "default", "enabled": true },
|
||||||
|
|||||||
@@ -218,7 +218,7 @@
|
|||||||
],
|
],
|
||||||
"variable": [
|
"variable": [
|
||||||
{ "key": "base_url", "value": "http://localhost:8888" },
|
{ "key": "base_url", "value": "http://localhost:8888" },
|
||||||
{ "key": "email", "value": "admin@example.com" },
|
{ "key": "email", "value": "admin@huapont.cn" },
|
||||||
{ "key": "password", "value": "admin123" },
|
{ "key": "password", "value": "admin123" },
|
||||||
{ "key": "study_id", "value": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa" },
|
{ "key": "study_id", "value": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa" },
|
||||||
{ "key": "token", "value": "" },
|
{ "key": "token", "value": "" },
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
|
|
||||||
BASE_URL="${BASE_URL:-http://localhost:8888}"
|
BASE_URL="${BASE_URL:-http://localhost:8888}"
|
||||||
EMAIL="${EMAIL:-admin@example.com}"
|
EMAIL="${EMAIL:-admin@huapont.cn}"
|
||||||
PASSWORD="${PASSWORD:-admin123}"
|
PASSWORD="${PASSWORD:-admin123}"
|
||||||
STUDY_ID="${STUDY_ID:-aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa}"
|
STUDY_ID="${STUDY_ID:-aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa}"
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user