diff --git a/k8s/railiance/bootstrap-job.yaml b/k8s/railiance/bootstrap-job.yaml
index aef4999..487763d 100644
--- a/k8s/railiance/bootstrap-job.yaml
+++ b/k8s/railiance/bootstrap-job.yaml
@@ -30,7 +30,7 @@ spec:
fsGroup: 10001
containers:
- name: bootstrap
- image: forgejo.coulomb.social/coulomb/target-revenue:0.1.3
+ image: forgejo.coulomb.social/coulomb/target-revenue:0.1.4
imagePullPolicy: IfNotPresent
env:
- name: TRF_BOOTSTRAP_BINKY
diff --git a/k8s/railiance/deployment.yaml b/k8s/railiance/deployment.yaml
index 7c37cab..1c9d8c7 100644
--- a/k8s/railiance/deployment.yaml
+++ b/k8s/railiance/deployment.yaml
@@ -25,7 +25,7 @@ spec:
fsGroup: 10001
containers:
- name: target-revenue
- image: forgejo.coulomb.social/coulomb/target-revenue:0.1.3
+ image: forgejo.coulomb.social/coulomb/target-revenue:0.1.4
imagePullPolicy: IfNotPresent
ports:
- name: http
diff --git a/k8s/railiance/migrate-job.yaml b/k8s/railiance/migrate-job.yaml
index ff8f1c1..8bbdc12 100644
--- a/k8s/railiance/migrate-job.yaml
+++ b/k8s/railiance/migrate-job.yaml
@@ -28,7 +28,7 @@ spec:
fsGroup: 10001
containers:
- name: migrate
- image: forgejo.coulomb.social/coulomb/target-revenue:0.1.3
+ image: forgejo.coulomb.social/coulomb/target-revenue:0.1.4
imagePullPolicy: IfNotPresent
env:
- name: TRF_RUN_MIGRATIONS
diff --git a/src/target_revenue/service/control_plane_app.py b/src/target_revenue/service/control_plane_app.py
index 2063317..a4cd4b6 100644
--- a/src/target_revenue/service/control_plane_app.py
+++ b/src/target_revenue/service/control_plane_app.py
@@ -26,7 +26,7 @@ from psycopg_pool import ConnectionPool
from starlette.middleware.sessions import SessionMiddleware
from .. import breach_record, control_plane, ledger, metrics, registry
-from . import keys, reference_docs
+from . import guidance, keys, reference_docs
_STATIC_DIR = os.path.join(os.path.dirname(__file__), "static")
_TEMPLATES_DIR = os.path.join(os.path.dirname(__file__), "control_plane_templates")
@@ -201,8 +201,27 @@ def dashboard(
conn: Connection = Depends(get_connection),
):
phases = registry.list_phase_manifests_for_licensor(conn, licensor.licensor_id)
+ pending = 0
+ if registry.has_right(licensor.rights, "operator"):
+ pending = len(control_plane.list_proposed_entries(conn, status="pending"))
+ first_id = phases[0]["phase"]["id"] if phases else None
+ next_steps = guidance.dashboard_guidance(
+ rights=licensor.rights,
+ phase_count=len(phases),
+ pending_proposals=pending,
+ root_path=_root_path(request),
+ first_phase_id=first_id,
+ )
return templates.TemplateResponse(
- request, "dashboard.html", _template_context(request, licensor, phases=phases)
+ request,
+ "dashboard.html",
+ _template_context(
+ request,
+ licensor,
+ phases=phases,
+ next_steps=next_steps,
+ pending_proposals=pending,
+ ),
)
@@ -291,6 +310,27 @@ def phase_detail(
phase_attestation = control_plane.get_or_publish_attestation(
conn, phase_id, signing_key
)
+ extension_count = len(registry.list_extensions(conn))
+ pending_for_phase = 0
+ if registry.has_right(licensor.rights, "operator"):
+ pending_for_phase = len(
+ control_plane.list_proposed_entries(conn, phase_id=phase_id, status="pending")
+ )
+ next_steps = guidance.phase_guidance(
+ rights=licensor.rights,
+ root_path=_root_path(request),
+ phase_id=phase_id,
+ metrics=computed_metrics,
+ ledger_len=len(entries),
+ extension_count=extension_count,
+ has_attestation=phase_attestation is not None,
+ pending_proposals_for_phase=pending_for_phase,
+ )
+ checklist = guidance.phase_lifecycle_checklist(
+ ledger_len=len(entries),
+ metrics=computed_metrics,
+ has_attestation=phase_attestation is not None,
+ )
return templates.TemplateResponse(
request,
"phase_detail.html",
@@ -302,6 +342,8 @@ def phase_detail(
metrics=computed_metrics,
breaches=breaches,
attestation=phase_attestation,
+ next_steps=next_steps,
+ checklist=checklist,
),
)
diff --git a/src/target_revenue/service/control_plane_templates/base.html b/src/target_revenue/service/control_plane_templates/base.html
index 46ce3ba..6abb182 100644
--- a/src/target_revenue/service/control_plane_templates/base.html
+++ b/src/target_revenue/service/control_plane_templates/base.html
@@ -13,6 +13,7 @@
}
+