сделал добавление линз из набора

This commit is contained in:
Андрей Дувакин 2025-03-01 14:26:13 +05:00
parent 63b472fdb6
commit 44d1dbb745
7 changed files with 99 additions and 18 deletions

View File

@ -2,6 +2,7 @@ from fastapi import APIRouter, Depends
from sqlalchemy.ext.asyncio import AsyncSession
from app.database.session import get_db
from app.domain.entities.lens import LensEntity
from app.domain.entities.set import SetEntity
from app.infrastructure.dependencies import get_current_user
from app.infrastructure.sets_service import SetsService
@ -54,6 +55,21 @@ async def update_set(
return await sets_service.update_set(set_id, _set)
@router.post(
'/sets/append_lenses/{set_id}/',
response_model=list[LensEntity],
summary='Append content from set to lenses',
description='Get all content from set, converting to lens and appending to database',
)
async def append_lenses_set(
set_id: int,
db: AsyncSession = Depends(get_db),
user=Depends(get_current_user),
):
sets_service = SetsService(db)
return await sets_service.append_set_content_to_lenses(set_id)
@router.delete(
'/sets/{set_id}/',
response_model=SetEntity,

View File

@ -0,0 +1,40 @@
"""убрал таблицу связывающую линзы и наборы
Revision ID: 429c0003ac73
Revises: e2c127e2d330
Create Date: 2025-02-27 10:49:13.829256
"""
from typing import Sequence, Union
from alembic import op
import sqlalchemy as sa
from sqlalchemy.dialects import postgresql
# revision identifiers, used by Alembic.
revision: str = '429c0003ac73'
down_revision: Union[str, None] = 'e2c127e2d330'
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None
def upgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
op.drop_table('set_lens')
# ### end Alembic commands ###
def downgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
op.create_table('set_lens',
sa.Column('id', sa.INTEGER(), autoincrement=True, nullable=False),
sa.Column('set_id', sa.INTEGER(), autoincrement=False, nullable=False),
sa.Column('lens_id', sa.INTEGER(), autoincrement=False, nullable=False),
sa.Column('created_at', postgresql.TIMESTAMP(), server_default=sa.text('now()'), autoincrement=False, nullable=False),
sa.Column('updated_at', postgresql.TIMESTAMP(), server_default=sa.text('now()'), autoincrement=False, nullable=False),
sa.ForeignKeyConstraint(['lens_id'], ['lens.id'], name='set_lens_lens_id_fkey'),
sa.ForeignKeyConstraint(['set_id'], ['sets.id'], name='set_lens_set_id_fkey'),
sa.PrimaryKeyConstraint('id', name='set_lens_pkey'),
sa.UniqueConstraint('lens_id', name='set_lens_lens_id_key')
)
# ### end Alembic commands ###

View File

@ -15,6 +15,5 @@ from app.domain.models.patients import Patient
from app.domain.models.recipients import Recipient
from app.domain.models.roles import Role
from app.domain.models.set_contents import SetContent
from app.domain.models.set_lens import SetLens
from app.domain.models.sets import Set
from app.domain.models.users import User

View File

@ -28,5 +28,4 @@ class Lens(BaseModel):
type = relationship('LensType', back_populates='lenses')
set = relationship('SetLens', back_populates='lens')
lens_issues = relationship('LensIssue', back_populates='lens')

View File

@ -1,14 +0,0 @@
from sqlalchemy import Column, Integer, ForeignKey
from sqlalchemy.orm import relationship
from app.domain.models.base import BaseModel
class SetLens(BaseModel):
__tablename__ = 'set_lens'
set_id = Column(Integer, ForeignKey('sets.id'), nullable=False)
lens_id = Column(Integer, ForeignKey('lens.id'), nullable=False, unique=True)
set = relationship('Set', back_populates='lens')
lens = relationship('Lens', back_populates='set')

View File

@ -10,4 +10,3 @@ class Set(BaseModel):
title = Column(VARCHAR(150), nullable=False, unique=True)
contents = relationship('SetContent', back_populates='set')
lens = relationship('SetLens', back_populates='set')

View File

@ -4,16 +4,19 @@ from fastapi import HTTPException
from sqlalchemy.ext.asyncio import AsyncSession
from starlette import status
from app.application.lenses_repository import LensesRepository
from app.application.set_content_repository import SetContentRepository
from app.application.sets_repository import SetsRepository
from app.domain.entities.lens import LensEntity
from app.domain.entities.set import SetEntity
from app.domain.models import Set
from app.domain.models import Set, Lens
class SetsService:
def __init__(self, db: AsyncSession):
self.sets_repository = SetsRepository(db)
self.set_content_repository = SetContentRepository(db)
self.lenses_repository = LensesRepository(db)
async def get_all_sets(self) -> list[SetEntity]:
sets = await self.sets_repository.get_all()
@ -68,6 +71,45 @@ class SetsService:
title=result.title,
)
async def append_set_content_to_lenses(self, set_id: int) -> Optional[list[LensEntity]]:
_set = await self.sets_repository.get_by_id(set_id)
if not _set:
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Set not found")
set_content = await self.set_content_repository.get_by_set_id(set_id)
lenses = []
for content in set_content:
lens = Lens(
tor=content.tor,
trial=content.trial,
esa=content.esa,
fvc=content.fvc,
preset_refraction=content.preset_refraction,
diameter=content.diameter,
periphery_toricity=content.periphery_toricity,
side=content.side,
type_id=content.type_id,
)
await self.lenses_repository.create(lens)
lenses.append(
LensEntity(
id=lens.id,
tor=lens.tor,
trial=lens.trial,
esa=lens.esa,
fvc=lens.fvc,
preset_refraction=lens.preset_refraction,
diameter=lens.diameter,
periphery_toricity=lens.periphery_toricity,
side=lens.side.value,
type_id=lens.type_id,
)
)
return lenses
@staticmethod
def model_to_entity(_set: Set) -> SetEntity:
return SetEntity(