From fc63f9e167a0ddd905e33608ffeccfeac6f85a3a Mon Sep 17 00:00:00 2001 From: Andrei Duvakin Date: Fri, 31 Jan 2025 20:48:55 +0500 Subject: [PATCH] =?UTF-8?q?=D1=81=D0=BE=D0=B7=D0=B4=D0=B0=D0=BB=20=D0=BD?= =?UTF-8?q?=D0=B5=D1=81=D0=BA=D0=BE=D0=BB=D1=8C=D0=BA=D0=BE=20=D1=82=D0=B0?= =?UTF-8?q?=D0=B1=D0=BB=D0=B8=D1=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/app/database/session.py | 2 +- api/app/domain/models/lens.py | 30 ++++++++++++++++++++++++ api/app/domain/models/lenses_types.py | 4 +++- api/app/domain/models/roles.py | 13 ++++++++++ api/app/domain/models/set_lens.py | 16 +++++++++++++ api/app/domain/models/sets.py | 14 +++++++++++ api/app/domain/models/users.py | 19 +++++++++++++++ api/app/infrastructure/logger.py | 17 ++++++++++++++ api/app/settings.py | 14 +++++++++++ api/app/{config.py => tests/__init__.py} | 0 10 files changed, 127 insertions(+), 2 deletions(-) create mode 100644 api/app/domain/models/lens.py create mode 100644 api/app/domain/models/roles.py create mode 100644 api/app/domain/models/set_lens.py create mode 100644 api/app/domain/models/sets.py create mode 100644 api/app/domain/models/users.py create mode 100644 api/app/infrastructure/logger.py create mode 100644 api/app/settings.py rename api/app/{config.py => tests/__init__.py} (100%) diff --git a/api/app/database/session.py b/api/app/database/session.py index 0d05360..e700b1f 100644 --- a/api/app/database/session.py +++ b/api/app/database/session.py @@ -1,6 +1,6 @@ from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine from sqlalchemy.orm import sessionmaker -from app.config import settings +from app.settings import settings engine = create_async_engine(settings.DATABASE_URL, echo=True) diff --git a/api/app/domain/models/lens.py b/api/app/domain/models/lens.py new file mode 100644 index 0000000..627d211 --- /dev/null +++ b/api/app/domain/models/lens.py @@ -0,0 +1,30 @@ +from enum import Enum as PyEnum +from sqlalchemy import Column, Integer, ForeignKey, Float, Enum +from sqlalchemy.orm import relationship + +from app.domain.models import Base + + +class SideEnum(PyEnum): + LEFT = 'левая' + RIGHT = 'правая' + + +class Lens(Base): + __tablename__ = 'lens' + + id = Column(Integer, primary_key=True, autoincrement=True) + tor = Column(Float, nullable=False) + trial = Column(Float, nullable=False) + esa = Column(Float, nullable=False) + fvc = Column(Float, nullable=False) # ПЦК + preset_refraction = Column(Float, nullable=False) + diameter = Column(Float, nullable=False) + periphery_toricity = Column(Float, nullable=False) # Торичность перефирии + side = Column(Enum(SideEnum), nullable=False) + + type_id = Column(Integer, ForeignKey('lenses_types.id'), nullable=False) + + type = relationship('LensesType', back_populates='lenses') + + set = relationship('SetLens', back_populates='lens') diff --git a/api/app/domain/models/lenses_types.py b/api/app/domain/models/lenses_types.py index 181fec8..0bd15b5 100644 --- a/api/app/domain/models/lenses_types.py +++ b/api/app/domain/models/lenses_types.py @@ -1,4 +1,4 @@ -from sqlalchemy import Column, Integer, VARCHAR, ForeignKey +from sqlalchemy import Column, Integer, VARCHAR from sqlalchemy.orm import relationship from app.domain.models import Base @@ -9,3 +9,5 @@ class LensesType(Base): id = Column(Integer, primary_key=True, autoincrement=True) title = Column(VARCHAR(150), nullable=False, unique=True) + + lenses = relationship('Lens', back_populates='type') diff --git a/api/app/domain/models/roles.py b/api/app/domain/models/roles.py new file mode 100644 index 0000000..7404d32 --- /dev/null +++ b/api/app/domain/models/roles.py @@ -0,0 +1,13 @@ +from sqlalchemy import Column, Integer, VARCHAR +from sqlalchemy.orm import relationship + +from app.domain.models import Base + + +class Role(Base): + __tablename__ = 'roles' + + id = Column(Integer, primary_key=True, autoincrement=True) + title = Column(VARCHAR(150), nullable=False, unique=True) + + users = relationship('User', back_populates='role') diff --git a/api/app/domain/models/set_lens.py b/api/app/domain/models/set_lens.py new file mode 100644 index 0000000..a5fe988 --- /dev/null +++ b/api/app/domain/models/set_lens.py @@ -0,0 +1,16 @@ +from sqlalchemy import Column, Integer, ForeignKey +from sqlalchemy.orm import relationship + +from app.domain.models import Base + + +class SetLens(Base): + __tablename__ = 'set_lens' + + id = Column(Integer, primary_key=True, autoincrement=True) + + 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') diff --git a/api/app/domain/models/sets.py b/api/app/domain/models/sets.py new file mode 100644 index 0000000..b554ba9 --- /dev/null +++ b/api/app/domain/models/sets.py @@ -0,0 +1,14 @@ +from sqlalchemy import Column, Integer, VARCHAR +from sqlalchemy.orm import relationship + +from app.domain.models import Base + + +class Set(Base): + __tablename__ = 'sets' + + id = Column(Integer, primary_key=True, autoincrement=True) + title = Column(VARCHAR(150), nullable=False, unique=True) + count = Column(Integer, nullable=False) + + lens = relationship('SetLens', back_populates='set') diff --git a/api/app/domain/models/users.py b/api/app/domain/models/users.py new file mode 100644 index 0000000..7baad62 --- /dev/null +++ b/api/app/domain/models/users.py @@ -0,0 +1,19 @@ +from sqlalchemy import Column, Integer, VARCHAR, ForeignKey, String +from sqlalchemy.orm import relationship + +from app.domain.models import Base + + +class User(Base): + __tablename__ = 'users' + + id = Column(Integer, primary_key=True, autoincrement=True) + first_name = Column(VARCHAR(200), nullable=False) + last_name = Column(VARCHAR(200), nullable=False) + patronymic = Column(VARCHAR(200)) + login = Column(String, nullable=False, unique=True) + password = Column(String, nullable=False) + + role_id = Column(Integer, ForeignKey('roles.id'), nullable=False) + + role = relationship('Role', back_populates='users') diff --git a/api/app/infrastructure/logger.py b/api/app/infrastructure/logger.py new file mode 100644 index 0000000..f667836 --- /dev/null +++ b/api/app/infrastructure/logger.py @@ -0,0 +1,17 @@ +import logging +from app.settings import settings +import os + +log_dir = os.path.dirname(settings.LOG_FILE) +os.makedirs(log_dir, exist_ok=True) + +logging.basicConfig( + level=settings.LOG_LEVEL.upper(), + format="%(asctime)s - %(levelname)s - %(message)s", + handlers=[ + logging.FileHandler(settings.LOG_FILE, encoding="utf-8"), + logging.StreamHandler() + ] +) + +logger = logging.getLogger(__name__) diff --git a/api/app/settings.py b/api/app/settings.py new file mode 100644 index 0000000..4850313 --- /dev/null +++ b/api/app/settings.py @@ -0,0 +1,14 @@ +from pydantic_settings import BaseSettings + + +class Settings(BaseSettings): + DATABASE_URL: str + LOG_LEVEL: str = "info" + LOG_FILE: str = "logs/app.log" + + class Config: + env_file = ".env" + env_file_encoding = "utf-8" + + +settings = Settings() diff --git a/api/app/config.py b/api/app/tests/__init__.py similarity index 100% rename from api/app/config.py rename to api/app/tests/__init__.py