версия ленивого Кирилла
This commit is contained in:
@@ -1,17 +1,76 @@
|
||||
import uuid
|
||||
from typing import Any
|
||||
import datetime
|
||||
|
||||
import sqlalchemy as sa
|
||||
from sqlalchemy.dialects.postgresql import UUID
|
||||
from sqlalchemy.dialects.postgresql import UUID, ARRAY
|
||||
from sqlalchemy.ext.declarative import declarative_base
|
||||
from sqlalchemy.orm import relationship
|
||||
from sqlalchemy.orm import relationship, DeclarativeBase
|
||||
from sqlalchemy.sql.schema import ForeignKey
|
||||
|
||||
Base: Any = declarative_base()
|
||||
#Base: Any = declarative_base()
|
||||
class Base(DeclarativeBase):
|
||||
pass
|
||||
|
||||
class Person(Base):
|
||||
__tablename__ = 'people'
|
||||
class BaseModel(Base):
|
||||
__abstract__ = True
|
||||
|
||||
id = sa.Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
|
||||
first_name = sa.Column(sa.Text, nullable=False)
|
||||
last_name = sa.Column(sa.Text, nullable=False)
|
||||
id = sa.Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4, index=True)
|
||||
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())
|
||||
|
||||
|
||||
class Person(BaseModel):
|
||||
__tablename__ = 'persons'
|
||||
|
||||
first_name = sa.Column(sa.String(100), nullable=False)
|
||||
last_name = sa.Column(sa.String(100), nullable=False)
|
||||
patronymic = sa.Column(sa.String(100))
|
||||
gender = sa.Column(sa.String(50))
|
||||
birth_date = sa.Column(sa.Date)
|
||||
addresses = relationship('Address', back_populates='person')
|
||||
contacts = relationship('Contact', back_populates='person')
|
||||
documents = relationship('Document', back_populates='person')
|
||||
photos = sa.Column(ARRAY(sa.String(200)))
|
||||
|
||||
def __repr__(self):
|
||||
return f'Person {self.last_name} {self.first_name} {self.id}'
|
||||
|
||||
class Address(BaseModel):
|
||||
__tablename__ = 'addresses'
|
||||
category = sa.Column(sa.String(30), nullable=False)
|
||||
region = sa.Column(sa.String(100))
|
||||
city = sa.Column(sa.String(100))
|
||||
street = sa.Column(sa.String(100))
|
||||
house = sa.Column(sa.String(100))
|
||||
flat = sa.Column(sa.String(100))
|
||||
person_id = sa.Column(UUID(as_uuid=True), sa.ForeignKey("persons.id"), nullable=False)
|
||||
person = relationship('Person', back_populates='addresses')
|
||||
|
||||
def __repr__(self):
|
||||
return f'Address {self.city} {self.street} {self.id}'
|
||||
|
||||
class Contact(BaseModel):
|
||||
__tablename__ = 'contacts'
|
||||
category = sa.Column(sa.String(30), nullable=False)
|
||||
value = sa.Column(sa.String(100), nullable=False)
|
||||
person_id = sa.Column(UUID(as_uuid=True), sa.ForeignKey("persons.id"), nullable=False)
|
||||
person = relationship('Person', back_populates='contacts')
|
||||
|
||||
def __repr__(self):
|
||||
return f'Contact {self.category} {self.value} {self.id}'
|
||||
|
||||
class Document(BaseModel):
|
||||
__tablename__ = 'documents'
|
||||
|
||||
category = sa.Column(sa.String(30), nullable=False)
|
||||
series = sa.Column(sa.String(30), nullable=False)
|
||||
number = sa.Column(sa.String(50), nullable=False)
|
||||
issued_by = sa.Column(sa.String(200), nullable=False)
|
||||
issued_at = sa.Column(sa.Date)
|
||||
person_id = sa.Column(UUID(as_uuid=True), sa.ForeignKey("persons.id"), nullable=False)
|
||||
person = relationship('Person', back_populates='documents')
|
||||
attachments = sa.Column(ARRAY(sa.String(200)))
|
||||
|
||||
def __repr__(self):
|
||||
return f'Document {self.category} {self.number} {self.id}'
|
||||
@@ -1,20 +1,56 @@
|
||||
from datetime import datetime
|
||||
from typing import List
|
||||
from datetime import date
|
||||
from typing import List, Optional
|
||||
|
||||
from pydantic import BaseModel, Field
|
||||
from pydantic import BaseModel, Field, ConfigDict
|
||||
from pydantic.types import UUID4
|
||||
|
||||
class Person(BaseModel):
|
||||
id: UUID4
|
||||
first_name: str
|
||||
last_name: str
|
||||
|
||||
class Config:
|
||||
orm_mode = True
|
||||
orm_mode = True
|
||||
|
||||
class PersonCreate(BaseModel):
|
||||
class PersonBase(BaseModel):
|
||||
first_name: str
|
||||
last_name: str
|
||||
patronymic: Optional[str]
|
||||
gender: Optional[str]
|
||||
birth_date: Optional[date]
|
||||
|
||||
class Config:
|
||||
validate_assignment=True
|
||||
revalidate_instances='always'
|
||||
orm_mode = True
|
||||
# extra='ignore'
|
||||
|
||||
class AddressCreate(BaseModel):
|
||||
category: str
|
||||
region: Optional[str]
|
||||
city: Optional[str]
|
||||
street: Optional[str]
|
||||
house: Optional[str]
|
||||
flat: Optional[str]
|
||||
|
||||
class ContactCreate(BaseModel):
|
||||
category: str
|
||||
value: str
|
||||
|
||||
class DocumentCreate(BaseModel):
|
||||
category: str
|
||||
series: str
|
||||
number: str
|
||||
issued_by: str
|
||||
issued_at: Optional[date]
|
||||
attachments: Optional[List[str]]
|
||||
|
||||
class PersonCreate(PersonBase):
|
||||
|
||||
addresses: Optional[List[AddressCreate]] = []
|
||||
contacts: Optional[List[ContactCreate]] = []
|
||||
documents: Optional[List[DocumentCreate]] = []
|
||||
photos: Optional[List[str]] = []
|
||||
|
||||
|
||||
class PersonDetail(Person):
|
||||
id: UUID4
|
||||
|
||||
@@ -13,8 +13,6 @@ router = APIRouter(prefix='/persons')
|
||||
async def list_persons(
|
||||
persons_service: PersonService = Depends(get_persons_service),
|
||||
) -> List[models.Person]:
|
||||
print('=======================================')
|
||||
print(persons_service.list())
|
||||
return persons_service.list()
|
||||
|
||||
@router.get('/{person_id}', response_model=PersonDetail)
|
||||
|
||||
@@ -3,7 +3,7 @@ from sqlalchemy.orm import Session
|
||||
|
||||
from personal_info.db.session import get_session
|
||||
|
||||
from .people import PersonService
|
||||
from .persons import PersonService
|
||||
|
||||
def get_persons_service(db_session: Session = Depends(get_session)) -> PersonService:
|
||||
return PersonService(db_session)
|
||||
|
||||
@@ -1,20 +0,0 @@
|
||||
from typing import Any
|
||||
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from personal_info.db.models import Person
|
||||
from personal_info.db.schemas import PersonCreate
|
||||
|
||||
from personal_info.services.base import BaseService
|
||||
|
||||
class PersonService(BaseService[Person, PersonCreate, Any]):
|
||||
def __init__(self, db_session: Session):
|
||||
super(PersonService, self).__init__(Person, db_session)
|
||||
|
||||
# def create(self, obj: PersonCreate) -> Person:
|
||||
|
||||
# person: Person = Person()
|
||||
# self.db_session.add(person)
|
||||
# self.db_session.flush()
|
||||
# self.db_session.commit()
|
||||
# return person
|
||||
39
src/personal_info/services/persons.py
Normal file
39
src/personal_info/services/persons.py
Normal file
@@ -0,0 +1,39 @@
|
||||
from typing import Any
|
||||
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from personal_info.db.models import Person, Address, Document, Contact
|
||||
from personal_info.db.schemas import PersonCreate, PersonBase
|
||||
|
||||
from personal_info.services.base import BaseService
|
||||
|
||||
class PersonService(BaseService[Person, PersonCreate, Any]):
|
||||
def __init__(self, db_session: Session):
|
||||
super(PersonService, self).__init__(Person, db_session)
|
||||
|
||||
def create(self, obj: PersonCreate) -> Person:
|
||||
print('= raw' * 3 )
|
||||
print(obj)
|
||||
person_obj = PersonBase(**obj.dict())
|
||||
person = super(PersonService, self).create(person_obj)
|
||||
|
||||
addresses = [
|
||||
Address(**address.dict(), person_id=person.id) for address in obj.addresses
|
||||
]
|
||||
self.db_session.add_all(addresses)
|
||||
self.db_session.commit()
|
||||
|
||||
documents = [
|
||||
Document(**document.dict(), person_id=person.id) for document in obj.documents
|
||||
]
|
||||
self.db_session.add_all(documents)
|
||||
self.db_session.commit()
|
||||
|
||||
contacts = [
|
||||
Contact(**contact.dict(), person_id=person.id) for contact in obj.contacts
|
||||
]
|
||||
self.db_session.add_all(contacts)
|
||||
self.db_session.commit()
|
||||
|
||||
return person
|
||||
|
||||
Reference in New Issue
Block a user