person full_name, draft search
This commit is contained in:
@@ -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'
|
||||||
|
|||||||
@@ -95,4 +95,7 @@ class Person(BaseModel):
|
|||||||
class PersonDetail(Person):
|
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
|
||||||
@@ -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)
|
||||||
@@ -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()
|
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
|
return objs
|
||||||
Reference in New Issue
Block a user