From a2dd4b36c20df1e2b48fcd0695817e8502cf26c2 Mon Sep 17 00:00:00 2001 From: dderbentsov Date: Tue, 3 Oct 2023 00:13:29 +0300 Subject: [PATCH] person full_name, draft search --- src/personal_info/db/models.py | 20 +++++++++++++++++--- src/personal_info/db/schemas/person.py | 5 ++++- src/personal_info/routers/persons.py | 14 +++++++++++++- src/personal_info/services/persons.py | 9 +++++++++ 4 files changed, 43 insertions(+), 5 deletions(-) diff --git a/src/personal_info/db/models.py b/src/personal_info/db/models.py index 29e6a29..0760ccd 100644 --- a/src/personal_info/db/models.py +++ b/src/personal_info/db/models.py @@ -3,9 +3,10 @@ from typing import Any import datetime import sqlalchemy as sa +from sqlalchemy import event from sqlalchemy.dialects.postgresql import UUID, ARRAY from sqlalchemy.ext.declarative import declarative_base -from sqlalchemy.orm import relationship, DeclarativeBase +from sqlalchemy.orm import relationship, DeclarativeBase, column_property from sqlalchemy.sql.schema import ForeignKey #Base: Any = declarative_base() @@ -19,7 +20,12 @@ class BaseModel(Base): created_at = sa.Column(sa.TIMESTAMP, nullable=False, default=datetime.datetime.now()) updated_at = sa.Column(sa.TIMESTAMP, nullable=False, default=datetime.datetime.now(), onupdate=datetime.datetime.now()) - +def get_full_name(context): + first_name = context.get_current_parameters()['first_name'] + patronymic = context.get_current_parameters()['patronymic'] + full_name = context.get_current_parameters()['last_name'] + full_name += ' ' + first_name + ((' ' + patronymic) if patronymic is not None else '') + return full_name.lower() class Person(BaseModel): __tablename__ = 'persons' @@ -32,9 +38,17 @@ class Person(BaseModel): contacts = relationship('Contact', back_populates='person') documents = relationship('Document', back_populates='person') photos = sa.Column(ARRAY(sa.String(200))) + full_name = sa.Column(sa.String(310), default=get_full_name) + medical_card_id = sa.Column(UUID(as_uuid=True)) def __repr__(self): - return f'Person {self.last_name} {self.first_name} {self.id}' + return f'Person {self.full_name}' + +# @staticmethod +# def generate_full_name(target, value, old_value, initiator): +# pass + +# event.listen(Person.first_name, 'set', Person.generate_full_name, retval=False) class Address(BaseModel): __tablename__ = 'addresses' diff --git a/src/personal_info/db/schemas/person.py b/src/personal_info/db/schemas/person.py index 9bebc51..8564a9f 100644 --- a/src/personal_info/db/schemas/person.py +++ b/src/personal_info/db/schemas/person.py @@ -95,4 +95,7 @@ class Person(BaseModel): class PersonDetail(Person): id: UUID4 first_name: str - last_name: str \ No newline at end of file + last_name: str + +class PersonSearchIn(BaseModel): + full_name: str \ No newline at end of file diff --git a/src/personal_info/routers/persons.py b/src/personal_info/routers/persons.py index 8513ae0..6199754 100644 --- a/src/personal_info/routers/persons.py +++ b/src/personal_info/routers/persons.py @@ -4,7 +4,12 @@ from pydantic.types import UUID4 from typing import List, Optional, Dict from personal_info.db import models -from personal_info.db.schemas import (Person, PersonDetail, PersonCreate) +from personal_info.db.schemas import ( + Person, + PersonDetail, + PersonCreate, + PersonSearchIn +) from personal_info.services import PersonService, get_persons_service router = APIRouter(prefix='/persons') @@ -36,3 +41,10 @@ async def batch_list_persons( persons_service: PersonService = Depends(get_persons_service) ) -> List[models.Person]: return persons_service.batch_get(request) + +@router.post('/search', response_model=List[Person]) +async def search_person( + query_params: PersonSearchIn, + persons_service: PersonService = Depends(get_persons_service) +) -> List[models.Person]: + return persons_service.search(query_params) \ No newline at end of file diff --git a/src/personal_info/services/persons.py b/src/personal_info/services/persons.py index 1e4b59e..b11f581 100644 --- a/src/personal_info/services/persons.py +++ b/src/personal_info/services/persons.py @@ -49,4 +49,13 @@ class PersonService(BaseService[Person, PersonCreate, Any]): objs: List[models.Person] = self.db_session.query(models.Person).filter(models.Person.id.in_(request["ids"])).all() + return objs + + def search(self, query_params): + full_name = str(query_params.full_name).lower() + if full_name == '': + return [] + + objs: List[Person] = self.db_session.query(Person).filter(Person.last_name.contains(full_name)).all() + print(len(objs)) return objs \ No newline at end of file