From f0a95a3959967ea3a0962a29c4be6f96355438f6 Mon Sep 17 00:00:00 2001 From: semen603089 Date: Sat, 8 Jul 2023 22:49:59 +0300 Subject: [PATCH 01/10] pydantic2 --- requirements.txt | 1 + services_backend/routes/button.py | 2 +- services_backend/routes/category.py | 8 ++++---- services_backend/schemas.py | 5 ++--- services_backend/settings.py | 10 +++------- 5 files changed, 11 insertions(+), 15 deletions(-) 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/routes/button.py b/services_backend/routes/button.py index 8faa3b1..4b6a998 100644 --- a/services_backend/routes/button.py +++ b/services_backend/routes/button.py @@ -41,7 +41,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..af6dac9 100644 --- a/services_backend/routes/category.py +++ b/services_backend/routes/category.py @@ -42,10 +42,10 @@ class CategoryUpdate(Base): 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..8320b59 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) diff --git a/services_backend/settings.py b/services_backend/settings.py index a602307..0085cff 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") @lru_cache From acb8bfae78866972a697b292fda31538017f8b57 Mon Sep 17 00:00:00 2001 From: semen603089 Date: Sat, 8 Jul 2023 23:00:00 +0300 Subject: [PATCH 02/10] pydantic2 --- .github/workflows/checks.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 From 8cd27c5347e97336e95f30b052c355dacd9ecc7f Mon Sep 17 00:00:00 2001 From: semen603089 Date: Sun, 9 Jul 2023 08:39:36 +0300 Subject: [PATCH 03/10] pydantic2 --- migrations/env.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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.", From f74821d8cdafa1f88b1296e08fd7af64dd2a1d23 Mon Sep 17 00:00:00 2001 From: semen603089 Date: Sun, 9 Jul 2023 08:52:22 +0300 Subject: [PATCH 04/10] pydantic2 --- services_backend/settings.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services_backend/settings.py b/services_backend/settings.py index 0085cff..cc23733 100644 --- a/services_backend/settings.py +++ b/services_backend/settings.py @@ -15,7 +15,7 @@ class Settings(BaseSettings): CORS_ALLOW_CREDENTIALS: bool = True CORS_ALLOW_METHODS: list[str] = ['*'] CORS_ALLOW_HEADERS: list[str] = ['*'] - model_config = ConfigDict(case_sensitive=True, env_file=".env") + model_config = ConfigDict(case_sensitive=True, env_file=".env", extra="allow") @lru_cache From 1c804a1fc3d3e3e9d3de1271f0c2c226d19ed7b5 Mon Sep 17 00:00:00 2001 From: semen603089 Date: Sun, 9 Jul 2023 08:55:22 +0300 Subject: [PATCH 05/10] pydantic2 --- tests/conftest.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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) From f87742dd7b4d2ba8e0e1268f08807b7eb77eb0fc Mon Sep 17 00:00:00 2001 From: semen603089 Date: Sun, 9 Jul 2023 08:59:21 +0300 Subject: [PATCH 06/10] pydantic2 --- services_backend/routes/base.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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"}, ) From 5348f7e414497cfbc7777e2ecfff1db83f7f197d Mon Sep 17 00:00:00 2001 From: semen603089 Date: Sun, 9 Jul 2023 09:09:37 +0300 Subject: [PATCH 07/10] pydantic2 --- services_backend/settings.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services_backend/settings.py b/services_backend/settings.py index cc23733..0350423 100644 --- a/services_backend/settings.py +++ b/services_backend/settings.py @@ -15,7 +15,7 @@ class Settings(BaseSettings): CORS_ALLOW_CREDENTIALS: bool = True CORS_ALLOW_METHODS: list[str] = ['*'] CORS_ALLOW_HEADERS: list[str] = ['*'] - model_config = ConfigDict(case_sensitive=True, env_file=".env", extra="allow") + model_config = ConfigDict(case_sensitive=True, env_file=".env", extra="ignore") @lru_cache From 23f25f8169de30c03f9fabe0b2e014fe338bbdab Mon Sep 17 00:00:00 2001 From: semen603089 Date: Sun, 9 Jul 2023 09:15:23 +0300 Subject: [PATCH 08/10] pydantic2 --- services_backend/schemas.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services_backend/schemas.py b/services_backend/schemas.py index 8320b59..179ff44 100644 --- a/services_backend/schemas.py +++ b/services_backend/schemas.py @@ -8,4 +8,4 @@ def __repr__(self) -> str: attrs.append(f"{k}={v}") return "{}({})".format(self.__class__.__name__, ', '.join(attrs)) - model_config = ConfigDict(from_attributes=True) + model_config = ConfigDict(from_attributes=True, extra="ignore") From 6bb35b5924bc3906f66dde32443e0255e00f8e73 Mon Sep 17 00:00:00 2001 From: semen603089 Date: Sun, 9 Jul 2023 10:29:25 +0300 Subject: [PATCH 09/10] pydantic2 --- services_backend/__main__.py | 2 +- services_backend/routes/button.py | 12 ++++++------ services_backend/routes/category.py | 10 +++++----- 3 files changed, 12 insertions(+), 12 deletions(-) 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/button.py b/services_backend/routes/button.py index 4b6a998..886dac8 100644 --- a/services_backend/routes/button.py +++ b/services_backend/routes/button.py @@ -23,12 +23,12 @@ 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): diff --git a/services_backend/routes/category.py b/services_backend/routes/category.py index af6dac9..2a3ac4d 100644 --- a/services_backend/routes/category.py +++ b/services_backend/routes/category.py @@ -29,14 +29,14 @@ 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): From a41166ac69b37cc98871ab9736b624053d149a3a Mon Sep 17 00:00:00 2001 From: semen603089 Date: Sun, 9 Jul 2023 10:29:49 +0300 Subject: [PATCH 10/10] pydantic2 --- services_backend/routes/button.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/services_backend/routes/button.py b/services_backend/routes/button.py index 886dac8..f30a9d3 100644 --- a/services_backend/routes/button.py +++ b/services_backend/routes/button.py @@ -28,7 +28,9 @@ class ButtonUpdate(Base): 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) + type: Type | None = Field( + description='Тип открываемой ссылки (Ссылка приложения/Браузер в приложении/Браузер', default=None + ) class ButtonGet(Base):