fix: expose market references in dashboard choices

parent a965a01e
...@@ -53,6 +53,29 @@ def _list_dashboard_market_references(db, user_id: int, reference_type: str) -> ...@@ -53,6 +53,29 @@ def _list_dashboard_market_references(db, user_id: int, reference_type: str) ->
return references return references
def _market_reference_provider_choice(reference: dict) -> dict:
return {
'provider_id': reference['id'],
'config': {
'type': reference.get('type') or reference.get('source_type') or 'market_reference',
'name': reference.get('name') or reference['id'],
'market_reference': True,
'read_only': True,
'models': [],
},
}
def _market_reference_rotation_choice(reference: dict) -> dict:
return {
'rotation_id': reference['id'],
'name': reference.get('name') or reference['id'],
'type': 'rotation',
'market_reference': True,
'read_only': True,
}
def _serialize_provider_usage_snapshot(snapshot): def _serialize_provider_usage_snapshot(snapshot):
if not snapshot: if not snapshot:
return None return None
...@@ -1226,8 +1249,10 @@ async def dashboard_rotations(request: Request): ...@@ -1226,8 +1249,10 @@ async def dashboard_rotations(request: Request):
# Database user: use ONLY their own providers # Database user: use ONLY their own providers
db = DatabaseRegistry.get_config_database() db = DatabaseRegistry.get_config_database()
user_providers = db.get_user_providers(current_user_id) user_providers = db.get_user_providers(current_user_id)
available_providers = [p['provider_id'] for p in user_providers] provider_references = _list_dashboard_market_references(db, current_user_id, 'provider')
providers_meta = {p['provider_id']: {"type": p['config'].get('type', 'openai')} for p in user_providers} available_provider_rows = user_providers + [_market_reference_provider_choice(reference) for reference in provider_references]
available_providers = [p['provider_id'] for p in available_provider_rows]
providers_meta = {p['provider_id']: {"type": p['config'].get('type', 'openai')} for p in available_provider_rows}
# Check for success parameter # Check for success parameter
success = request.query_params.get('success') success = request.query_params.get('success')
...@@ -1502,18 +1527,24 @@ async def dashboard_autoselect(request: Request): ...@@ -1502,18 +1527,24 @@ async def dashboard_autoselect(request: Request):
# Get only user's own rotations # Get only user's own rotations
user_rotations = db.get_user_rotations(current_user_id) user_rotations = db.get_user_rotations(current_user_id)
available_rotations = [rot['rotation_id'] for rot in user_rotations] rotation_references = _list_dashboard_market_references(db, current_user_id, 'rotation')
available_rotation_rows = user_rotations + [_market_reference_rotation_choice(reference) for reference in rotation_references]
available_rotations = [rot['rotation_id'] if 'rotation_id' in rot else rot['id'] for rot in available_rotation_rows]
# Get only user's own providers # Get only user's own providers
user_providers = db.get_user_providers(current_user_id) user_providers = db.get_user_providers(current_user_id)
provider_references = _list_dashboard_market_references(db, current_user_id, 'provider')
available_provider_rows = user_providers + [_market_reference_provider_choice(reference) for reference in provider_references]
available_models = [] available_models = []
user_providers_meta = {p['provider_id']: {"type": p['config'].get('type', 'openai')} for p in user_providers} user_providers_meta = {p['provider_id']: {"type": p['config'].get('type', 'openai')} for p in available_provider_rows}
# Add user rotation IDs # Add user rotation IDs
for rotation_id in available_rotations: for rotation in available_rotation_rows:
rotation_id = rotation['rotation_id'] if 'rotation_id' in rotation else rotation['id']
rotation_name = rotation.get('name') or rotation_id
available_models.append({ available_models.append({
'id': rotation_id, 'id': rotation_id,
'name': f'{rotation_id} (rotation)', 'name': f'{rotation_name} (rotation)',
'type': 'rotation' 'type': 'rotation'
}) })
......
...@@ -398,6 +398,27 @@ def test_dashboard_rotations_renders_market_reference_alongside_local_rotation(m ...@@ -398,6 +398,27 @@ def test_dashboard_rotations_renders_market_reference_alongside_local_rotation(m
assert 'copyRotation(\'market-ref:2\')' not in response.text assert 'copyRotation(\'market-ref:2\')' not in response.text
def test_dashboard_rotations_offers_market_provider_reference_in_provider_choices(monkeypatch):
db = MarketReferenceImportDbStub()
_seed_dashboard_market_reference_mix(db)
capture = TemplateCapture()
client = TestClient(app)
_login_as_user(client)
monkeypatch.setattr(dashboard_market, "DatabaseRegistry", RegistryStub(db))
from aisbf.routes.dashboard import providers as dashboard_providers
monkeypatch.setattr(dashboard_providers, "DatabaseRegistry", RegistryStub(db))
monkeypatch.setattr(dashboard_providers, "_templates", capture)
response = client.get("/dashboard/rotations")
assert response.status_code == 200
context = capture.calls[-1]["context"]
available_providers = json.loads(context["available_providers"])
assert "local-provider" in available_providers
assert "market-ref:1" in available_providers
def test_dashboard_autoselect_renders_market_reference_alongside_local_entry(monkeypatch): def test_dashboard_autoselect_renders_market_reference_alongside_local_entry(monkeypatch):
db = MarketReferenceImportDbStub() db = MarketReferenceImportDbStub()
_seed_dashboard_market_reference_mix(db) _seed_dashboard_market_reference_mix(db)
...@@ -420,6 +441,29 @@ def test_dashboard_autoselect_renders_market_reference_alongside_local_entry(mon ...@@ -420,6 +441,29 @@ def test_dashboard_autoselect_renders_market_reference_alongside_local_entry(mon
assert 'copyAutoselect(\'market-ref:3\')' not in response.text assert 'copyAutoselect(\'market-ref:3\')' not in response.text
def test_dashboard_autoselect_offers_market_rotation_reference_in_rotation_choices(monkeypatch):
db = MarketReferenceImportDbStub()
_seed_dashboard_market_reference_mix(db)
capture = TemplateCapture()
client = TestClient(app)
_login_as_user(client)
monkeypatch.setattr(dashboard_market, "DatabaseRegistry", RegistryStub(db))
from aisbf.routes.dashboard import providers as dashboard_providers
monkeypatch.setattr(dashboard_providers, "DatabaseRegistry", RegistryStub(db))
monkeypatch.setattr(dashboard_providers, "_templates", capture)
response = client.get("/dashboard/autoselect")
assert response.status_code == 200
context = capture.calls[-1]["context"]
available_rotations = json.loads(context["available_rotations"])
available_models = json.loads(context["available_models"])
assert "local-rotation" in available_rotations
assert "market-ref:2" in available_rotations
assert {"id": "market-ref:2", "name": "Alice Rotation (rotation)", "type": "rotation"} in available_models
def test_import_market_listing_creates_market_reference_for_provider(monkeypatch): def test_import_market_listing_creates_market_reference_for_provider(monkeypatch):
db = MarketReferenceImportDbStub() db = MarketReferenceImportDbStub()
client = TestClient(app) client = TestClient(app)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment