generated from coulomb/repo-seed
candidates can now be edited before approval
This commit is contained in:
@@ -330,13 +330,72 @@ def reject_candidate_ability_from_form(
|
||||
)
|
||||
|
||||
|
||||
@router.post(
|
||||
"/ui/repos/{repository_id}/analysis-runs/{analysis_run_id}"
|
||||
"/candidate-abilities/{candidate_ability_id}/edit"
|
||||
)
|
||||
def edit_candidate_ability_from_form(
|
||||
repository_id: int,
|
||||
analysis_run_id: int,
|
||||
candidate_ability_id: int,
|
||||
name: str = Form(...),
|
||||
description: str = Form(""),
|
||||
confidence: float = Form(...),
|
||||
service: RegistryService = Depends(get_service),
|
||||
) -> RedirectResponse:
|
||||
service.edit_candidate_ability(
|
||||
repository_id,
|
||||
analysis_run_id,
|
||||
candidate_ability_id,
|
||||
name=name,
|
||||
description=description,
|
||||
confidence=confidence,
|
||||
notes="Edited from web UI",
|
||||
)
|
||||
return RedirectResponse(
|
||||
f"/ui/repos/{repository_id}/analysis-runs/{analysis_run_id}",
|
||||
status_code=303,
|
||||
)
|
||||
|
||||
|
||||
@router.post(
|
||||
"/ui/repos/{repository_id}/analysis-runs/{analysis_run_id}"
|
||||
"/candidate-capabilities/{candidate_capability_id}/edit"
|
||||
)
|
||||
def edit_candidate_capability_from_form(
|
||||
repository_id: int,
|
||||
analysis_run_id: int,
|
||||
candidate_capability_id: int,
|
||||
name: str = Form(...),
|
||||
description: str = Form(""),
|
||||
confidence: float = Form(...),
|
||||
service: RegistryService = Depends(get_service),
|
||||
) -> RedirectResponse:
|
||||
service.edit_candidate_capability(
|
||||
repository_id,
|
||||
analysis_run_id,
|
||||
candidate_capability_id,
|
||||
name=name,
|
||||
description=description,
|
||||
confidence=confidence,
|
||||
notes="Edited from web UI",
|
||||
)
|
||||
return RedirectResponse(
|
||||
f"/ui/repos/{repository_id}/analysis-runs/{analysis_run_id}",
|
||||
status_code=303,
|
||||
)
|
||||
|
||||
|
||||
def render_candidate_graph(graph: dict, repository_id: int, analysis_run_id: int) -> str:
|
||||
abilities = graph.get("abilities", [])
|
||||
if not abilities:
|
||||
return '<p class="muted">No candidates generated.</p>'
|
||||
items = []
|
||||
for ability in abilities:
|
||||
capabilities = "".join(render_candidate_capability(capability) for capability in ability["capabilities"])
|
||||
capabilities = "".join(
|
||||
render_candidate_capability(capability, repository_id, analysis_run_id)
|
||||
for capability in ability["capabilities"]
|
||||
)
|
||||
items.append(
|
||||
f"""
|
||||
<li>
|
||||
@@ -345,6 +404,7 @@ def render_candidate_graph(graph: dict, repository_id: int, analysis_run_id: int
|
||||
<span class="pill">{ability['confidence']:.2f}</span>
|
||||
{render_candidate_ability_actions(ability, repository_id, analysis_run_id)}
|
||||
<p class="muted">{escape(ability['description'])}</p>
|
||||
{render_candidate_edit_form('candidate-abilities', ability, repository_id, analysis_run_id)}
|
||||
{render_sources(ability['source_refs'])}
|
||||
<ul>{capabilities}</ul>
|
||||
</li>
|
||||
@@ -371,7 +431,34 @@ def render_candidate_ability_actions(
|
||||
"""
|
||||
|
||||
|
||||
def render_candidate_capability(capability: dict) -> str:
|
||||
def render_candidate_edit_form(
|
||||
collection: str,
|
||||
candidate: dict,
|
||||
repository_id: int,
|
||||
analysis_run_id: int,
|
||||
) -> str:
|
||||
if candidate["status"] != "candidate":
|
||||
return ""
|
||||
action = (
|
||||
f"/ui/repos/{repository_id}/analysis-runs/{analysis_run_id}"
|
||||
f"/{collection}/{candidate['id']}/edit"
|
||||
)
|
||||
confidence = f"{candidate['confidence']:.2f}"
|
||||
return f"""
|
||||
<form class="stack" method="post" action="{action}">
|
||||
<label>Name <input name="name" value="{escape(candidate['name'])}" required></label>
|
||||
<label>Description <textarea name="description" rows="2">{escape(candidate['description'])}</textarea></label>
|
||||
<label>Confidence <input name="confidence" type="number" min="0" max="1" step="0.01" value="{confidence}" required></label>
|
||||
<button class="secondary" type="submit">Save Edit</button>
|
||||
</form>
|
||||
"""
|
||||
|
||||
|
||||
def render_candidate_capability(
|
||||
capability: dict,
|
||||
repository_id: int,
|
||||
analysis_run_id: int,
|
||||
) -> str:
|
||||
features = "".join(
|
||||
f'<li>{escape(feature["name"])} <span class="pill">{escape(feature["type"])}</span> <span class="source">{escape(feature["location"])}</span></li>'
|
||||
for feature in capability["features"]
|
||||
@@ -386,6 +473,7 @@ def render_candidate_capability(capability: dict) -> str:
|
||||
<span class="pill">{escape(capability['status'])}</span>
|
||||
<span class="pill">{capability['confidence']:.2f}</span>
|
||||
<p class="muted">{escape(capability['description'])}</p>
|
||||
{render_candidate_edit_form('candidate-capabilities', capability, repository_id, analysis_run_id)}
|
||||
{render_sources(capability['source_refs'])}
|
||||
<h3>Features</h3>
|
||||
<ul>{features or '<li class="muted">No feature candidates.</li>'}</ul>
|
||||
|
||||
Reference in New Issue
Block a user