From 446fbdab1c1231dd88c2daa82201f17c1ac8d2af Mon Sep 17 00:00:00 2001 From: dderbentsov Date: Sat, 5 Aug 2023 02:55:01 +0300 Subject: [PATCH] fix medical card detail --- src/medical_info/db/schemas/medical_card.py | 2 +- src/medical_info/routers/medical_cards.py | 7 ++-- src/medical_info/services/medical_cards.py | 41 ++++++++++++--------- 3 files changed, 29 insertions(+), 21 deletions(-) diff --git a/src/medical_info/db/schemas/medical_card.py b/src/medical_info/db/schemas/medical_card.py index 2571f1f..bf3d032 100644 --- a/src/medical_info/db/schemas/medical_card.py +++ b/src/medical_info/db/schemas/medical_card.py @@ -24,7 +24,7 @@ class MedicalCardBase(BaseModel): orm_mode = True -class MedicalCardDetail(BaseModel): +class MedicalCardDetailOut(BaseModel): id: UUID4 number: str created_at: datetime diff --git a/src/medical_info/routers/medical_cards.py b/src/medical_info/routers/medical_cards.py index 36b48ee..6cb2404 100644 --- a/src/medical_info/routers/medical_cards.py +++ b/src/medical_info/routers/medical_cards.py @@ -5,7 +5,8 @@ from pydantic.types import UUID4 from medical_info.db import models, schemas from medical_info.db.schemas import ( MedicalCardOut, - MedicalCardResponse, MedicalCardCreate, MedicalCardBase,MedicalCardDetail, MedicalCardUpdateRq) + MedicalCardDetailOut, + MedicalCardResponse, MedicalCardCreate, MedicalCardBase, MedicalCardUpdateRq) from medical_info.services import MedicalCardService, get_medical_cards_service router = APIRouter(prefix='/medical_cards') @@ -17,10 +18,10 @@ def list_medical_cards( ): return medical_cards_service.list(searchstring) -@router.get('/{medical_card_id}', response_model=MedicalCardDetail) +@router.get('/{medical_card_id}', response_model=MedicalCardDetailOut) async def get_medical_card( medical_card_id: UUID4, medical_cards_service: MedicalCardService = Depends(get_medical_cards_service) -) -> Optional[MedicalCardDetail]: +) -> Optional[MedicalCardDetailOut]: return medical_cards_service.get(medical_card_id) @router.post('/', status_code=201, response_model=schemas.MedicalCardBase) diff --git a/src/medical_info/services/medical_cards.py b/src/medical_info/services/medical_cards.py index c19063c..2cc027e 100644 --- a/src/medical_info/services/medical_cards.py +++ b/src/medical_info/services/medical_cards.py @@ -2,8 +2,9 @@ from typing import Any, List, Optional from medical_info.db.models import MedicalCard from medical_info.db.schemas import ( PersonOut, - MedicalCardOut, - MedicalCardCreate, MedicalCardBase, MedicalCardResponse, MedicalCardDetail) + MedicalCardOut, + MedicalCardDetailOut, + MedicalCardCreate, MedicalCardBase, MedicalCardResponse) from medical_info.services.base import BaseService from sqlalchemy.orm import Session from pydantic import parse_obj_as @@ -20,7 +21,6 @@ class MedicalCardService(BaseService[MedicalCard, MedicalCardCreate, Any]): self.PERSONAL_INFO_URL = os.environ.get('ASTRA-PESONAL-INFORMATION') or LOCAL_PERSONAL_INFO_URL def get_persons(self, searchstring: str) -> List[PersonOut]: - try: response = httpx.get(f'{self.PERSONAL_INFO_URL}/?full_name={searchstring}') response.raise_for_status() @@ -31,7 +31,20 @@ class MedicalCardService(BaseService[MedicalCard, MedicalCardCreate, Any]): print(f"Ошибка {exc.response.status_code} при запросе {exc.request.url!r}.") raise HTTPException(status_code=exc.response.status_code, detail=f"Ошибка вызова {exc.request.url!r}.") - return parse_obj_as(List[schemas.PersonOut], response.json()) + return parse_obj_as(List[PersonOut], response.json()) + + def get_person(self, id: UUID4) -> PersonOut: + try: + response = httpx.get(f'{self.PERSONAL_INFO_URL}/{id}') + response.raise_for_status() + except httpx.RequestError as exc: + print(f"Ошибка вызова {exc.request.url!r}.") + raise HTTPException(status_code=500, detail=f"Ошибка вызова {exc.request.url!r}.") + except httpx.HTTPStatusError as exc: + print(f"Ошибка {exc.response.status_code} при запросе {exc.request.url!r}.") + raise HTTPException(status_code=exc.response.status_code, detail=f"Ошибка вызова {exc.request.url!r}.") + + return parse_obj_as(PersonOut, response.json()) def list(self, searchstring: str) -> Any: if searchstring is None or searchstring == '': @@ -53,21 +66,15 @@ class MedicalCardService(BaseService[MedicalCard, MedicalCardCreate, Any]): return medical_cards - def get(self, id: UUID4) -> Optional[schemas.MedicalCardDetail]: - obj: Optional[models.MedicalCard] = self.db_session.get(self.model, id) - if obj is None: - raise HTTPException(status_code=404, detail='NotFound') + def get(self, id: UUID4) -> Optional[MedicalCardDetailOut]: + medical_card_obj: Optional[models.MedicalCard] = self.db_session.get(self.model, id) + if medical_card_obj is None: + raise HTTPException(status_code=404, detail=f'Медкарта {id} не найдена') - personal_information_host = os.getenv('ASTRA-PESONAL-INFORMATION') - #personal_information_host = 'http://localhost:8001/persons' + medical_card = MedicalCardDetailOut.from_orm(medical_card_obj) + medical_card.person = self.get_person(medical_card_obj.person_id) - #TODO обработка ошибок ответа сервиса personal_info - - person_response = requests.get(f'{personal_information_host}/{obj.person_id}') - - medical_info = schemas.MedicalCardDetail.from_orm(obj).dict() - medical_info['person'] = schemas.PersonDetail(**person_response.json()).dict() - return medical_info + return medical_card def update(self, id: UUID4, mc_request: schemas.MedicalCardUpdateRq) -> Optional[MedicalCard]: mc_obj = self.db_session.get(self.model, id)