Skip to content

Commit

Permalink
# This is a combination of 2 commits.
Browse files Browse the repository at this point in the history
# This is the 1st commit message:

Remove system card mocks

# Conflicts:
#	amt/api/routes/project.py

# This is the commit message #2:

Remove system card mocks
  • Loading branch information
uittenbroekrobbert committed Oct 29, 2024
1 parent 3c7f69e commit 994c9ab
Show file tree
Hide file tree
Showing 13 changed files with 259 additions and 71 deletions.
15 changes: 15 additions & 0 deletions amt/api/deps.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
time_ago,
)
from amt.schema.localized_value_item import LocalizedValueItem
from amt.schema.shared import IterMixin

T = TypeVar("T", bound=Enum | LocalizableEnum)

Expand Down Expand Up @@ -135,6 +136,19 @@ def Redirect(self, request: Request, url: str) -> HTMLResponse:
return self.TemplateResponse(request, "redirect.html.j2", headers=headers)


def instance(obj, type_string):
match type_string:
case "str":
return isinstance(obj, str)
case "list":
return isinstance(obj, list)
case "IterMixin":
return isinstance(obj, IterMixin)
case "dict":
return isinstance(obj, dict)
case _:
raise TypeError("Unsupported type: " + type_string)

templates = LocaleJinja2Templates(
directory="amt/site/templates/", context_processors=[custom_context_processor], undefined=get_undefined_behaviour()
)
Expand All @@ -146,3 +160,4 @@ def Redirect(self, request: Request, url: str) -> HTMLResponse:
templates.env.globals.update(is_nested_enum=is_nested_enum) # pyright: ignore [reportUnknownMemberType]
templates.env.globals.update(nested_enum=nested_enum) # pyright: ignore [reportUnknownMemberType]
templates.env.globals.update(nested_enum_value=nested_enum_value) # pyright: ignore [reportUnknownMemberType]
templates.env.globals.update(isinstance=instance) # pyright: ignore [reportUnknownMemberType]
66 changes: 18 additions & 48 deletions amt/api/routes/project.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
import asyncio
import functools
import logging
from collections.abc import Sequence
from pathlib import Path
from typing import Annotated, Any, cast

from fastapi import APIRouter, Depends, Request
Expand All @@ -28,26 +26,17 @@
from amt.services import task_registry
from amt.services.instruments_and_requirements_state import InstrumentStateService, RequirementsStateService
from amt.services.projects import ProjectsService
from amt.services.storage import StorageFactory
from amt.services.task_registry import fetch_measures, fetch_requirements
from amt.services.tasks import TasksService
from amt.utils.storage import get_include_content

router = APIRouter()
logger = logging.getLogger(__name__)


def get_system_card_data() -> SystemCard:
# TODO: This now loads an example system card independent of the project ID.
path = Path("example_system_card/system_card.yaml")
system_card: Any = StorageFactory.init(storage_type="file", location=path.parent, filename=path.name).read()
return SystemCard(**system_card)


