feat: add version history section to test edit page
- GET /api/tests/{id}/versions — returns full version chain from oldest to newest
- TestEdit: shows 'История версий' table when multiple versions exist,
current version highlighted, links to navigate between versions
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -80,6 +80,44 @@ async def create_test(data: TestCreate, db: AsyncSession = Depends(get_db)):
|
||||
return result.scalar_one()
|
||||
|
||||
|
||||
@router.get("/{test_id}/versions", response_model=list[TestListItem])
|
||||
async def get_test_versions(test_id: int, db: AsyncSession = Depends(get_db)):
|
||||
"""Возвращает все версии теста (от первой к последней)."""
|
||||
# Загружаем текущий тест
|
||||
result = await db.execute(select(Test).where(Test.id == test_id))
|
||||
test = result.scalar_one_or_none()
|
||||
if not test:
|
||||
raise HTTPException(status_code=404, detail="Тест не найден")
|
||||
|
||||
# Идём вверх до корневой версии
|
||||
root = test
|
||||
while root.parent_id is not None:
|
||||
result = await db.execute(select(Test).where(Test.id == root.parent_id))
|
||||
root = result.scalar_one()
|
||||
|
||||
# Идём вниз от корня, собирая цепочку
|
||||
versions: list[Test] = []
|
||||
current = root
|
||||
while current is not None:
|
||||
result = await db.execute(
|
||||
select(Test)
|
||||
.options(selectinload(Test.questions))
|
||||
.where(Test.id == current.id)
|
||||
)
|
||||
current_with_qs = result.scalar_one()
|
||||
versions.append(current_with_qs)
|
||||
|
||||
result = await db.execute(select(Test).where(Test.parent_id == current.id))
|
||||
current = result.scalar_one_or_none()
|
||||
|
||||
items = []
|
||||
for v in versions:
|
||||
item = TestListItem.model_validate(v)
|
||||
item.questions_count = len(v.questions)
|
||||
items.append(item)
|
||||
return items
|
||||
|
||||
|
||||
@router.put("/{test_id}", response_model=TestUpdateResponse)
|
||||
async def update_test(test_id: int, data: TestCreate, db: AsyncSession = Depends(get_db)):
|
||||
result = await db.execute(
|
||||
|
||||
Reference in New Issue
Block a user