From 4ff74c63eb4581a95bb9546a8e2bf32f42b6064a Mon Sep 17 00:00:00 2001 From: dderbentsov Date: Sat, 22 Jul 2023 02:14:53 +0300 Subject: [PATCH] medical card create base --- ...9f1a8_add_medical_card_unique_constaint.py | 28 +++++++++++++++++++ src/medical_info/db/models.py | 11 +++++--- src/medical_info/db/schemas/medical_card.py | 7 +++-- src/medical_info/routers/medical_cards.py | 7 ++++- 4 files changed, 46 insertions(+), 7 deletions(-) create mode 100644 alembic/versions/9bac2789f1a8_add_medical_card_unique_constaint.py diff --git a/alembic/versions/9bac2789f1a8_add_medical_card_unique_constaint.py b/alembic/versions/9bac2789f1a8_add_medical_card_unique_constaint.py new file mode 100644 index 0000000..06f983f --- /dev/null +++ b/alembic/versions/9bac2789f1a8_add_medical_card_unique_constaint.py @@ -0,0 +1,28 @@ +"""add medical card unique constaint + +Revision ID: 9bac2789f1a8 +Revises: 7f86841687c3 +Create Date: 2023-07-22 02:00:26.177149 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '9bac2789f1a8' +down_revision = '7f86841687c3' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.create_unique_constraint('person_id', 'medical_cards', ['person_id']) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_constraint('person_id', 'medical_cards', type_='unique') + # ### end Alembic commands ### diff --git a/src/medical_info/db/models.py b/src/medical_info/db/models.py index 87a485b..ef1ec9a 100644 --- a/src/medical_info/db/models.py +++ b/src/medical_info/db/models.py @@ -6,7 +6,8 @@ import sqlalchemy as sa from sqlalchemy.dialects.postgresql import UUID, ARRAY, JSONB from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import relationship, DeclarativeBase -from sqlalchemy.sql.schema import ForeignKey +from sqlalchemy.sql.schema import ForeignKey, UniqueConstraint + class Base(DeclarativeBase): pass @@ -26,12 +27,14 @@ class MedicalCard(BaseModel): health_maps = relationship('HealthMap', back_populates='medical_card') confidant_persons = sa.Column(ARRAY(UUID(as_uuid=True))) person_id = sa.Column(UUID(as_uuid=True), nullable=False) - + + __table_args__ = (UniqueConstraint("person_id", name="person_id"),) + class Checkup(BaseModel): __tablename__ = 'checkups' - medical_card_id = sa.Column(UUID(as_uuid=True), sa.ForeignKey("medical_cards.id"), nullable=False) + medical_card_id = sa.Column(UUID(as_uuid=True), ForeignKey("medical_cards.id"), nullable=False) medical_card = relationship('MedicalCard', back_populates='checkups') medic_id = sa.Column(UUID(as_uuid=True)) claims = sa.Column(ARRAY(sa.String)) # жалобы @@ -49,5 +52,5 @@ class HealthMap(BaseModel): comment = sa.Column(sa.Text) attachments = sa.Column(ARRAY(sa.String)) - medical_card_id = sa.Column(UUID(as_uuid=True), sa.ForeignKey("medical_cards.id"), nullable=False) + medical_card_id = sa.Column(UUID(as_uuid=True), ForeignKey("medical_cards.id"), nullable=False) medical_card = relationship('MedicalCard', back_populates='health_maps') \ No newline at end of file diff --git a/src/medical_info/db/schemas/medical_card.py b/src/medical_info/db/schemas/medical_card.py index d0b5174..1cb20e7 100644 --- a/src/medical_info/db/schemas/medical_card.py +++ b/src/medical_info/db/schemas/medical_card.py @@ -1,11 +1,14 @@ from pydantic import BaseModel +from pydantic.types import UUID4 class MedicalCard(BaseModel): number: str - person_id: str + person_id: UUID4 class Config: orm_mode = True class MedicalCardCreate(BaseModel): - person_id: str \ No newline at end of file + number: str + person_id: UUID4 + \ No newline at end of file diff --git a/src/medical_info/routers/medical_cards.py b/src/medical_info/routers/medical_cards.py index 9459357..b28d778 100644 --- a/src/medical_info/routers/medical_cards.py +++ b/src/medical_info/routers/medical_cards.py @@ -3,7 +3,7 @@ from fastapi.routing import APIRouter from typing import List from medical_info.db import models -from medical_info.db.schemas import MedicalCard +from medical_info.db.schemas import MedicalCard, MedicalCardCreate from medical_info.services import MedicalCardService, get_medical_cards_service router = APIRouter(prefix='/medical_cards') @@ -14,3 +14,8 @@ def list_medical_cards( ) -> List[models.MedicalCard]: return medical_cards_service.list() +@router.post('/', status_code=201, response_model=MedicalCard) +async def create_medical_card( + medical_card: MedicalCardCreate, medical_cards_service: MedicalCardService = Depends(get_medical_cards_service) +) -> models.MedicalCard: + return medical_cards_service.create(medical_card) \ No newline at end of file