diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index 8946ac7..b72ef31 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -18,12 +18,12 @@ jobs: docker run -d -p 5432:5432 -e POSTGRES_HOST_AUTH_METHOD=trust --name db-test postgres:15-alpine - uses: actions/setup-python@v4 with: - python-version: '3.10' + python-version: '3.11' - name: Install dependencies run: | python -m ensurepip python -m pip install --upgrade pip - pip install -r requirements.txt -r requirements.dev.txt + pip install --upgrade -r requirements.txt -r requirements.dev.txt - name: Migrate DB run: | DB_DSN=postgresql://postgres@localhost:5432/postgres alembic upgrade head diff --git a/migrations/env.py b/migrations/env.py index f143453..316daad 100644 --- a/migrations/env.py +++ b/migrations/env.py @@ -50,7 +50,7 @@ def run_migrations_online(): """ configuration = config.get_section(config.config_ini_section) - configuration['sqlalchemy.url'] = settings.DB_DSN + configuration['sqlalchemy.url'] = str(settings.DB_DSN) connectable = engine_from_config( configuration, prefix="sqlalchemy.", diff --git a/requirements.txt b/requirements.txt index e72fced..d9afd71 100644 --- a/requirements.txt +++ b/requirements.txt @@ -8,3 +8,4 @@ SQLAlchemy gunicorn logging-profcomff auth-lib-profcomff[fastapi] +pydantic_settings diff --git a/services_backend/__main__.py b/services_backend/__main__.py index 2640c6a..5166cbe 100644 --- a/services_backend/__main__.py +++ b/services_backend/__main__.py @@ -1,6 +1,6 @@ import uvicorn -from .routes.base import app +from services_backend.routes.base import app if __name__ == '__main__': diff --git a/services_backend/routes/base.py b/services_backend/routes/base.py index 4435393..01a1eb4 100644 --- a/services_backend/routes/base.py +++ b/services_backend/routes/base.py @@ -26,7 +26,7 @@ app.add_middleware( DBSessionMiddleware, - db_url=settings.DB_DSN, + db_url=str(settings.DB_DSN), engine_args={"pool_pre_ping": True, "isolation_level": "AUTOCOMMIT"}, ) diff --git a/services_backend/routes/button.py b/services_backend/routes/button.py index 8faa3b1..f30a9d3 100644 --- a/services_backend/routes/button.py +++ b/services_backend/routes/button.py @@ -23,12 +23,14 @@ class ButtonCreate(Base): class ButtonUpdate(Base): - category_id: int | None = Field(description='Айди категории') - icon: str | None = Field(description='Иконка кнопки') - name: str | None = Field(description='Название кнопки') - order: int | None = Field(description='Порядок, в котором отображаются кнопки') - link: str | None = Field(description='Ссылка, на которую перенаправляет кнопка') - type: Type | None = Field(description='Тип открываемой ссылки (Ссылка приложения/Браузер в приложении/Браузер') + category_id: int | None = Field(description='Айди категории', default=None) + icon: str | None = Field(description='Иконка кнопки', default=None) + name: str | None = Field(description='Название кнопки', default=None) + order: int | None = Field(description='Порядок, в котором отображаются кнопки', default=None) + link: str | None = Field(description='Ссылка, на которую перенаправляет кнопка', default=None) + type: Type | None = Field( + description='Тип открываемой ссылки (Ссылка приложения/Браузер в приложении/Браузер', default=None + ) class ButtonGet(Base): @@ -41,7 +43,7 @@ class ButtonGet(Base): class ButtonsGet(Base): - buttons: list[ButtonGet] | None + buttons: list[ButtonGet] | None = None # endregion diff --git a/services_backend/routes/category.py b/services_backend/routes/category.py index d303c20..2a3ac4d 100644 --- a/services_backend/routes/category.py +++ b/services_backend/routes/category.py @@ -29,23 +29,23 @@ class ButtonGet(Base): class CategoryCreate(Base): type: str = Field(description='Тип отображения категории') name: str = Field(description='Имя категории') - scopes: set[str] | None = Field(description='Каким пользователям будет видна категория') + scopes: set[str] | None = Field(description='Каким пользователям будет видна категория', default=None) class CategoryUpdate(Base): - order: int | None = Field(description='На какую позицию перенести категорию') - type: str | None = Field(description='Тип отображения категории') - name: str | None = Field(description='Имя категории') - scopes: set[str] | None = Field(description='Каким пользователям будет видна категория') + order: int | None = Field(description='На какую позицию перенести категорию', default=None) + type: str | None = Field(description='Тип отображения категории', default=None) + name: str | None = Field(description='Имя категории', default=None) + scopes: set[str] | None = Field(description='Каким пользователям будет видна категория', default=None) class CategoryGet(Base): id: int order: int - type: str | None - name: str | None - buttons: list[ButtonGet] | None - scopes: list[str] | None + type: str | None = None + name: str | None = None + buttons: list[ButtonGet] | None = None + scopes: list[str] | None = None # endregion diff --git a/services_backend/schemas.py b/services_backend/schemas.py index d96d4d5..179ff44 100644 --- a/services_backend/schemas.py +++ b/services_backend/schemas.py @@ -1,4 +1,4 @@ -from pydantic import BaseModel +from pydantic import BaseModel, ConfigDict class Base(BaseModel): @@ -8,5 +8,4 @@ def __repr__(self) -> str: attrs.append(f"{k}={v}") return "{}({})".format(self.__class__.__name__, ', '.join(attrs)) - class Config: - orm_mode = True + model_config = ConfigDict(from_attributes=True, extra="ignore") diff --git a/services_backend/settings.py b/services_backend/settings.py index a602307..0350423 100644 --- a/services_backend/settings.py +++ b/services_backend/settings.py @@ -1,7 +1,8 @@ import os from functools import lru_cache -from pydantic import BaseSettings, PostgresDsn +from pydantic import ConfigDict, PostgresDsn +from pydantic_settings import BaseSettings class Settings(BaseSettings): @@ -14,12 +15,7 @@ class Settings(BaseSettings): CORS_ALLOW_CREDENTIALS: bool = True CORS_ALLOW_METHODS: list[str] = ['*'] CORS_ALLOW_HEADERS: list[str] = ['*'] - - class Config: - """Pydantic BaseSettings config""" - - case_sensitive = True - env_file = ".env" + model_config = ConfigDict(case_sensitive=True, env_file=".env", extra="ignore") @lru_cache diff --git a/tests/conftest.py b/tests/conftest.py index 5e1b17c..ca4b17b 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -27,7 +27,7 @@ def client(mocker: MockerFixture): @pytest.fixture(scope='session') def dbsession() -> Session: settings = get_settings() - engine = create_engine(settings.DB_DSN, execution_options={"isolation_level": "AUTOCOMMIT"}) + engine = create_engine(str(settings.DB_DSN), execution_options={"isolation_level": "AUTOCOMMIT"}) TestingSessionLocal = sessionmaker(bind=engine) Base.metadata.drop_all(bind=engine) Base.metadata.create_all(bind=engine)