46 lines
1.5 KiB
Python
46 lines
1.5 KiB
Python
from __future__ import annotations
|
|
|
|
from fastapi import HTTPException, status
|
|
|
|
from app.repositories.scheme_versions import list_scheme_versions
|
|
|
|
|
|
async def select_baseline_scheme_version(
|
|
*,
|
|
scheme_id: str,
|
|
draft_scheme_version_id: str,
|
|
override_scheme_version_id: str | None = None,
|
|
):
|
|
versions = await list_scheme_versions(scheme_id=scheme_id, limit=200, offset=0)
|
|
|
|
if override_scheme_version_id:
|
|
for row in versions:
|
|
if row.scheme_version_id == override_scheme_version_id:
|
|
if row.scheme_version_id == draft_scheme_version_id:
|
|
raise HTTPException(
|
|
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
|
|
detail="Baseline override must differ from current draft scheme version",
|
|
)
|
|
return row, "override"
|
|
|
|
raise HTTPException(
|
|
status_code=status.HTTP_404_NOT_FOUND,
|
|
detail="Baseline override scheme version not found",
|
|
)
|
|
|
|
published_candidates = [
|
|
row for row in versions
|
|
if row.scheme_version_id != draft_scheme_version_id and row.status == "published"
|
|
]
|
|
if published_candidates:
|
|
return published_candidates[0], "published"
|
|
|
|
previous_candidates = [
|
|
row for row in versions
|
|
if row.scheme_version_id != draft_scheme_version_id
|
|
]
|
|
if previous_candidates:
|
|
return previous_candidates[0], "previous"
|
|
|
|
return None, "none"
|