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 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'

View File

@@ -95,4 +95,7 @@ class Person(BaseModel):
class PersonDetail(Person):
id: UUID4
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 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)

View File

@@ -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