ref CRU Medical Cards

This commit is contained in:
dderbentsov
2023-08-05 03:14:53 +03:00
parent 446fbdab1c
commit b25fdebdbf
3 changed files with 29 additions and 55 deletions

View File

@@ -1,29 +1,13 @@
from pydantic import BaseModel from pydantic import BaseModel
from pydantic.types import UUID4, Json from pydantic.types import UUID4
from typing import List, Optional, Any from typing import Optional
from datetime import date, datetime from datetime import date, datetime
from .persons import PersonOut from .persons import PersonOut
class MedicalCardResponse(BaseModel): class MedicalCardCreateIn(BaseModel):
id: UUID4
number: Optional[str]
person_id: UUID4
person: PersonOut
created_at: Optional[datetime]
class MedicalCardCreate(BaseModel):
number: str number: str
person_id: UUID4 person_id: UUID4
class MedicalCardBase(BaseModel):
id: UUID4
class Config:
orm_mode = True
class MedicalCardDetailOut(BaseModel): class MedicalCardDetailOut(BaseModel):
id: UUID4 id: UUID4
number: str number: str
@@ -33,30 +17,8 @@ class MedicalCardDetailOut(BaseModel):
class Config: class Config:
orm_mode = True orm_mode = True
class MedicalCardSimple(BaseModel): class MedicalCardUpdateIn(BaseModel):
id: UUID4
number: Optional[str]
person_id: UUID4
created_at: Optional[datetime]
class Config:
orm_mode = True
class MedicalCard(BaseModel):
id: UUID4
number: str number: str
created_at: datetime
person_id: UUID4
class Config:
orm_mode = True
class MedicalCardUpdateRq(BaseModel):
number: str | None
class MedicalCardUpdateRs(BaseModel):
id: UUID4
number: str
created_at: datetime
person_id: UUID4
class Config: class Config:
orm_mode = True orm_mode = True
@@ -66,5 +28,13 @@ class MedicalCardOut(BaseModel):
created_at: datetime created_at: datetime
person_id: UUID4 person_id: UUID4
person: Optional[PersonOut] person: Optional[PersonOut]
class Config:
orm_mode = True
class MedicalCardShortOut(BaseModel):
id: UUID4
number: str
created_at: datetime
person_id: UUID4
class Config: class Config:
orm_mode = True orm_mode = True

View File

@@ -2,11 +2,14 @@ from fastapi import Depends
from fastapi.routing import APIRouter from fastapi.routing import APIRouter
from typing import List, Optional from typing import List, Optional
from pydantic.types import UUID4 from pydantic.types import UUID4
from medical_info.db import models, schemas from medical_info.db import models
from medical_info.db.schemas import ( from medical_info.db.schemas import (
MedicalCardOut, MedicalCardOut,
MedicalCardDetailOut, MedicalCardDetailOut,
MedicalCardResponse, MedicalCardCreate, MedicalCardBase, MedicalCardUpdateRq) MedicalCardCreateIn,
MedicalCardUpdateIn,
MedicalCardShortOut
)
from medical_info.services import MedicalCardService, get_medical_cards_service from medical_info.services import MedicalCardService, get_medical_cards_service
router = APIRouter(prefix='/medical_cards') router = APIRouter(prefix='/medical_cards')
@@ -24,16 +27,16 @@ async def get_medical_card(
) -> Optional[MedicalCardDetailOut]: ) -> Optional[MedicalCardDetailOut]:
return medical_cards_service.get(medical_card_id) return medical_cards_service.get(medical_card_id)
@router.post('/', status_code=201, response_model=schemas.MedicalCardBase) @router.post('/', status_code=201, response_model=MedicalCardShortOut)
async def create_medical_card( async def create_medical_card(
medical_card: MedicalCardCreate, medical_cards_service: MedicalCardService = Depends(get_medical_cards_service) medical_card: MedicalCardCreateIn, medical_cards_service: MedicalCardService = Depends(get_medical_cards_service)
) -> models.MedicalCard: ) -> models.MedicalCard:
return medical_cards_service.create(medical_card) return medical_cards_service.create(medical_card)
@router.patch('/{medical_card_id}', response_model=schemas.MedicalCardUpdateRs) @router.patch('/{medical_card_id}', response_model=MedicalCardUpdateIn)
async def update_medical_card( async def update_medical_card(
medical_card_id: UUID4, medical_card_id: UUID4,
medical_card: MedicalCardUpdateRq, medical_card: MedicalCardUpdateIn,
medical_cards_service: MedicalCardService = Depends(get_medical_cards_service) medical_cards_service: MedicalCardService = Depends(get_medical_cards_service)
) -> Optional[models.MedicalCard]: ) -> Optional[models.MedicalCard]:
return medical_cards_service.update(medical_card_id, medical_card) return medical_cards_service.update(medical_card_id, medical_card)

