Skip to content

Commit

Permalink
consolidate services into research drives only
Browse files Browse the repository at this point in the history
  • Loading branch information
JLoveUOA committed Nov 25, 2024
1 parent db59bb1 commit 900e829
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 26 deletions.
14 changes: 5 additions & 9 deletions src/api/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
from models.person import Person
from models.project import InputProject, Project
from models.role import prepopulate_roles
from models.services import ResearchDriveService, Services
from models.services import ResearchDriveService

# Ensure driveoff directory is created
(Path.home() / ".driveoff").mkdir(exist_ok=True)
Expand Down Expand Up @@ -106,9 +106,7 @@ async def set_drive_info(
ResearchDriveService.model_validate(drive)
for drive in input_project.services.research_drive
]
stored_services = Services(research_drive=drives)
# Add the validated services and members into the project
project.services = stored_services
project.research_drives = drives
project.members = members
# Upsert the project.
session.merge(project)
Expand Down Expand Up @@ -149,18 +147,16 @@ async def get_drive_info(
if drive_found is None:
raise HTTPException(
status_code=404,
detail=f"Research Drive ID {drive_id} not found in local database",
detail=f"Research Drive ID {drive_id} not found in local database.",
)
projects = [
projects for services in drive_found.service for projects in services.projects
]
projects = drive_found.projects
if len(projects) == 0:
raise HTTPException(
status_code=404,
detail=f"No Projects associated with {drive_id} in local database",
)
return {
"drive_id": drive_id,
"ro_crate": "TODO: Make RO-Crate from: " + str(projects[0]),
"ro_crate": "TODO: Make RO-Crate from: " + str(projects),
"manifest": "TODO: Make Manifest",
}
9 changes: 6 additions & 3 deletions src/models/project.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@
from sqlmodel import Field, Relationship, SQLModel

from models.person import InputPerson
from models.services import InputServices, Services
from models.services import (InputServices, ResearchDriveProjectLink,
ResearchDriveService)

# Only import Member during typechecking to prevent circular dependency error.
if TYPE_CHECKING:
Expand Down Expand Up @@ -52,9 +53,11 @@ class Project(BaseProject, table=True):
"""Project model for data stored in database"""

id: Optional[int] = Field(default=None, primary_key=True)
services_id: int | None = Field(default=None, foreign_key="services.id")
# services_id: int | None = Field(default=None, foreign_key="services.id")
codes: list[Code] = Relationship(link_model=ProjectCodeLink)
services: Services = Relationship(back_populates="projects")
research_drives: list[ResearchDriveService] = Relationship(
link_model=ResearchDriveProjectLink, back_populates="projects"
)
members: list["Member"] = Relationship(
# cascade_delete enabled so session.merge() works for project save.
back_populates="project",
Expand Down
20 changes: 6 additions & 14 deletions src/models/services.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,11 @@
from models.project import Project


class ResearchDriveServicesLink(SQLModel, table=True):
class ResearchDriveProjectLink(SQLModel, table=True):
"""Linking table between research drive service and a project's service."""

service_id: int | None = Field(
default=None, foreign_key="services.id", primary_key=True
project_id: int | None = Field(
default=None, foreign_key="project.id", primary_key=True
)
research_drive_id: int | None = Field(
default=None, foreign_key="researchdriveservice.id", primary_key=True
Expand All @@ -32,20 +32,12 @@ class ResearchDriveService(SQLModel, table=True):
name: str
percentage_used: float
used_gb: float
service: list["Services"] = Relationship(link_model=ResearchDriveServicesLink)
projects: list["Project"] = Relationship(
link_model=ResearchDriveProjectLink, back_populates="research_drives"
)


class InputServices(SQLModel):
"""Input object describing relevant storage services."""

research_drive: list[ResearchDriveService]


class Services(SQLModel, table=True):
"""Object describing relevant storage services."""

id: Optional[int] = Field(default=None, primary_key=True)
projects: list["Project"] = Relationship(back_populates="services")
research_drive: list[ResearchDriveService] = Relationship(
link_model=ResearchDriveServicesLink, back_populates="service"
)

0 comments on commit 900e829

Please sign in to comment.