diff --git a/src/medical_info/db/schemas/medical_card.py b/src/medical_info/db/schemas/medical_card.py index 53add1a..3fda385 100644 --- a/src/medical_info/db/schemas/medical_card.py +++ b/src/medical_info/db/schemas/medical_card.py @@ -24,15 +24,42 @@ class MedicalCardBase(BaseModel): class Config: orm_mode = True -class MedicalCards(BaseModel): - __root__: List[MedicalCardBase] - class Config: - orm_mode = True +class AddressCreate(BaseModel): + category: str + region: Optional[str] + city: Optional[str] + street: Optional[str] + house: Optional[str] + flat: Optional[str] +class ContactCreate(BaseModel): + category: str + value: str + +class DocumentCreate(BaseModel): + category: str + series: str + number: str + issued_by: str + issued_at: Optional[date] + attachments: Optional[List[str]] + + +class PersonDetail(BaseModel): + first_name: str + last_name: str + patronymic: Optional[str] + gender: Optional[str] + birth_date: Optional[date] + addresses: Optional[List[AddressCreate]] = [] + contacts: Optional[List[ContactCreate]] = [] + documents: Optional[List[DocumentCreate]] = [] + photos: Optional[List[str]] = [] class MedicalCardDetail(BaseModel): id: UUID4 - number: Optional[str] - - created_at: Optional[datetime] + number: str + created_at: datetime + person_id: UUID4 + person: Optional[PersonDetail] class Config: orm_mode = True \ No newline at end of file diff --git a/src/medical_info/routers/medical_cards.py b/src/medical_info/routers/medical_cards.py index 57ad660..3304c07 100644 --- a/src/medical_info/routers/medical_cards.py +++ b/src/medical_info/routers/medical_cards.py @@ -17,7 +17,7 @@ def list_medical_cards( @router.get('/{medical_card_id}', response_model=MedicalCardDetail) async def get_medical_card( medical_card_id: UUID4, medical_cards_service: MedicalCardService = Depends(get_medical_cards_service) -) -> Optional[models.MedicalCard]: +) -> Optional[MedicalCardDetail]: return medical_cards_service.get(medical_card_id) @router.post('/', status_code=201, response_model=MedicalCardBase) diff --git a/src/medical_info/services/medical_cards.py b/src/medical_info/services/medical_cards.py index 747ce4e..bb32af8 100644 --- a/src/medical_info/services/medical_cards.py +++ b/src/medical_info/services/medical_cards.py @@ -1,10 +1,11 @@ -from typing import Any, List +from typing import Any, List, Optional from medical_info.db.models import MedicalCard -from medical_info.db.schemas import MedicalCardCreate, MedicalCardBase, MedicalCardResponse, MedicalCards +from medical_info.db.schemas import MedicalCardCreate, MedicalCardBase, MedicalCardResponse, PersonDetail, MedicalCardDetail from medical_info.services.base import BaseService from sqlalchemy.orm import Session from sqlalchemy.sql.expression import literal from pydantic import parse_obj_as +import requests class MedicalCardService(BaseService[MedicalCard, MedicalCardCreate, Any]): def __init__(self, db_session: Session): @@ -14,15 +15,24 @@ class MedicalCardService(BaseService[MedicalCard, MedicalCardCreate, Any]): medical_cards_rows = self.db_session.query(MedicalCard).all() medical_cards = parse_obj_as(List[MedicalCardBase], medical_cards_rows) - # medical_cards = MedicalCards.from_orm(medical_cards_rows) - medical_cards = [medical_card.dict() for medical_card in medical_cards] - - # medical_cards = medical_cards["__root__"] - print(medical_cards) person = {'full_name': 'Жижин Антон Семенович', 'birth_date': '2012-03-10'} for m in medical_cards: print(m) m["person"] = person - return medical_cards \ No newline at end of file + return medical_cards + + def get(self, id: Any) -> Optional[MedicalCard]: + obj: Optional[MedicalCard] = self.db_session.get(self.model, id) + if obj is None: + raise HTTPException(status_code=404, detail='NotFound') + + personal_information_host = os.getenv('ASTRA-PESONAL-INFORMATION') + # personal_information_host = 'http://localhost:8001/persons' + + response = requests.get(f'{personal_information_host}/{obj.person_id}') + + medical_info = MedicalCardDetail.from_orm(obj).dict() + medical_info['person'] = PersonDetail(**response.json()).dict() + return medical_info \ No newline at end of file