View File

@@ -1,22 +1,23 @@
from typing import Any, List, Optional from typing import Any, List, Optional
from medical_info.db.models import MedicalCard
from medical_info.db.schemas import ( from medical_info.db.schemas import (
PersonOut, PersonOut,
MedicalCardOut, MedicalCardOut,
MedicalCardDetailOut, MedicalCardDetailOut,
MedicalCardCreate, MedicalCardBase, MedicalCardResponse) MedicalCardCreateIn,
MedicalCardUpdateIn
)
from medical_info.services.base import BaseService from medical_info.services.base import BaseService
from sqlalchemy.orm import Session from sqlalchemy.orm import Session
from pydantic import parse_obj_as from pydantic import parse_obj_as
from pydantic.types import UUID4 from pydantic.types import UUID4
from medical_info.db import schemas, models from medical_info.db import models
from starlette.exceptions import HTTPException from starlette.exceptions import HTTPException
import os import os
import httpx import httpx
class MedicalCardService(BaseService[MedicalCard, MedicalCardCreate, Any]): class MedicalCardService(BaseService[models.MedicalCard, MedicalCardCreateIn, Any]):
def __init__(self, db_session: Session): def __init__(self, db_session: Session):
super(MedicalCardService, self).__init__(MedicalCard, db_session) super(MedicalCardService, self).__init__(models.MedicalCard, db_session)
LOCAL_PERSONAL_INFO_URL = 'http://localhost:8001/persons' LOCAL_PERSONAL_INFO_URL = 'http://localhost:8001/persons'
self.PERSONAL_INFO_URL = os.environ.get('ASTRA-PESONAL-INFORMATION') or LOCAL_PERSONAL_INFO_URL self.PERSONAL_INFO_URL = os.environ.get('ASTRA-PESONAL-INFORMATION') or LOCAL_PERSONAL_INFO_URL
@@ -46,7 +47,7 @@ class MedicalCardService(BaseService[MedicalCard, MedicalCardCreate, Any]):
return parse_obj_as(PersonOut, response.json()) return parse_obj_as(PersonOut, response.json())
def list(self, searchstring: str) -> Any: def list(self, searchstring: str) -> List[MedicalCardOut]:
if searchstring is None or searchstring == '': if searchstring is None or searchstring == '':
raise HTTPException(status_code=409, detail='searchstring is required') raise HTTPException(status_code=409, detail='searchstring is required')
@@ -76,7 +77,7 @@ class MedicalCardService(BaseService[MedicalCard, MedicalCardCreate, Any]):
return medical_card return medical_card
def update(self, id: UUID4, mc_request: schemas.MedicalCardUpdateRq) -> Optional[MedicalCard]: def update(self, id: UUID4, mc_request: MedicalCardUpdateIn) -> Optional[MedicalCardOut]:
mc_obj = self.db_session.get(self.model, id) mc_obj = self.db_session.get(self.model, id)
if mc_obj is None: if mc_obj is None:
raise HTTPException(status_code=404, detail='NotFound') raise HTTPException(status_code=404, detail='NotFound')