person full_name, draft search

This commit is contained in:
dderbentsov
2023-10-03 00:13:29 +03:00
parent 5df7844588
commit a2dd4b36c2
4 changed files with 43 additions and 5 deletions

View File

@@ -3,9 +3,10 @@ from typing import Any
import datetime import datetime
import sqlalchemy as sa import sqlalchemy as sa
from sqlalchemy import event
from sqlalchemy.dialects.postgresql import UUID, ARRAY from sqlalchemy.dialects.postgresql import UUID, ARRAY
from sqlalchemy.ext.declarative import declarative_base 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 from sqlalchemy.sql.schema import ForeignKey
#Base: Any = declarative_base() #Base: Any = declarative_base()
@@ -19,7 +20,12 @@ class BaseModel(Base):
created_at = sa.Column(sa.TIMESTAMP, nullable=False, default=datetime.datetime.now()) 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()) 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): class Person(BaseModel):
__tablename__ = 'persons' __tablename__ = 'persons'
@@ -32,9 +38,17 @@ class Person(BaseModel):
contacts = relationship('Contact', back_populates='person') contacts = relationship('Contact', back_populates='person')
documents = relationship('Document', back_populates='person') documents = relationship('Document', back_populates='person')
photos = sa.Column(ARRAY(sa.String(200))) 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): 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): class Address(BaseModel):
__tablename__ = 'addresses' __tablename__ = 'addresses'

View File

@@ -96,3 +96,6 @@ class PersonDetail(Person):
id: UUID4 id: UUID4
first_name: str first_name: str
last_name: str last_name: str
class PersonSearchIn(BaseModel):
full_name: str

View File

@@ -4,7 +4,12 @@ from pydantic.types import UUID4
from typing import List, Optional, Dict from typing import List, Optional, Dict
from personal_info.db import models 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 from personal_info.services import PersonService, get_persons_service
router = APIRouter(prefix='/persons') router = APIRouter(prefix='/persons')
@@ -36,3 +41,10 @@ async def batch_list_persons(
persons_service: PersonService = Depends(get_persons_service) persons_service: PersonService = Depends(get_persons_service)
) -> List[models.Person]: ) -> List[models.Person]:
return persons_service.batch_get(request) 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)

View File

@@ -50,3 +50,12 @@ class PersonService(BaseService[Person, PersonCreate, Any]):
objs: List[models.Person] = self.db_session.query(models.Person).filter(models.Person.id.in_(request["ids"])).all() objs: List[models.Person] = self.db_session.query(models.Person).filter(models.Person.id.in_(request["ids"])).all()
return objs 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