Skip to content

Commit

Permalink
refactor preventing circular imports
Browse files Browse the repository at this point in the history
  • Loading branch information
ChrOertlin committed Mar 26, 2024
1 parent 0f044ed commit d8b60aa
Show file tree
Hide file tree
Showing 6 changed files with 50 additions and 37 deletions.
3 changes: 2 additions & 1 deletion genotype_api/api/endpoints/users.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
from fastapi import APIRouter, Depends, Query
from pydantic import EmailStr
from sqlmodel import Session
from starlette import status

from starlette.responses import JSONResponse

Expand Down Expand Up @@ -35,7 +36,7 @@ def delete_user(
current_user: User = Depends(get_active_user),
) -> JSONResponse:
user_service.delete_user(user_id)
return JSONResponse(f"Deleted user with id: {user_id}.")
return JSONResponse(content="Deleted user with id: {user_id}.", status_code=status.HTTP_200_OK)


@router.put("/{user_id}/email", response_model=UserResponse, response_model_exclude={"plates"})
Expand Down
12 changes: 0 additions & 12 deletions genotype_api/dto/analysis.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@

from genotype_api.constants import Sexes, Types
from genotype_api.dto.genotype import GenotypeResponse
from genotype_api.dto.sample import SampleStatusResponse


class AnalysisResponse(BaseModel):
Expand All @@ -18,14 +17,3 @@ class AnalysisResponse(BaseModel):
plate_id: str | None
id: int | None
genotypes: list[GenotypeResponse] | None = None


class AnalysisSampleResponse(BaseModel):
type: Types | None
source: str | None
sex: Sexes | None
created_at: datetime | None
sample_id: str | None
plate_id: str | None
id: int | None
sample: SampleStatusResponse | None = None
29 changes: 24 additions & 5 deletions genotype_api/dto/plate.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,11 @@
from collections import Counter
from datetime import datetime

from pydantic import BaseModel, validator, Field
from genotype_api.dto.analysis import AnalysisSampleResponse
from genotype_api.dto.user import UserResponse
from pydantic import BaseModel, validator, Field, EmailStr

from genotype_api.constants import Types, Sexes

from genotype_api.dto.sample import SampleStatusResponse


class PlateStatusCounts(BaseModel):
Expand All @@ -20,6 +22,23 @@ class Config:
allow_population_by_field_name = True


class UserOnPlate(BaseModel):
email: EmailStr | None = None
name: str | None = None
id: int | None = None


class AnalysisOnPlate(BaseModel):
type: Types | None
source: str | None
sex: Sexes | None
created_at: datetime | None
sample_id: str | None
plate_id: str | None
id: int | None
sample: SampleStatusResponse | None = None


class PlateResponse(BaseModel):
created_at: datetime | None = None
plate_id: str | None = None
Expand All @@ -28,8 +47,8 @@ class PlateResponse(BaseModel):
method_document: str | None = None
method_version: str | None = None
id: str | None = None
user: UserResponse | None = None
analyses: list[AnalysisSampleResponse] | None = None
user: UserOnPlate | None = None
analyses: list[AnalysisOnPlate] | None = None
plate_status_counts: PlateStatusCounts | None = None

@validator("plate_status_counts")
Expand Down
12 changes: 10 additions & 2 deletions genotype_api/dto/user.py
Original file line number Diff line number Diff line change
@@ -1,15 +1,23 @@
"""Module for the plate DTOs."""

from datetime import datetime

from pydantic import BaseModel, EmailStr

from genotype_api.dto.plate import PlateResponse

class PlateOnUser(BaseModel):
created_at: datetime | None = None
plate_id: str | None = None
signed_by: int | None = None
signed_at: datetime | None = None
id: str | None = None


class UserResponse(BaseModel):
email: EmailStr | None = None
name: str | None = None
id: int | None = None
plates: list[PlateResponse] | None = None
plates: list[PlateOnUser] | None = None


