From 040d446c7af96bf795877ba8ff3d7f44dcd74b45 Mon Sep 17 00:00:00 2001 From: Viacheslav Kukushkin Date: Thu, 11 Jul 2024 10:34:55 +0300 Subject: [PATCH 01/55] added fastapi as web ui backend --- cli/medperf/cli.py | 2 ++ cli/medperf/commands/list.py | 2 ++ cli/medperf/web_ui/__init__.py | 0 cli/medperf/web_ui/app.py | 22 ++++++++++++++ cli/medperf/web_ui/benchmarks/__init__.py | 0 cli/medperf/web_ui/datasets/__init__.py | 0 cli/medperf/web_ui/datasets/models.py | 0 cli/medperf/web_ui/datasets/routes.py | 34 ++++++++++++++++++++++ cli/medperf/web_ui/datasets/views.py | 0 cli/medperf/web_ui/models/__init__.py | 0 cli/medperf/web_ui/templates/datasets.html | 13 +++++++++ 11 files changed, 73 insertions(+) create mode 100644 cli/medperf/web_ui/__init__.py create mode 100644 cli/medperf/web_ui/app.py create mode 100644 cli/medperf/web_ui/benchmarks/__init__.py create mode 100644 cli/medperf/web_ui/datasets/__init__.py create mode 100644 cli/medperf/web_ui/datasets/models.py create mode 100644 cli/medperf/web_ui/datasets/routes.py create mode 100644 cli/medperf/web_ui/datasets/views.py create mode 100644 cli/medperf/web_ui/models/__init__.py create mode 100644 cli/medperf/web_ui/templates/datasets.html diff --git a/cli/medperf/cli.py b/cli/medperf/cli.py index 4fc7102c4..2a6508eb0 100644 --- a/cli/medperf/cli.py +++ b/cli/medperf/cli.py @@ -17,6 +17,7 @@ import medperf.commands.association.association as association import medperf.commands.compatibility_test.compatibility_test as compatibility_test import medperf.commands.storage as storage +import medperf.web_ui.app as web_ui from medperf.utils import check_for_updates from medperf.logging.utils import log_machine_details @@ -30,6 +31,7 @@ app.add_typer(compatibility_test.app, name="test", help="Manage compatibility tests") app.add_typer(auth.app, name="auth", help="Authentication") app.add_typer(storage.app, name="storage", help="Storage management") +app.add_typer(web_ui.app, name="web-ui", help="local web UI to manage medperf entities") @app.command("run") diff --git a/cli/medperf/commands/list.py b/cli/medperf/commands/list.py index 5fd462bf7..cd6c0f5ec 100644 --- a/cli/medperf/commands/list.py +++ b/cli/medperf/commands/list.py @@ -17,6 +17,8 @@ def run( """Lists all local datasets Args: + entity_class: entity class to instantiate (Dataset, Model, etc.) + fields (list[str]): list of fields to display local_only (bool, optional): Display all local results. Defaults to False. mine_only (bool, optional): Display all current-user results. Defaults to False. kwargs (dict): Additional parameters for filtering entity lists. diff --git a/cli/medperf/web_ui/__init__.py b/cli/medperf/web_ui/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/cli/medperf/web_ui/app.py b/cli/medperf/web_ui/app.py new file mode 100644 index 000000000..b5eed661a --- /dev/null +++ b/cli/medperf/web_ui/app.py @@ -0,0 +1,22 @@ +import typer +from fastapi import FastAPI + +from medperf import config +from medperf.decorators import clean_except +from medperf.web_ui.datasets.routes import router as datasets_router + +web_app = FastAPI() + +web_app.include_router(datasets_router, prefix="/datasets") + +app = typer.Typer() + + +@app.command("run") +@clean_except +def run( + port: int = typer.Option(8100, "--port", help="port to use"), +): + """Runs a local web UI""" + import uvicorn + uvicorn.run(web_app, host="127.0.0.1", port=port, log_level=config.loglevel) diff --git a/cli/medperf/web_ui/benchmarks/__init__.py b/cli/medperf/web_ui/benchmarks/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/cli/medperf/web_ui/datasets/__init__.py b/cli/medperf/web_ui/datasets/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/cli/medperf/web_ui/datasets/models.py b/cli/medperf/web_ui/datasets/models.py new file mode 100644 index 000000000..e69de29bb diff --git a/cli/medperf/web_ui/datasets/routes.py b/cli/medperf/web_ui/datasets/routes.py new file mode 100644 index 000000000..ce0621be8 --- /dev/null +++ b/cli/medperf/web_ui/datasets/routes.py @@ -0,0 +1,34 @@ +# ./cli/medperf/web-ui/datasets/routes.py + +from fastapi import APIRouter, HTTPException +from fastapi.responses import HTMLResponse +from typing import List +from fastapi import Request +from fastapi.templating import Jinja2Templates + +from medperf.account_management import get_medperf_user_data +from medperf.entities.dataset import Dataset + +router = APIRouter() + +templates = Jinja2Templates(directory="medperf/web_ui/templates") + + +@router.get("/", response_model=List[Dataset]) +def get_datasets(local_only: bool = False, mine_only: bool = False): + # try: + filters = {} + if mine_only: + filters["owner"] = get_medperf_user_data()["id"] + + return Dataset.all( + local_only=local_only, + filters=filters, + ) + # except Exception as e: + # raise HTTPException(status_code=500, detail=str(e)) + + +@router.get("/ui", response_class=HTMLResponse) +def datasets_ui(request: Request): + return templates.TemplateResponse("datasets.html", {"request": request}) diff --git a/cli/medperf/web_ui/datasets/views.py b/cli/medperf/web_ui/datasets/views.py new file mode 100644 index 000000000..e69de29bb diff --git a/cli/medperf/web_ui/models/__init__.py b/cli/medperf/web_ui/models/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/cli/medperf/web_ui/templates/datasets.html b/cli/medperf/web_ui/templates/datasets.html new file mode 100644 index 000000000..5e120af60 --- /dev/null +++ b/cli/medperf/web_ui/templates/datasets.html @@ -0,0 +1,13 @@ + + + + Datasets + + + +

Datasets

+
+ +
+ + From 97e6bd769a5a7d689b931b6f1675407a09a356c4 Mon Sep 17 00:00:00 2001 From: Viacheslav Kukushkin Date: Fri, 12 Jul 2024 18:20:19 +0300 Subject: [PATCH 02/55] Added cube + benchmark basic listing --- cli/medperf/web_ui/app.py | 4 +++ cli/medperf/web_ui/benchmarks/routes.py | 26 +++++++++++++++ cli/medperf/web_ui/datasets/models.py | 0 cli/medperf/web_ui/datasets/routes.py | 14 ++++---- cli/medperf/web_ui/datasets/views.py | 0 .../web_ui/{models => mlcubes}/__init__.py | 0 cli/medperf/web_ui/mlcubes/routes.py | 26 +++++++++++++++ cli/medperf/web_ui/templates/base.html | 12 +++++++ cli/medperf/web_ui/templates/benchmarks.html | 27 +++++++++++++++ cli/medperf/web_ui/templates/datasets.html | 33 ++++++++++++------- cli/medperf/web_ui/templates/mlcubes.html | 22 +++++++++++++ cli/requirements.txt | 2 ++ 12 files changed, 147 insertions(+), 19 deletions(-) create mode 100644 cli/medperf/web_ui/benchmarks/routes.py delete mode 100644 cli/medperf/web_ui/datasets/models.py delete mode 100644 cli/medperf/web_ui/datasets/views.py rename cli/medperf/web_ui/{models => mlcubes}/__init__.py (100%) create mode 100644 cli/medperf/web_ui/mlcubes/routes.py create mode 100644 cli/medperf/web_ui/templates/base.html create mode 100644 cli/medperf/web_ui/templates/benchmarks.html create mode 100644 cli/medperf/web_ui/templates/mlcubes.html diff --git a/cli/medperf/web_ui/app.py b/cli/medperf/web_ui/app.py index b5eed661a..6d7e0f187 100644 --- a/cli/medperf/web_ui/app.py +++ b/cli/medperf/web_ui/app.py @@ -4,10 +4,14 @@ from medperf import config from medperf.decorators import clean_except from medperf.web_ui.datasets.routes import router as datasets_router +from medperf.web_ui.benchmarks.routes import router as benchmarks_router +from medperf.web_ui.mlcubes.routes import router as mlcubes_router web_app = FastAPI() web_app.include_router(datasets_router, prefix="/datasets") +web_app.include_router(benchmarks_router, prefix="/benchmarks") +web_app.include_router(mlcubes_router, prefix="/mlcubes") app = typer.Typer() diff --git a/cli/medperf/web_ui/benchmarks/routes.py b/cli/medperf/web_ui/benchmarks/routes.py new file mode 100644 index 000000000..9b82efe13 --- /dev/null +++ b/cli/medperf/web_ui/benchmarks/routes.py @@ -0,0 +1,26 @@ +import logging + +from fastapi import APIRouter +from fastapi.responses import HTMLResponse +from fastapi import Request +from fastapi.templating import Jinja2Templates + +from medperf.entities.benchmark import Benchmark +from medperf.account_management import get_medperf_user_data + +router = APIRouter() +templates = Jinja2Templates(directory="medperf/web_ui/templates") +logger = logging.getLogger(__name__) + + +@router.get("/ui", response_class=HTMLResponse) +def benchmarks_ui(request: Request, local_only: bool = False, mine_only: bool = False): + filters = {} + if mine_only: + filters["owner"] = get_medperf_user_data()["id"] + + benchmarks = Benchmark.all( + local_only=local_only, + filters=filters, + ) + return templates.TemplateResponse("benchmarks.html", {"request": request, "benchmarks": benchmarks}) diff --git a/cli/medperf/web_ui/datasets/models.py b/cli/medperf/web_ui/datasets/models.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/cli/medperf/web_ui/datasets/routes.py b/cli/medperf/web_ui/datasets/routes.py index ce0621be8..12f16191a 100644 --- a/cli/medperf/web_ui/datasets/routes.py +++ b/cli/medperf/web_ui/datasets/routes.py @@ -1,6 +1,6 @@ -# ./cli/medperf/web-ui/datasets/routes.py +import logging -from fastapi import APIRouter, HTTPException +from fastapi import APIRouter from fastapi.responses import HTMLResponse from typing import List from fastapi import Request @@ -13,10 +13,11 @@ templates = Jinja2Templates(directory="medperf/web_ui/templates") +logger = logging.getLogger(__name__) + @router.get("/", response_model=List[Dataset]) def get_datasets(local_only: bool = False, mine_only: bool = False): - # try: filters = {} if mine_only: filters["owner"] = get_medperf_user_data()["id"] @@ -25,10 +26,9 @@ def get_datasets(local_only: bool = False, mine_only: bool = False): local_only=local_only, filters=filters, ) - # except Exception as e: - # raise HTTPException(status_code=500, detail=str(e)) @router.get("/ui", response_class=HTMLResponse) -def datasets_ui(request: Request): - return templates.TemplateResponse("datasets.html", {"request": request}) +def datasets_ui(request: Request, local_only: bool = False, mine_only: bool = False): + datasets = get_datasets(local_only, mine_only) + return templates.TemplateResponse("datasets.html", {"request": request, "datasets": datasets}) diff --git a/cli/medperf/web_ui/datasets/views.py b/cli/medperf/web_ui/datasets/views.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/cli/medperf/web_ui/models/__init__.py b/cli/medperf/web_ui/mlcubes/__init__.py similarity index 100% rename from cli/medperf/web_ui/models/__init__.py rename to cli/medperf/web_ui/mlcubes/__init__.py diff --git a/cli/medperf/web_ui/mlcubes/routes.py b/cli/medperf/web_ui/mlcubes/routes.py new file mode 100644 index 000000000..96250c99a --- /dev/null +++ b/cli/medperf/web_ui/mlcubes/routes.py @@ -0,0 +1,26 @@ +import logging + +from fastapi import APIRouter +from fastapi.responses import HTMLResponse +from fastapi import Request +from fastapi.templating import Jinja2Templates + +from medperf.entities.cube import Cube +from medperf.account_management import get_medperf_user_data + +router = APIRouter() +templates = Jinja2Templates(directory="medperf/web_ui/templates") +logger = logging.getLogger(__name__) + + +@router.get("/ui", response_class=HTMLResponse) +def mlcubes_ui(request: Request, local_only: bool = False, mine_only: bool = False): + filters = {} + if mine_only: + filters["owner"] = get_medperf_user_data()["id"] + + mlcubes = Cube.all( + local_only=local_only, + filters=filters, + ) + return templates.TemplateResponse("mlcubes.html", {"request": request, "mlcubes": mlcubes}) diff --git a/cli/medperf/web_ui/templates/base.html b/cli/medperf/web_ui/templates/base.html new file mode 100644 index 000000000..cbb74380c --- /dev/null +++ b/cli/medperf/web_ui/templates/base.html @@ -0,0 +1,12 @@ + + + + {% block title %}MedPerf{% endblock %} + + + +
+ {% block content %}{% endblock %} +
+ + \ No newline at end of file diff --git a/cli/medperf/web_ui/templates/benchmarks.html b/cli/medperf/web_ui/templates/benchmarks.html new file mode 100644 index 000000000..9f40d2e18 --- /dev/null +++ b/cli/medperf/web_ui/templates/benchmarks.html @@ -0,0 +1,27 @@ +{% extends "base.html" %} + +{% block title %}Benchmarks{% endblock %} + +{% block content %} +

Benchmarks

+
+ {% for benchmark in benchmarks %} +
+
+
+
{{ benchmark.name }}
+
{{ benchmark.state }}
+

{{ benchmark.description }}

+

Documentation

+

Created At: {{ benchmark.created_at }}

+

Data Preparation MLCube: {{ benchmark.data_preparation_mlcube }}

+

Reference Model MLCube: {{ benchmark.reference_model_mlcube }}

+

Data Evaluator MLCube: {{ benchmark.data_evaluator_mlcube }}

+

Approval Status: {{ benchmark.approval_status }}

+

Registered: {{ benchmark.is_registered }}

+
+
+
+ {% endfor %} +
+{% endblock %} diff --git a/cli/medperf/web_ui/templates/datasets.html b/cli/medperf/web_ui/templates/datasets.html index 5e120af60..2b0d58364 100644 --- a/cli/medperf/web_ui/templates/datasets.html +++ b/cli/medperf/web_ui/templates/datasets.html @@ -1,13 +1,22 @@ - - - - Datasets - - - -

Datasets

-
- +{% extends "base.html" %} + +{% block title %}Datasets{% endblock %} + +{% block content %} +

Datasets

+
+ {% for dataset in datasets %} +
+
+
+
{{ dataset.name }}
+
{{ dataset.state }}
+

{{ dataset.description }}

+

Location: {{ dataset.location }}

+

Created At: {{ dataset.created_at }}

+
+
- - + {% endfor %} +
+{% endblock %} diff --git a/cli/medperf/web_ui/templates/mlcubes.html b/cli/medperf/web_ui/templates/mlcubes.html new file mode 100644 index 000000000..8f6581087 --- /dev/null +++ b/cli/medperf/web_ui/templates/mlcubes.html @@ -0,0 +1,22 @@ +{% extends "base.html" %} + +{% block title %}MLCubes{% endblock %} + +{% block content %} +

MLCubes

+
+ {% for mlcube in mlcubes %} +
+
+
+
{{ mlcube.name }}
+
{{ mlcube.state }}
+

Config File

+

Created At: {{ mlcube.created_at }}

+

Registered: {{ mlcube.is_registered }}

+
+
+
+ {% endfor %} +
+{% endblock %} diff --git a/cli/requirements.txt b/cli/requirements.txt index 94384378c..b16630a55 100644 --- a/cli/requirements.txt +++ b/cli/requirements.txt @@ -26,3 +26,5 @@ numpy==1.26.4 watchdog==3.0.0 GitPython==3.1.41 psutil==5.9.8 +uvicorn==0.30.1 +fastapi==0.111.1 From 038268430d8ac14b54c42aeda97831ee728949bb Mon Sep 17 00:00:00 2001 From: Viacheslav Kukushkin Date: Mon, 15 Jul 2024 16:29:07 +0300 Subject: [PATCH 03/55] Adds navigation --- cli/medperf/web_ui/app.py | 7 +++++++ cli/medperf/web_ui/templates/base.html | 18 +++++++++++++++++- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/cli/medperf/web_ui/app.py b/cli/medperf/web_ui/app.py index 6d7e0f187..f13d30312 100644 --- a/cli/medperf/web_ui/app.py +++ b/cli/medperf/web_ui/app.py @@ -1,5 +1,6 @@ import typer from fastapi import FastAPI +from fastapi.responses import RedirectResponse from medperf import config from medperf.decorators import clean_except @@ -13,6 +14,12 @@ web_app.include_router(benchmarks_router, prefix="/benchmarks") web_app.include_router(mlcubes_router, prefix="/mlcubes") + +@web_app.get("/", include_in_schema=False) +def read_root(): + return RedirectResponse(url="/benchmarks/ui") + + app = typer.Typer() diff --git a/cli/medperf/web_ui/templates/base.html b/cli/medperf/web_ui/templates/base.html index cbb74380c..8f90271a9 100644 --- a/cli/medperf/web_ui/templates/base.html +++ b/cli/medperf/web_ui/templates/base.html @@ -5,7 +5,23 @@ -
+ +
{% block content %}{% endblock %}
From 55fe60e44cd99d15858d231ebddf23f2966fbe17 Mon Sep 17 00:00:00 2001 From: Viacheslav Kukushkin Date: Fri, 19 Jul 2024 11:39:31 +0300 Subject: [PATCH 04/55] Aded mlcube detailed page --- cli/medperf/web_ui/mlcubes/routes.py | 8 ++- .../web_ui/templates/mlcube_detail.html | 58 +++++++++++++++++++ cli/medperf/web_ui/templates/mlcubes.html | 4 +- 3 files changed, 67 insertions(+), 3 deletions(-) create mode 100644 cli/medperf/web_ui/templates/mlcube_detail.html diff --git a/cli/medperf/web_ui/mlcubes/routes.py b/cli/medperf/web_ui/mlcubes/routes.py index 96250c99a..16822fbb3 100644 --- a/cli/medperf/web_ui/mlcubes/routes.py +++ b/cli/medperf/web_ui/mlcubes/routes.py @@ -1,6 +1,6 @@ import logging -from fastapi import APIRouter +from fastapi import APIRouter, HTTPException from fastapi.responses import HTMLResponse from fastapi import Request from fastapi.templating import Jinja2Templates @@ -24,3 +24,9 @@ def mlcubes_ui(request: Request, local_only: bool = False, mine_only: bool = Fal filters=filters, ) return templates.TemplateResponse("mlcubes.html", {"request": request, "mlcubes": mlcubes}) + + +@router.get("/ui/{mlcube_id}", response_class=HTMLResponse) +def mlcube_detail_ui(request: Request, mlcube_id: int): + mlcube = Cube.get(cube_uid=mlcube_id) + return templates.TemplateResponse("mlcube_detail.html", {"request": request, "mlcube": mlcube}) diff --git a/cli/medperf/web_ui/templates/mlcube_detail.html b/cli/medperf/web_ui/templates/mlcube_detail.html new file mode 100644 index 000000000..aad4704f9 --- /dev/null +++ b/cli/medperf/web_ui/templates/mlcube_detail.html @@ -0,0 +1,58 @@ +{% extends "base.html" %} + +{% block title %}MLCube Details{% endblock %} + +{% block content %} +

{{ mlcube.name }}

+
+
+
+
Details
+ + {{ mlcube.state }} + +
+
+ +
+ + +
+
+ + +
+
+
+

MLCube: {{ mlcube.git_mlcube_url }}

+

{{ mlcube.mlcube_hash }}

+

Parameters: {{ mlcube.git_parameters_url }}

+

{{ mlcube.parameters_hash }}

+
+ +

Image Hash: {{ mlcube.image_hash }}

+

Created At: {{ mlcube.created_at }}

+

Modified At: {{ mlcube.modified_at }}

+

Owner: {{ mlcube.owner }}

+
+
+ +{% endblock %} diff --git a/cli/medperf/web_ui/templates/mlcubes.html b/cli/medperf/web_ui/templates/mlcubes.html index 8f6581087..0878cb92d 100644 --- a/cli/medperf/web_ui/templates/mlcubes.html +++ b/cli/medperf/web_ui/templates/mlcubes.html @@ -9,9 +9,9 @@

MLCubes

-
{{ mlcube.name }}
+
{{ mlcube.name }}
{{ mlcube.state }}
-

Config File

+

Config File

Created At: {{ mlcube.created_at }}

Registered: {{ mlcube.is_registered }}

From fb1bca3427939351ca51743214a67f040d8db629 Mon Sep 17 00:00:00 2001 From: Viacheslav Kukushkin Date: Fri, 19 Jul 2024 17:47:17 +0300 Subject: [PATCH 05/55] Improved mlcubes detailed layout --- cli/medperf/web_ui/templates/base.html | 13 +++- .../web_ui/templates/mlcube_detail.html | 73 ++++++++++--------- cli/medperf/web_ui/templates/mlcubes.html | 4 +- 3 files changed, 54 insertions(+), 36 deletions(-) diff --git a/cli/medperf/web_ui/templates/base.html b/cli/medperf/web_ui/templates/base.html index 8f90271a9..3f19bb7aa 100644 --- a/cli/medperf/web_ui/templates/base.html +++ b/cli/medperf/web_ui/templates/base.html @@ -3,6 +3,17 @@ {% block title %}MedPerf{% endblock %} + +
- \ No newline at end of file + diff --git a/cli/medperf/web_ui/templates/mlcube_detail.html b/cli/medperf/web_ui/templates/mlcube_detail.html index aad4704f9..d9d6df204 100644 --- a/cli/medperf/web_ui/templates/mlcube_detail.html +++ b/cli/medperf/web_ui/templates/mlcube_detail.html @@ -6,53 +6,60 @@

{{ mlcube.name }}

-
-
Details
+
+
Details
{{ mlcube.state }}
- -
- - + +
+ +
-
- - +
+ +
-
-

MLCube: {{ mlcube.git_mlcube_url }}

-

{{ mlcube.mlcube_hash }}

-

Parameters: {{ mlcube.git_parameters_url }}

-

{{ mlcube.parameters_hash }}

+
+
+
+

MLCube: {{ mlcube.git_mlcube_url }}

+

{{ mlcube.mlcube_hash }}

+

Parameters: {{ mlcube.git_parameters_url }}

+

{{ mlcube.parameters_hash }}

+
+
- {% endblock %} diff --git a/cli/medperf/web_ui/templates/mlcubes.html b/cli/medperf/web_ui/templates/mlcubes.html index 0878cb92d..56e78fdba 100644 --- a/cli/medperf/web_ui/templates/mlcubes.html +++ b/cli/medperf/web_ui/templates/mlcubes.html @@ -9,9 +9,9 @@

MLCubes

-
{{ mlcube.name }}
+
{{ mlcube.name }}
{{ mlcube.state }}
-

Config File

+

Config File

Created At: {{ mlcube.created_at }}

Registered: {{ mlcube.is_registered }}

From 64cf53e4447b70d0eceec694d22526bb30575ea4 Mon Sep 17 00:00:00 2001 From: Viacheslav Kukushkin Date: Fri, 19 Jul 2024 17:58:48 +0300 Subject: [PATCH 06/55] Improved mlcube layout --- cli/medperf/web_ui/templates/base.html | 3 ++ .../web_ui/templates/mlcube_detail.html | 32 ++++++++++++++++--- 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/cli/medperf/web_ui/templates/base.html b/cli/medperf/web_ui/templates/base.html index 3f19bb7aa..19900183f 100644 --- a/cli/medperf/web_ui/templates/base.html +++ b/cli/medperf/web_ui/templates/base.html @@ -3,6 +3,7 @@ {% block title %}MedPerf{% endblock %} + @@ -36,7 +50,12 @@
{% block content %}{% endblock %}
- - + + + + diff --git a/cli/medperf/web_ui/templates/mlcube_detail.html b/cli/medperf/web_ui/templates/mlcube_detail.html index 49e810e75..ccba0cab3 100644 --- a/cli/medperf/web_ui/templates/mlcube_detail.html +++ b/cli/medperf/web_ui/templates/mlcube_detail.html @@ -1,3 +1,4 @@ + {% extends "base.html" %} {% block title %}MLCube Details{% endblock %} @@ -26,9 +27,9 @@
Details
-

MLCube: {{ mlcube.git_mlcube_url }}

+

MLCube: {{ mlcube.git_mlcube_url }}

{{ mlcube.mlcube_hash }}

-

Parameters: {{ mlcube.git_parameters_url }}

+

Parameters: {{ mlcube.git_parameters_url }}

{{ mlcube.parameters_hash }}

@@ -82,6 +83,16 @@
Details
const modifiedAt = document.getElementById('modified-at'); createdAt.textContent = formatDate(createdAt.textContent); modifiedAt.textContent = formatDate(modifiedAt.textContent); + + $('.yaml-link').on('click', function(event) { + event.preventDefault(); + const url = $(this).attr('href'); + $.get('/fetch-yaml', { url: url }, function(data) { + $('#yaml-code').text(data.content); + Prism.highlightElement($('#yaml-code')[0]); + $('#yaml-content').show(); + }); + }); }); {% endblock %} diff --git a/cli/medperf/web_ui/yaml_fetch/__init__.py b/cli/medperf/web_ui/yaml_fetch/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/cli/medperf/web_ui/yaml_fetch/routes.py b/cli/medperf/web_ui/yaml_fetch/routes.py new file mode 100644 index 000000000..d1d2d8a1a --- /dev/null +++ b/cli/medperf/web_ui/yaml_fetch/routes.py @@ -0,0 +1,23 @@ +from fastapi import APIRouter, HTTPException +import requests +import yaml + +router = APIRouter() + + +@router.get("/fetch-yaml") +async def fetch_yaml(url: str): + try: + response = requests.get(url) + response.raise_for_status() # Check if the request was successful + content = response.text + + # Validate YAML content + try: + yaml.safe_load(content) + except yaml.YAMLError as e: + raise HTTPException(status_code=400, detail="Invalid YAML content") + + return {"content": content} + except requests.RequestException as e: + raise HTTPException(status_code=400, detail="Failed to fetch YAML content") From 56fa5c4bb43f9a119f494c750204cd8d6da1d1e6 Mon Sep 17 00:00:00 2001 From: Viacheslav Kukushkin Date: Fri, 19 Jul 2024 18:27:32 +0300 Subject: [PATCH 08/55] yaml: spinner --- cli/medperf/web_ui/templates/base.html | 16 ++++++++++++++++ cli/medperf/web_ui/templates/mlcube_detail.html | 10 +++++++++- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/cli/medperf/web_ui/templates/base.html b/cli/medperf/web_ui/templates/base.html index 1803ce577..cac1f3f33 100644 --- a/cli/medperf/web_ui/templates/base.html +++ b/cli/medperf/web_ui/templates/base.html @@ -25,6 +25,21 @@ border-left: 1px solid #dee2e6; padding: 20px; } + .spinner { + display: inline-block; + width: 80px; + height: 80px; + border: 3px solid rgba(0, 0, 0, 0.1); + border-radius: 50%; + border-top-color: #007bff; + animation: spin 1s ease-in-out infinite; + margin: 0 auto; + } + @keyframes spin { + to { + transform: rotate(360deg); + } + } pre { white-space: pre-wrap; } @@ -52,6 +67,7 @@
diff --git a/cli/medperf/web_ui/templates/mlcube_detail.html b/cli/medperf/web_ui/templates/mlcube_detail.html index ccba0cab3..f61d924a9 100644 --- a/cli/medperf/web_ui/templates/mlcube_detail.html +++ b/cli/medperf/web_ui/templates/mlcube_detail.html @@ -87,10 +87,18 @@
Details
$('.yaml-link').on('click', function(event) { event.preventDefault(); const url = $(this).attr('href'); + $('#yaml-content').show(); + $('#loading-indicator').show(); + $('#yaml-code').hide(); $.get('/fetch-yaml', { url: url }, function(data) { $('#yaml-code').text(data.content); Prism.highlightElement($('#yaml-code')[0]); - $('#yaml-content').show(); + $('#loading-indicator').hide(); + $('#yaml-code').show(); + }).fail(function() { + $('#yaml-code').text('Failed to load content'); + $('#loading-indicator').hide(); + $('#yaml-code').show(); }); }); }); From 85638878cc2da581c2fed3d7ea1de04f9e1fb838 Mon Sep 17 00:00:00 2001 From: Viacheslav Kukushkin Date: Fri, 19 Jul 2024 18:57:07 +0300 Subject: [PATCH 09/55] yaml panel improvement --- cli/medperf/web_ui/templates/base.html | 30 ++++++++++++++++++++------ 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/cli/medperf/web_ui/templates/base.html b/cli/medperf/web_ui/templates/base.html index cac1f3f33..685e18138 100644 --- a/cli/medperf/web_ui/templates/base.html +++ b/cli/medperf/web_ui/templates/base.html @@ -35,6 +35,20 @@ animation: spin 1s ease-in-out infinite; margin: 0 auto; } + .page-container { + display: flex; + justify-content: space-between; + align-items: flex-start; + height: 100vh; /* Ensure the parent container takes full viewport height */ + } + + #yaml-content { + flex: 0 0 40%; /* Adjust width as necessary */ + max-width: 40%; + height: 100%; /* Take full height of the parent container */ + overflow-y: auto; /* Enable vertical scrolling within this container */ + } + @keyframes spin { to { transform: rotate(360deg); @@ -62,13 +76,15 @@
-
- {% block content %}{% endblock %} -
-
-
+
{% block content %}{% endblock %}
-
+
+
{% block content %}{% endblock %} -
- +
diff --git a/cli/medperf/web_ui/templates/mlcube_detail.html b/cli/medperf/web_ui/templates/mlcube_detail.html index f61d924a9..6728446ed 100644 --- a/cli/medperf/web_ui/templates/mlcube_detail.html +++ b/cli/medperf/web_ui/templates/mlcube_detail.html @@ -4,6 +4,16 @@ {% block title %}MLCube Details{% endblock %} {% block content %} +

{{ mlcube.name }}

@@ -45,12 +55,12 @@
Details
-
-
+
+

Image Hash: {{ mlcube.image_hash }}

{{ mlcube.owner }}

-
+

Created: {{ mlcube.created_at }}

Modified: {{ mlcube.modified_at }}

From b7980a85c7b6d5b2dffb0731091974ad0a15ee65 Mon Sep 17 00:00:00 2001 From: Viacheslav Kukushkin Date: Fri, 19 Jul 2024 20:47:07 +0300 Subject: [PATCH 12/55] Added benchmark detailed page --- cli/medperf/web_ui/app.py | 3 + cli/medperf/web_ui/benchmarks/routes.py | 9 ++- cli/medperf/web_ui/prompt.md | 0 cli/medperf/web_ui/templates/base.html | 1 + .../web_ui/templates/benchmark_detail.html | 57 +++++++++++++++++++ cli/medperf/web_ui/templates/benchmarks.html | 2 +- .../web_ui/templates/mlcube_detail.html | 15 +---- 7 files changed, 71 insertions(+), 16 deletions(-) create mode 100644 cli/medperf/web_ui/prompt.md create mode 100644 cli/medperf/web_ui/templates/benchmark_detail.html diff --git a/cli/medperf/web_ui/app.py b/cli/medperf/web_ui/app.py index 66bdf4e61..eb88cf1a9 100644 --- a/cli/medperf/web_ui/app.py +++ b/cli/medperf/web_ui/app.py @@ -1,6 +1,7 @@ import typer from fastapi import FastAPI from fastapi.responses import RedirectResponse +from fastapi.staticfiles import StaticFiles from medperf import config from medperf.decorators import clean_except @@ -16,6 +17,8 @@ web_app.include_router(mlcubes_router, prefix="/mlcubes") web_app.include_router(yaml_fetch_router) +web_app.mount("/static", StaticFiles(directory="medperf/web_ui/static"), name="static") + @web_app.get("/", include_in_schema=False) def read_root(): diff --git a/cli/medperf/web_ui/benchmarks/routes.py b/cli/medperf/web_ui/benchmarks/routes.py index 9b82efe13..45e2b3689 100644 --- a/cli/medperf/web_ui/benchmarks/routes.py +++ b/cli/medperf/web_ui/benchmarks/routes.py @@ -1,6 +1,7 @@ +# medperf/web-ui/benchmarks/routes.py import logging -from fastapi import APIRouter +from fastapi import APIRouter, HTTPException from fastapi.responses import HTMLResponse from fastapi import Request from fastapi.templating import Jinja2Templates @@ -24,3 +25,9 @@ def benchmarks_ui(request: Request, local_only: bool = False, mine_only: bool = filters=filters, ) return templates.TemplateResponse("benchmarks.html", {"request": request, "benchmarks": benchmarks}) + + +@router.get("/ui/{benchmark_id}", response_class=HTMLResponse) +def benchmark_detail_ui(request: Request, benchmark_id: int): + benchmark = Benchmark.get(benchmark_id) + return templates.TemplateResponse("benchmark_detail.html", {"request": request, "benchmark": benchmark}) diff --git a/cli/medperf/web_ui/prompt.md b/cli/medperf/web_ui/prompt.md new file mode 100644 index 000000000..e69de29bb diff --git a/cli/medperf/web_ui/templates/base.html b/cli/medperf/web_ui/templates/base.html index a55001d85..5b168757f 100644 --- a/cli/medperf/web_ui/templates/base.html +++ b/cli/medperf/web_ui/templates/base.html @@ -97,5 +97,6 @@
YAML Content
+ diff --git a/cli/medperf/web_ui/templates/benchmark_detail.html b/cli/medperf/web_ui/templates/benchmark_detail.html new file mode 100644 index 000000000..ca6975553 --- /dev/null +++ b/cli/medperf/web_ui/templates/benchmark_detail.html @@ -0,0 +1,57 @@ + +{% extends "base.html" %} + +{% block title %}Benchmark Details{% endblock %} + +{% block content %} + +

{{ benchmark.name }}

+
+
+
+
Details
+ + {{ benchmark.state }} + + + {{ benchmark.approval_status }} + +
+
+
+

Description: {{ benchmark.description }}

+

Documentation: {{ benchmark.docs_url }}

+

Demo Dataset Tarball: {{ benchmark.demo_dataset_tarball_url }}

+

{{ benchmark.demo_dataset_tarball_hash }}

+
+
+
+
+
+

Reference Model MLCube: {{ benchmark.reference_model_mlcube }}

+

Data Preparation MLCube: {{ benchmark.data_preparation_mlcube }}

+

Data Evaluator MLCube: {{ benchmark.data_evaluator_mlcube }}

+
+
+

Created: {{ benchmark.created_at }}

+

Modified: {{ benchmark.modified_at }}

+
+
+
+
+
+ +{% endblock %} diff --git a/cli/medperf/web_ui/templates/benchmarks.html b/cli/medperf/web_ui/templates/benchmarks.html index 9f40d2e18..f139f36c0 100644 --- a/cli/medperf/web_ui/templates/benchmarks.html +++ b/cli/medperf/web_ui/templates/benchmarks.html @@ -9,7 +9,7 @@

Benchmarks

-
{{ benchmark.name }}
+
{{ benchmark.name }}
{{ benchmark.state }}

{{ benchmark.description }}

Documentation

diff --git a/cli/medperf/web_ui/templates/mlcube_detail.html b/cli/medperf/web_ui/templates/mlcube_detail.html index 6728446ed..d72b897af 100644 --- a/cli/medperf/web_ui/templates/mlcube_detail.html +++ b/cli/medperf/web_ui/templates/mlcube_detail.html @@ -78,21 +78,8 @@
Details
document.getElementById('imageTarballUrls').style.display = 'block'; }); - function formatDate(dateString) { - const date = new Date(dateString); - const now = new Date(); - const options = { weekday: 'short', month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit', timeZoneName: 'short' }; - if (date.getFullYear() !== now.getFullYear()) { - options.year = 'numeric'; - } - return date.toLocaleDateString(undefined, options); - } - document.addEventListener('DOMContentLoaded', function() { - const createdAt = document.getElementById('created-at'); - const modifiedAt = document.getElementById('modified-at'); - createdAt.textContent = formatDate(createdAt.textContent); - modifiedAt.textContent = formatDate(modifiedAt.textContent); + formatDates(); $('.yaml-link').on('click', function(event) { event.preventDefault(); From ca356ccd3d20151610d6b9a1daccc9d12147722e Mon Sep 17 00:00:00 2001 From: Viacheslav Kukushkin Date: Fri, 19 Jul 2024 20:54:23 +0300 Subject: [PATCH 13/55] added links to mlcube --- cli/medperf/web_ui/benchmarks/routes.py | 16 +++++++++++++++- .../web_ui/templates/benchmark_detail.html | 8 +++++--- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/cli/medperf/web_ui/benchmarks/routes.py b/cli/medperf/web_ui/benchmarks/routes.py index 45e2b3689..9b834135b 100644 --- a/cli/medperf/web_ui/benchmarks/routes.py +++ b/cli/medperf/web_ui/benchmarks/routes.py @@ -7,6 +7,7 @@ from fastapi.templating import Jinja2Templates from medperf.entities.benchmark import Benchmark +from medperf.entities.cube import Cube from medperf.account_management import get_medperf_user_data router = APIRouter() @@ -30,4 +31,17 @@ def benchmarks_ui(request: Request, local_only: bool = False, mine_only: bool = @router.get("/ui/{benchmark_id}", response_class=HTMLResponse) def benchmark_detail_ui(request: Request, benchmark_id: int): benchmark = Benchmark.get(benchmark_id) - return templates.TemplateResponse("benchmark_detail.html", {"request": request, "benchmark": benchmark}) + data_preparation_mlcube = Cube.get(cube_uid=benchmark.data_preparation_mlcube) + reference_model_mlcube = Cube.get(cube_uid=benchmark.reference_model_mlcube) + metrics_mlcube = Cube.get(cube_uid=benchmark.data_evaluator_mlcube) + + return templates.TemplateResponse( + "benchmark_detail.html", + { + "request": request, + "benchmark": benchmark, + "data_preparation_mlcube": data_preparation_mlcube, + "reference_model_mlcube": reference_model_mlcube, + "metrics_mlcube": metrics_mlcube + } + ) diff --git a/cli/medperf/web_ui/templates/benchmark_detail.html b/cli/medperf/web_ui/templates/benchmark_detail.html index ca6975553..93a2ff0d0 100644 --- a/cli/medperf/web_ui/templates/benchmark_detail.html +++ b/cli/medperf/web_ui/templates/benchmark_detail.html @@ -13,6 +13,7 @@ word-wrap: break-word; white-space: normal; } +

{{ benchmark.name }}

@@ -37,9 +38,9 @@
Details
-

Reference Model MLCube: {{ benchmark.reference_model_mlcube }}

-

Data Preparation MLCube: {{ benchmark.data_preparation_mlcube }}

-

Data Evaluator MLCube: {{ benchmark.data_evaluator_mlcube }}

+

Data Preparation MLCube: {{ data_preparation_mlcube.name }}

+

Reference Model MLCube: {{ reference_model_mlcube.name }}

+

Metrics MLCube: {{ metrics_mlcube.name }}

Created: {{ benchmark.created_at }}

@@ -49,6 +50,7 @@
Details
+ + +{% endblock %} diff --git a/cli/medperf/web_ui/templates/datasets.html b/cli/medperf/web_ui/templates/datasets.html index 2b0d58364..e81ee80d1 100644 --- a/cli/medperf/web_ui/templates/datasets.html +++ b/cli/medperf/web_ui/templates/datasets.html @@ -1,3 +1,4 @@ + {% extends "base.html" %} {% block title %}Datasets{% endblock %} @@ -9,7 +10,7 @@

Datasets

-
{{ dataset.name }}
+
{{ dataset.name }}
{{ dataset.state }}

{{ dataset.description }}

Location: {{ dataset.location }}

From 375d89eebb924ee0c0210cdf5b5d4d1eca9aae09 Mon Sep 17 00:00:00 2001 From: Viacheslav Kukushkin Date: Tue, 23 Jul 2024 14:41:15 +0300 Subject: [PATCH 17/55] Forgot to add js file --- cli/medperf/web_ui/static/js/common.js | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 cli/medperf/web_ui/static/js/common.js diff --git a/cli/medperf/web_ui/static/js/common.js b/cli/medperf/web_ui/static/js/common.js new file mode 100644 index 000000000..7b46bd25a --- /dev/null +++ b/cli/medperf/web_ui/static/js/common.js @@ -0,0 +1,25 @@ +function formatDate(dateString) { + const date = new Date(dateString); + const now = new Date(); + const options = { + weekday: 'short', + month: 'short', + day: 'numeric', + hour: '2-digit', + minute: '2-digit', + timeZoneName: 'short' + }; + if (date.getFullYear() !== now.getFullYear()) { + options.year = 'numeric'; + } + return date.toLocaleDateString(undefined, options); +} + +function formatDates() { + const createdAt = document.getElementById('created-at'); + const modifiedAt = document.getElementById('modified-at'); + if (createdAt && modifiedAt) { + createdAt.textContent = formatDate(createdAt.textContent); + modifiedAt.textContent = formatDate(modifiedAt.textContent); + } +} From c6d8a56a5013d865946591cd74cbd03f4780f1f3 Mon Sep 17 00:00:00 2001 From: Viacheslav Kukushkin Date: Tue, 23 Jul 2024 15:04:32 +0300 Subject: [PATCH 18/55] Unified data format for all data fields automatically --- cli/medperf/web_ui/benchmarks/routes.py | 6 ++---- cli/medperf/web_ui/common.py | 3 +++ cli/medperf/web_ui/datasets/routes.py | 7 ++----- cli/medperf/web_ui/mlcubes/routes.py | 5 ++--- cli/medperf/web_ui/static/js/common.js | 18 +++++++++++------- .../web_ui/templates/benchmark_detail.html | 10 ++-------- .../web_ui/templates/dataset_detail.html | 11 ++--------- .../web_ui/templates/mlcube_detail.html | 19 +++++++++---------- 8 files changed, 33 insertions(+), 46 deletions(-) create mode 100644 cli/medperf/web_ui/common.py diff --git a/cli/medperf/web_ui/benchmarks/routes.py b/cli/medperf/web_ui/benchmarks/routes.py index 9b834135b..64fc4c552 100644 --- a/cli/medperf/web_ui/benchmarks/routes.py +++ b/cli/medperf/web_ui/benchmarks/routes.py @@ -1,17 +1,15 @@ -# medperf/web-ui/benchmarks/routes.py import logging -from fastapi import APIRouter, HTTPException +from fastapi import APIRouter from fastapi.responses import HTMLResponse from fastapi import Request -from fastapi.templating import Jinja2Templates from medperf.entities.benchmark import Benchmark from medperf.entities.cube import Cube from medperf.account_management import get_medperf_user_data +from medperf.web_ui.common import templates router = APIRouter() -templates = Jinja2Templates(directory="medperf/web_ui/templates") logger = logging.getLogger(__name__) diff --git a/cli/medperf/web_ui/common.py b/cli/medperf/web_ui/common.py new file mode 100644 index 000000000..d2a88be5d --- /dev/null +++ b/cli/medperf/web_ui/common.py @@ -0,0 +1,3 @@ +from fastapi.templating import Jinja2Templates + +templates = Jinja2Templates(directory="medperf/web_ui/templates") diff --git a/cli/medperf/web_ui/datasets/routes.py b/cli/medperf/web_ui/datasets/routes.py index 0a7d4e69f..792c1d01e 100644 --- a/cli/medperf/web_ui/datasets/routes.py +++ b/cli/medperf/web_ui/datasets/routes.py @@ -1,19 +1,16 @@ import logging -from fastapi import APIRouter, HTTPException +from fastapi import APIRouter from fastapi.responses import HTMLResponse from typing import List from fastapi import Request -from fastapi.templating import Jinja2Templates from medperf.account_management import get_medperf_user_data from medperf.entities.cube import Cube from medperf.entities.dataset import Dataset +from medperf.web_ui.common import templates router = APIRouter() - -templates = Jinja2Templates(directory="medperf/web_ui/templates") - logger = logging.getLogger(__name__) diff --git a/cli/medperf/web_ui/mlcubes/routes.py b/cli/medperf/web_ui/mlcubes/routes.py index 16822fbb3..db6522bd3 100644 --- a/cli/medperf/web_ui/mlcubes/routes.py +++ b/cli/medperf/web_ui/mlcubes/routes.py @@ -1,15 +1,14 @@ import logging -from fastapi import APIRouter, HTTPException +from fastapi import APIRouter from fastapi.responses import HTMLResponse from fastapi import Request -from fastapi.templating import Jinja2Templates from medperf.entities.cube import Cube from medperf.account_management import get_medperf_user_data +from medperf.web_ui.common import templates router = APIRouter() -templates = Jinja2Templates(directory="medperf/web_ui/templates") logger = logging.getLogger(__name__) diff --git a/cli/medperf/web_ui/static/js/common.js b/cli/medperf/web_ui/static/js/common.js index 7b46bd25a..315e81ece 100644 --- a/cli/medperf/web_ui/static/js/common.js +++ b/cli/medperf/web_ui/static/js/common.js @@ -15,11 +15,15 @@ function formatDate(dateString) { return date.toLocaleDateString(undefined, options); } -function formatDates() { - const createdAt = document.getElementById('created-at'); - const modifiedAt = document.getElementById('modified-at'); - if (createdAt && modifiedAt) { - createdAt.textContent = formatDate(createdAt.textContent); - modifiedAt.textContent = formatDate(modifiedAt.textContent); - } +function applyDateFormatting() { + console.log("Date formatter started"); + const dateElements = document.querySelectorAll('[data-date]'); + dateElements.forEach(element => { + const date = element.getAttribute('data-date'); + element.textContent = formatDate(date); + }); } + +document.addEventListener('DOMContentLoaded', function() { + applyDateFormatting(); +}); diff --git a/cli/medperf/web_ui/templates/benchmark_detail.html b/cli/medperf/web_ui/templates/benchmark_detail.html index 77aaa7d63..eb3208c85 100644 --- a/cli/medperf/web_ui/templates/benchmark_detail.html +++ b/cli/medperf/web_ui/templates/benchmark_detail.html @@ -1,4 +1,3 @@ - {% extends "base.html" %} {% block title %}Benchmark Details{% endblock %} @@ -43,16 +42,11 @@
Details

Owner: {{ benchmark.owner }}

-

Created: {{ benchmark.created_at }}

-

Modified: {{ benchmark.modified_at }}

+

Created:

+

Modified:

- {% endblock %} diff --git a/cli/medperf/web_ui/templates/dataset_detail.html b/cli/medperf/web_ui/templates/dataset_detail.html index dcd9fcb62..d8232e54a 100644 --- a/cli/medperf/web_ui/templates/dataset_detail.html +++ b/cli/medperf/web_ui/templates/dataset_detail.html @@ -1,4 +1,3 @@ - {% extends "base.html" %} {% block title %}Dataset Details{% endblock %} @@ -40,17 +39,11 @@
Details

Owner: {{ dataset.owner }}

-

Created: {{ dataset.created_at }}

-

Modified: {{ dataset.modified_at }}

+

Created:

+

Modified:

- - {% endblock %} diff --git a/cli/medperf/web_ui/templates/mlcube_detail.html b/cli/medperf/web_ui/templates/mlcube_detail.html index 586b01cc8..86c9e3c2f 100644 --- a/cli/medperf/web_ui/templates/mlcube_detail.html +++ b/cli/medperf/web_ui/templates/mlcube_detail.html @@ -1,4 +1,3 @@ - {% extends "base.html" %} {% block title %}MLCube Details{% endblock %} @@ -6,13 +5,13 @@ {% block content %}

{{ mlcube.name }}

@@ -61,8 +60,9 @@
Details

{{ mlcube.owner }}

-

Created: {{ mlcube.created_at }}

-

Modified: {{ mlcube.modified_at }}

+

Created:

+

Modified: +

@@ -79,7 +79,6 @@
Details
}); document.addEventListener('DOMContentLoaded', function() { - formatDates(); $('.yaml-link').on('click', function(event) { event.preventDefault(); From 74f77431f432ba5b65781440bbdd8b1ddda3c41f Mon Sep 17 00:00:00 2001 From: Viacheslav Kukushkin Date: Wed, 24 Jul 2024 20:15:30 +0300 Subject: [PATCH 19/55] (mlcube-detailed) Display image tarball and additional files always --- .../web_ui/templates/mlcube_detail.html | 48 ++++--------------- 1 file changed, 10 insertions(+), 38 deletions(-) diff --git a/cli/medperf/web_ui/templates/mlcube_detail.html b/cli/medperf/web_ui/templates/mlcube_detail.html index 86c9e3c2f..9cd19fb95 100644 --- a/cli/medperf/web_ui/templates/mlcube_detail.html +++ b/cli/medperf/web_ui/templates/mlcube_detail.html @@ -22,35 +22,16 @@
Details
{{ mlcube.state }}
-
- -
- - -
-
- - -
-
-
-
-
-

MLCube: {{ mlcube.git_mlcube_url }}

-

{{ mlcube.mlcube_hash }}

-

Parameters: {{ mlcube.git_parameters_url }}

-

{{ mlcube.parameters_hash }}

-
-
-
-