Sync GovOPlaN module state

This commit is contained in:
2026-07-10 21:57:21 +02:00
parent 30a0281c66
commit f362f3806b
6 changed files with 340 additions and 0 deletions

View File

@@ -465,6 +465,8 @@ def _catalog_plan_item(module_id: str) -> tuple[ModuleInstallPlanItem, dict[str,
return ModuleInstallPlanItem(
module_id=str(raw_item["module_id"]),
action="install",
source="catalog",
catalog=_catalog_plan_metadata(result),
python_package=raw_item.get("python_package") if isinstance(raw_item.get("python_package"), str) else None,
python_ref=raw_item.get("python_ref") if isinstance(raw_item.get("python_ref"), str) else None,
webui_package=raw_item.get("webui_package") if isinstance(raw_item.get("webui_package"), str) else None,
@@ -474,6 +476,28 @@ def _catalog_plan_item(module_id: str) -> tuple[ModuleInstallPlanItem, dict[str,
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail=f"Catalog install entry not found: {module_id}")
def _catalog_plan_metadata(validation: dict[str, object]) -> dict[str, object]:
metadata: dict[str, object] = {
"source": validation.get("source") or validation.get("path"),
"source_type": validation.get("source_type"),
"cache_used": bool(validation.get("cache_used")),
"cache_path": validation.get("cache_path"),
"channel": validation.get("channel"),
"sequence": validation.get("sequence"),
"generated_at": validation.get("generated_at"),
"not_before": validation.get("not_before"),
"expires_at": validation.get("expires_at"),
"signed": bool(validation.get("signed")),
"trusted": bool(validation.get("trusted")),
"key_id": validation.get("key_id"),
}
return {
key: value
for key, value in metadata.items()
if value is not None and value != ""
}
def _catalog_license_features(raw_item: dict[str, object]) -> list[str]:
value = raw_item.get("license_features")
if not isinstance(value, list):

View File

@@ -176,6 +176,8 @@ class ModuleInstallPlanItem(BaseModel):
module_id: str = Field(min_length=1, max_length=120)
action: Literal["install", "uninstall"]
source: Literal["manual", "catalog"] = "manual"
catalog: dict[str, Any] | None = None
python_package: str | None = Field(default=None, max_length=200)
python_ref: str | None = Field(default=None, max_length=1000)
webui_package: str | None = Field(default=None, max_length=200)
@@ -308,6 +310,18 @@ class ModuleInstallerRequestCreateRequest(BaseModel):
options: ModuleInstallerRequestOptions = Field(default_factory=ModuleInstallerRequestOptions)
class ModuleInterfaceProviderItem(BaseModel):
name: str
version: str
class ModuleInterfaceRequirementItem(BaseModel):
name: str
version_min: str | None = None
version_max_exclusive: str | None = None
optional: bool = False
class ModulePackageCatalogItem(BaseModel):
module_id: str
name: str
@@ -318,6 +332,8 @@ class ModulePackageCatalogItem(BaseModel):
python_ref: str | None = None
webui_package: str | None = None
webui_ref: str | None = None
provides_interfaces: list[ModuleInterfaceProviderItem] = Field(default_factory=list)
requires_interfaces: list[ModuleInterfaceRequirementItem] = Field(default_factory=list)
license_features: list[str] = Field(default_factory=list)
license_allowed: bool = True
license_enforced: bool = False