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

View File

@@ -2,11 +2,14 @@ from fastapi import Depends
from fastapi.routing import APIRouter
from typing import List, Optional
from pydantic.types import UUID4
from medical_info.db import models, schemas
from medical_info.db import models
from medical_info.db.schemas import (
MedicalCardOut,
MedicalCardDetailOut,
MedicalCardResponse, MedicalCardCreate, MedicalCardBase, MedicalCardUpdateRq)
MedicalCardCreateIn,
MedicalCardUpdateIn,
MedicalCardShortOut
)
from medical_info.services import MedicalCardService, get_medical_cards_service
router = APIRouter(prefix='/medical_cards')
@@ -24,16 +27,16 @@ async def get_medical_card(
) -> Optional[MedicalCardDetailOut]:
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(
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:
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(
medical_card_id: UUID4,
medical_card: MedicalCardUpdateRq,
medical_card: MedicalCardUpdateIn,
medical_cards_service: MedicalCardService = Depends(get_medical_cards_service)
) -> Optional[models.MedicalCard]:
return medical_cards_service.update(medical_card_id, medical_card)

View File

@@ -1,22 +1,23 @@
from typing import Any, List, Optional
from medical_info.db.models import MedicalCard
from medical_info.db.schemas import (
PersonOut,
MedicalCardOut,
MedicalCardDetailOut,
MedicalCardCreate, MedicalCardBase, MedicalCardResponse)
MedicalCardCreateIn,
MedicalCardUpdateIn
)
from medical_info.services.base import BaseService
from sqlalchemy.orm import Session
from pydantic import parse_obj_as
from pydantic.types import UUID4
from medical_info.db import schemas, models
from medical_info.db import models
from starlette.exceptions import HTTPException
import os
import httpx
class MedicalCardService(BaseService[MedicalCard, MedicalCardCreate, Any]):
class MedicalCardService(BaseService[models.MedicalCard, MedicalCardCreateIn, Any]):
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'
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())
def list(self, searchstring: str) -> Any:
def list(self, searchstring: str) -> List[MedicalCardOut]:
if searchstring is None or searchstring == '':
raise HTTPException(status_code=409, detail='searchstring is required')
@@ -76,7 +77,7 @@ class MedicalCardService(BaseService[MedicalCard, MedicalCardCreate, Any]):
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)
if mc_obj is None:
raise HTTPException(status_code=404, detail='NotFound')