@functools.lru_cache
def get_instrument_state() -> dict[str, Any]:
system_card_data = get_system_card_data()
instrument_state = InstrumentStateService(system_card_data)
# TODO: does this need LRU cache?
# @functools.lru_cache()
def get_instrument_state(system_card: SystemCard) -> dict[str, Any]:
instrument_state = InstrumentStateService(system_card)
instrument_states = instrument_state.get_state_per_instrument()
return {
"instrument_states": instrument_states,
Expand Down Expand Up @@ -181,14 +170,12 @@ async def get_project_context(
project_id: int, projects_service: ProjectsService, request: Request
) -> tuple[Project, dict[str, Any]]:
project = await get_project_or_error(project_id, projects_service, request)
system_card_data = get_system_card_data()
instrument_state = get_instrument_state()
instrument_state = get_instrument_state(project.system_card)
requirements_state = get_requirements_state(project.system_card)
tab_items = get_project_details_tabs(request)
project.system_card = system_card_data
return project, {
"last_edited": project.last_edited,
"system_card": system_card_data,
"system_card": project.system_card,
"instrument_state": instrument_state,
"requirements_state": requirements_state,
"project": project,
Expand Down Expand Up @@ -313,15 +300,8 @@ async def get_system_card(
request,
)

# TODO: This now loads an example system card independent of the project ID.
filepath = Path("example_system_card/system_card.yaml")
file_system_storage_service = StorageFactory.init(
storage_type="file", location=filepath.parent, filename=filepath.name
)
system_card_data = file_system_storage_service.read()

context = {
"system_card": system_card_data,
"system_card": project.system_card,
"instrument_state": instrument_state,
"requirements_state": requirements_state,
"last_edited": project.last_edited,
Expand Down Expand Up @@ -351,15 +331,14 @@ async def get_project_inference(
request,
)

system_card_data = get_system_card_data()
instrument_state = get_instrument_state()
instrument_state = get_instrument_state(project.system_card)
requirements_state = get_requirements_state(project.system_card)

tab_items = get_project_details_tabs(request)

context = {
"last_edited": project.last_edited,
"system_card": system_card_data,
"system_card": project.system_card,
"instrument_state": instrument_state,
"requirements_state": requirements_state,
"project": project,
Expand All @@ -383,7 +362,7 @@ async def get_system_card_requirements(
projects_service: Annotated[ProjectsService, Depends(ProjectsService)],
) -> HTMLResponse:
project = await get_project_or_error(project_id, projects_service, request)
instrument_state = get_instrument_state()
instrument_state = get_instrument_state(project.system_card)
requirements_state = get_requirements_state(project.system_card)
# TODO: This tab is fairly slow, fix in later releases
tab_items = get_project_details_tabs(request)
Expand Down Expand Up @@ -546,7 +525,7 @@ async def get_system_card_data_page(
projects_service: Annotated[ProjectsService, Depends(ProjectsService)],
) -> HTMLResponse:
project = await get_project_or_error(project_id, projects_service, request)
instrument_state = get_instrument_state()
instrument_state = get_instrument_state(project.system_card)
requirements_state = get_requirements_state(project.system_card)

tab_items = get_project_details_tabs(request)
Expand Down Expand Up @@ -586,7 +565,7 @@ async def get_system_card_instruments(
projects_service: Annotated[ProjectsService, Depends(ProjectsService)],
) -> HTMLResponse:
project = await get_project_or_error(project_id, projects_service, request)
instrument_state = get_instrument_state()
instrument_state = get_instrument_state(project.system_card)
requirements_state = get_requirements_state(project.system_card)

tab_items = get_project_details_tabs(request)
Expand Down Expand Up @@ -614,11 +593,6 @@ async def get_system_card_instruments(
return templates.TemplateResponse(request, "projects/details_instruments.html.j2", context)


# !!!
# Implementation of this endpoint is for now independent of the project ID, meaning
# that the same system card is rendered for all project ID's. This is due to the fact
# that the logical process flow of a system card is not complete.
# !!!
@router.get("/{project_id}/details/system_card/assessments/{assessment_card}")
async def get_assessment_card(
request: Request,
Expand All @@ -627,7 +601,7 @@ async def get_assessment_card(
projects_service: Annotated[ProjectsService, Depends(ProjectsService)],
) -> HTMLResponse:
project = await get_project_or_error(project_id, projects_service, request)
instrument_state = get_instrument_state()
instrument_state = get_instrument_state(project.system_card)
requirements_state = get_requirements_state(project.system_card)

request.state.path_variables.update({"assessment_card": assessment_card})
Expand All @@ -645,9 +619,7 @@ async def get_assessment_card(
request,
)

# TODO: This now loads an example system card independent of the project ID.
filepath = Path("example_system_card/system_card.yaml")
assessment_card_data = get_include_content(filepath.parent, filepath.name, "assessments", assessment_card)
assessment_card_data = next((assessment for assessment in project.system_card.assessments if assessment.name.lower() == assessment_card), None)

if not assessment_card_data:
logger.warning("assessment card not found")
Expand Down Expand Up @@ -678,13 +650,9 @@ async def get_model_card(
projects_service: Annotated[ProjectsService, Depends(ProjectsService)],
) -> HTMLResponse:
project = await get_project_or_error(project_id, projects_service, request)
instrument_state = get_instrument_state()
requirements_state = get_requirements_state(project.system_card)

# TODO: This now loads an example system card independent of the project ID.
filepath = Path("example_system_card/system_card.yaml")
model_card_data = get_include_content(filepath.parent, filepath.name, "models", model_card)
request.state.path_variables.update({"model_card": model_card})
instrument_state = get_instrument_state(project.system_card)
requirements_state = get_requirements_state(project.system_card)

tab_items = get_project_details_tabs(request)

Expand All @@ -699,6 +667,8 @@ async def get_model_card(
request,
)

model_card_data = next((model for model in project.system_card.models if model.name.lower() == model_card), None)

if not model_card_data:
logger.warning("model card not found")
raise AMTNotFound()
Expand Down
8 changes: 5 additions & 3 deletions amt/schema/assessment_card.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,14 @@
Field, # pyright: ignore [reportUnknownMemberType]
)

from amt.schema.shared import IterMixin

class AssessmentAuthor(BaseModel):

class AssessmentAuthor(BaseModel, IterMixin):
name: str = Field(default=None)


class AssessmentContent(BaseModel):
class AssessmentContent(BaseModel, IterMixin):
question: str = Field(default=None)
urn: str = Field(default=None)
answer: str = Field(default=None)
Expand All @@ -19,7 +21,7 @@ class AssessmentContent(BaseModel):
timestamp: datetime | None = Field(default=None)


class AssessmentCard(BaseModel):
class AssessmentCard(BaseModel, IterMixin):
name: str = Field(default=None)
urn: str = Field(default=None)
date: datetime = Field(default=None)
Expand Down
6 changes: 4 additions & 2 deletions amt/schema/instrument.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
from pydantic import BaseModel, Field

from amt.schema.shared import IterMixin

class Owner(BaseModel):

class Owner(BaseModel, IterMixin):
organization: str
name: str
email: str
Expand All @@ -15,7 +17,7 @@ class InstrumentTask(BaseModel):
lifecycle: list[str]


class InstrumentBase(BaseModel):
class InstrumentBase(BaseModel, IterMixin):
urn: str


Expand Down
4 changes: 3 additions & 1 deletion amt/schema/measure.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
from pydantic import BaseModel, Field

from amt.schema.shared import IterMixin

class MeasureBase(BaseModel):

class MeasureBase(BaseModel, IterMixin):
urn: str


Expand Down
Loading

0 comments on commit 994c9ab

Please sign in to comment.