From a30fb1584fb6b46d69a51df0d86c049e7255f37d Mon Sep 17 00:00:00 2001 From: dderbentsov Date: Thu, 3 Aug 2023 03:34:25 +0300 Subject: [PATCH] VIP super ultra draft medical card search) --- src/medical_info/db/schemas/medical_card.py | 7 ++-- src/medical_info/routers/medical_cards.py | 3 +- src/medical_info/services/medical_cards.py | 36 ++++++++++++++------- 3 files changed, 32 insertions(+), 14 deletions(-) diff --git a/src/medical_info/db/schemas/medical_card.py b/src/medical_info/db/schemas/medical_card.py index 580b230..e2c86dc 100644 --- a/src/medical_info/db/schemas/medical_card.py +++ b/src/medical_info/db/schemas/medical_card.py @@ -4,11 +4,14 @@ from typing import List, Optional, Any from datetime import date, datetime class Person(BaseModel): - full_name: str - birth_date: date + first_name: str + last_name: str + patronymic: Optional[str] + birth_date: Optional[date] class MedicalCardResponse(BaseModel): id: UUID4 number: Optional[str] + person_id: UUID4 person: Person created_at: Optional[datetime] diff --git a/src/medical_info/routers/medical_cards.py b/src/medical_info/routers/medical_cards.py index 79cdb62..8b7a83b 100644 --- a/src/medical_info/routers/medical_cards.py +++ b/src/medical_info/routers/medical_cards.py @@ -10,9 +10,10 @@ router = APIRouter(prefix='/medical_cards') @router.get('/', response_model=List[MedicalCardResponse]) def list_medical_cards( + searchstring: str = '', medical_cards_service: MedicalCardService = Depends(get_medical_cards_service) ): - return medical_cards_service.list('sss') + return medical_cards_service.list(searchstring) @router.get('/{medical_card_id}', response_model=MedicalCardDetail) async def get_medical_card( diff --git a/src/medical_info/services/medical_cards.py b/src/medical_info/services/medical_cards.py index bf63fa2..17a74ec 100644 --- a/src/medical_info/services/medical_cards.py +++ b/src/medical_info/services/medical_cards.py @@ -7,30 +7,44 @@ from pydantic import parse_obj_as from pydantic.types import UUID4 from medical_info.db import schemas, models import requests +from starlette.exceptions import HTTPException class MedicalCardService(BaseService[MedicalCard, MedicalCardCreate, Any]): def __init__(self, db_session: Session): super(MedicalCardService, self).__init__(MedicalCard, db_session) def list(self, searchstring: str) -> Any: - objs = self.db_session.query(models.MedicalCard).all() - medical_cards = parse_obj_as(List[schemas.MedicalCard], objs) + #TODO установи корректные коды ошибки + if searchstring is None or searchstring == '': + raise HTTPException(status_code=404, detail='searchstring is required') - medical_cards = [medical_card.dict() for medical_card in medical_cards] - - # personal_information_host = 'http://localhost:8001/persons' + personal_information_host = os.getenv('ASTRA-PESONAL-INFORMATION') + #personal_information_host = 'http://localhost:8001/persons' #TODO обобщение хоста personal_info #TODO обработка ошибок ответа сервиса personal_info - # CONTINUE + person_response = requests.get(f'{personal_information_host}/?full_name={searchstring}') + + persons = person_response.json() + person_ids = [person['id'] for person in persons] - # person_response = requests.get(f'{personal_information_host}/{obj.person_id}') + if len(person_ids) < 1: + return [] - person = {'full_name': 'Жижин Антон Семенович', 'birth_date': '2012-03-10'} + + objs = self.db_session.query(models.MedicalCard).filter(models.MedicalCard.person_id.in_(person_ids)).all() + medical_cards = parse_obj_as(List[schemas.MedicalCard], objs) + medical_cards = [medical_card.dict() for medical_card in medical_cards] + + + res = list() for m in medical_cards: - print(m) - m["person"] = person - return medical_cards + + person = next(filter(lambda person: str(person["id"]) == str(m["person_id"]) , persons), None) + if person is not None: + m['person'] = {**person} + res.append(m) + return res def get(self, id: UUID4) -> Optional[schemas.MedicalCardDetail]: obj: Optional[models.MedicalCard] = self.db_session.get(self.model, id)