class UserRequest(BaseModel):
Expand Down
18 changes: 8 additions & 10 deletions genotype_api/services/plate_service/plate_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,11 +30,9 @@
)
from genotype_api.database.filter_models.plate_models import PlateSignOff, PlateOrderParams
from genotype_api.database.models import Plate, Analysis, User
from genotype_api.dto.analysis import AnalysisSampleResponse
from genotype_api.dto.dto import PlateCreate
from genotype_api.dto.plate import PlateResponse
from genotype_api.dto.plate import PlateResponse, UserOnPlate, AnalysisOnPlate
from genotype_api.dto.sample import SampleStatusResponse
from genotype_api.dto.user import UserResponse
from genotype_api.file_parsing.excel import GenotypeAnalysis
from genotype_api.file_parsing.files import check_file

Expand All @@ -45,14 +43,14 @@ def __init__(self, session: Session):
self.session: Session = session

@staticmethod
def _get_analyses_on_plate(plate: Plate) -> list[AnalysisSampleResponse] | None:
analyses_response: list[AnalysisSampleResponse] = []
def _get_analyses_on_plate(plate: Plate) -> list[AnalysisOnPlate] | None:
analyses_response: list[AnalysisOnPlate] = []
for analysis in plate.analyses:
if analysis:
sample_status = SampleStatusResponse(
status=analysis.sample.status, comment=analysis.sample.comment
)
analysis_response = AnalysisSampleResponse(
analysis_response = AnalysisOnPlate(
type=analysis.type,
source=analysis.source,
sex=analysis.sex,
Expand All @@ -65,15 +63,15 @@ def _get_analyses_on_plate(plate: Plate) -> list[AnalysisSampleResponse] | None:
analyses_response.append(analysis_response)
return analyses_response if analyses_response else None

def _get_plate_user(self, plate: Plate) -> UserResponse | None:
def _get_plate_user(self, plate: Plate) -> UserOnPlate | None:
if plate.signed_by:
user: User = get_user_by_id(session=self.session, user_id=plate.signed_by)
return UserResponse(email=user.email, name=user.name, id=user.id)
return UserOnPlate(email=user.email, name=user.name, id=user.id)
return None

def _create_plate_response(self, plate: Plate) -> PlateResponse:
analyses_response: list[AnalysisSampleResponse] = self._get_analyses_on_plate(plate)
user: UserResponse = self._get_plate_user(plate)
analyses_response: list[AnalysisOnPlate] = self._get_analyses_on_plate(plate)
user: UserOnPlate = self._get_plate_user(plate)
return PlateResponse(
created_at=plate.created_at,
plate_id=plate.plate_id,
Expand Down
13 changes: 6 additions & 7 deletions genotype_api/services/user_service/user_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,8 @@
get_user_by_email,
)
from genotype_api.database.crud.update import update_user_email
from genotype_api.database.models import User, Plate
from genotype_api.dto.plate import PlateResponse
from genotype_api.dto.user import UserResponse, UserRequest
from genotype_api.database.models import User
from genotype_api.dto.user import UserResponse, UserRequest, PlateOnUser


class UserService:
Expand All @@ -25,11 +24,11 @@ def __init__(self, session: Session):
self.session: Session = session

@staticmethod
def _get_plates_on_user(user: User) -> list[PlateResponse]:
plates_response: list[PlateResponse] = []
def _get_plates_on_user(user: User) -> list[PlateOnUser]:
plates_response: list[PlateOnUser] = []
for plate in user.plates:
if plate:
plate_response = PlateResponse(
plate_response = PlateOnUser(
created_at=plate.created_at,
plate_id=plate.plate_id,
id=plate.id,
Expand All @@ -40,7 +39,7 @@ def _get_plates_on_user(user: User) -> list[PlateResponse]:
return plates_response if plates_response else None

def _create_user_response(self, user: User) -> UserResponse:
plates: list[PlateResponse] = self._get_plates_on_user(user)
plates: list[PlateOnUser] = self._get_plates_on_user(user)
return UserResponse(email=user.email, name=user.name, id=user.id, plates=plates)

def create_user(self, user: UserRequest):
Expand Down

0 comments on commit d8b60aa

Please sign in to comment.