From dd83628dd22d1bf6000b3d7528cb186abee3659d Mon Sep 17 00:00:00 2001 From: Timur Enikeev Date: Thu, 5 Sep 2024 13:43:53 -0400 Subject: [PATCH 1/6] Fix user delete rout --- auth_backend/routes/user.py | 1 + tests/test_routes/test_user.py | 22 +++++++++++++++++++++- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/auth_backend/routes/user.py b/auth_backend/routes/user.py index 5214c7e7..8093bef0 100644 --- a/auth_backend/routes/user.py +++ b/auth_backend/routes/user.py @@ -162,5 +162,6 @@ async def delete_user( logger.info(f'{method=} for {user.id=} deleted') User.delete(user_id, session=db.session) + db.session.commit() await AuthPluginMeta.user_updated(None, old_user) logger.info(f'{user=} deleted') diff --git a/tests/test_routes/test_user.py b/tests/test_routes/test_user.py index 21650a3c..ceea0d8c 100644 --- a/tests/test_routes/test_user.py +++ b/tests/test_routes/test_user.py @@ -4,7 +4,7 @@ from sqlalchemy.orm import Session from auth_backend.models import AuthMethod, User -from auth_backend.models.db import Group +from auth_backend.models.db import Group, GroupScope, UserGroup def test_user_email(client: TestClient, dbsession: Session, user_factory): @@ -23,3 +23,23 @@ def test_user_email(client: TestClient, dbsession: Session, user_factory): gr = Group.get(group, session=dbsession) dbsession.delete(gr) dbsession.commit() + + +def test_delete_user(client: TestClient, dbsession: Session, user_factory): + user1 = user_factory(client) + time1 = datetime.utcnow() + email_user = AuthMethod(user_id=user1, param="email", auth_method="email", value="testemailx@x.xy") + dbsession.add(email_user) + dbsession.commit() + body = {"name": f"group{time1}", "parent_id": None, "scopes": []} + group = client.post(url="/group", json=body).json()["id"] + client.patch(f"/user/{user1}", json={"groups": [group]}) + resp = client.delete(f"user/{user1}") + assert resp.status_code == 200 + user = dbsession.query(User).filter(User.id == user1).one_or_none() + assert user.is_deleted + dbsession.delete(email_user) + dbsession.query(GroupScope).filter(GroupScope.group_id == group).delete() + dbsession.query(UserGroup).filter(UserGroup.group_id == group).delete() + dbsession.query(Group).filter(Group.id == group).delete() + dbsession.commit() From 4d2bb0e5438ef8dcfeafc014e563d9fb696be84a Mon Sep 17 00:00:00 2001 From: Timur Enikeev Date: Thu, 5 Sep 2024 14:06:45 -0400 Subject: [PATCH 2/6] Fix user delete rout by rm user group --- auth_backend/routes/user.py | 7 +++++++ tests/test_routes/test_user.py | 2 ++ 2 files changed, 9 insertions(+) diff --git a/auth_backend/routes/user.py b/auth_backend/routes/user.py index 8093bef0..ca0bb937 100644 --- a/auth_backend/routes/user.py +++ b/auth_backend/routes/user.py @@ -161,6 +161,13 @@ async def delete_user( AuthMethod.delete(method.id, session=db.session) logger.info(f'{method=} for {user.id=} deleted') + for group in user.groups: + if group.is_deleted: + continue + user_group: UserGroup = ( + UserGroup.query(session=db.session).filter(UserGroup.group_id == group.id, UserGroup.user_id == user_id).one() + ) + UserGroup.delete(user_group.id, session=db.session) User.delete(user_id, session=db.session) db.session.commit() await AuthPluginMeta.user_updated(None, old_user) diff --git a/tests/test_routes/test_user.py b/tests/test_routes/test_user.py index ceea0d8c..3ac74e18 100644 --- a/tests/test_routes/test_user.py +++ b/tests/test_routes/test_user.py @@ -38,6 +38,8 @@ def test_delete_user(client: TestClient, dbsession: Session, user_factory): assert resp.status_code == 200 user = dbsession.query(User).filter(User.id == user1).one_or_none() assert user.is_deleted + user_group = dbsession.query(UserGroup).filter(UserGroup.group_id == group).one_or_none() + assert user_group.is_deleted dbsession.delete(email_user) dbsession.query(GroupScope).filter(GroupScope.group_id == group).delete() dbsession.query(UserGroup).filter(UserGroup.group_id == group).delete() From e23a6b6123c6f35204d9469a2a41d2bd03534343 Mon Sep 17 00:00:00 2001 From: Timur Enikeev Date: Thu, 5 Sep 2024 14:07:12 -0400 Subject: [PATCH 3/6] Style fix --- auth_backend/routes/user.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/auth_backend/routes/user.py b/auth_backend/routes/user.py index ca0bb937..5c2afc84 100644 --- a/auth_backend/routes/user.py +++ b/auth_backend/routes/user.py @@ -165,7 +165,9 @@ async def delete_user( if group.is_deleted: continue user_group: UserGroup = ( - UserGroup.query(session=db.session).filter(UserGroup.group_id == group.id, UserGroup.user_id == user_id).one() + UserGroup.query(session=db.session) + .filter(UserGroup.group_id == group.id, UserGroup.user_id == user_id) + .one() ) UserGroup.delete(user_group.id, session=db.session) User.delete(user_id, session=db.session) From 7b060c0f0056edc30d77205d080f4ce61b418d1f Mon Sep 17 00:00:00 2001 From: Timur Enikeev Date: Thu, 12 Sep 2024 13:09:36 -0400 Subject: [PATCH 4/6] Temp Pydantic fix --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index db19b3a6..ee60901e 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,7 +1,7 @@ fastapi fastapi-sqlalchemy psycopg2-binary -pydantic +pydantic==2.8.2 uvicorn alembic SQLAlchemy From d261987fbbc2cdda1c772baffbbc26d673964190 Mon Sep 17 00:00:00 2001 From: Timur Enikeev Date: Tue, 17 Sep 2024 14:11:29 -0400 Subject: [PATCH 5/6] Keep groups after user delete --- auth_backend/routes/user.py | 10 ---------- requirements.txt | 2 +- tests/test_routes/test_user.py | 2 -- 3 files changed, 1 insertion(+), 13 deletions(-) diff --git a/auth_backend/routes/user.py b/auth_backend/routes/user.py index 5c2afc84..c9227479 100644 --- a/auth_backend/routes/user.py +++ b/auth_backend/routes/user.py @@ -160,16 +160,6 @@ async def delete_user( # Удаляем AuthMethod AuthMethod.delete(method.id, session=db.session) logger.info(f'{method=} for {user.id=} deleted') - - for group in user.groups: - if group.is_deleted: - continue - user_group: UserGroup = ( - UserGroup.query(session=db.session) - .filter(UserGroup.group_id == group.id, UserGroup.user_id == user_id) - .one() - ) - UserGroup.delete(user_group.id, session=db.session) User.delete(user_id, session=db.session) db.session.commit() await AuthPluginMeta.user_updated(None, old_user) diff --git a/requirements.txt b/requirements.txt index ee60901e..db19b3a6 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,7 +1,7 @@ fastapi fastapi-sqlalchemy psycopg2-binary -pydantic==2.8.2 +pydantic uvicorn alembic SQLAlchemy diff --git a/tests/test_routes/test_user.py b/tests/test_routes/test_user.py index 3ac74e18..ceea0d8c 100644 --- a/tests/test_routes/test_user.py +++ b/tests/test_routes/test_user.py @@ -38,8 +38,6 @@ def test_delete_user(client: TestClient, dbsession: Session, user_factory): assert resp.status_code == 200 user = dbsession.query(User).filter(User.id == user1).one_or_none() assert user.is_deleted - user_group = dbsession.query(UserGroup).filter(UserGroup.group_id == group).one_or_none() - assert user_group.is_deleted dbsession.delete(email_user) dbsession.query(GroupScope).filter(GroupScope.group_id == group).delete() dbsession.query(UserGroup).filter(UserGroup.group_id == group).delete() From f272f0a66773cbd048d3334b039da33acc085a87 Mon Sep 17 00:00:00 2001 From: Timur Enikeev <163281083+DaymasS@users.noreply.github.com> Date: Thu, 19 Sep 2024 13:58:42 -0400 Subject: [PATCH 6/6] Pydantic 2.9 fix (#208) (#209) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Изменения Фикс для Pydantic 2.9... ## Детали реализации Добавил обязательный хэндлер ## Check-List - [ ] Вы проверили свой код перед отправкой запроса? - [ ] Вы написали тесты к реализованным функциям? - [ ] Вы не забыли применить форматирование `black` и `isort` для _Back-End_ или `Prettier` для _Front-End_? ## Изменения ## Детали реализации ## Check-List - [ ] Вы проверили свой код перед отправкой запроса? - [ ] Вы написали тесты к реализованным функциям? - [ ] Вы не забыли применить форматирование `black` и `isort` для _Back-End_ или `Prettier` для _Front-End_? --- auth_backend/schemas/types/scopes.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/auth_backend/schemas/types/scopes.py b/auth_backend/schemas/types/scopes.py index e3216ffd..ce33acfc 100644 --- a/auth_backend/schemas/types/scopes.py +++ b/auth_backend/schemas/types/scopes.py @@ -1,7 +1,7 @@ import string from typing import Any -from pydantic._internal import _schema_generation_shared +from pydantic import GetCoreSchemaHandler, GetJsonSchemaHandler from pydantic.json_schema import JsonSchemaValue from pydantic_core import core_schema @@ -19,12 +19,13 @@ class Scope: def __get_pydantic_core_schema__( cls, source: type[Any], + handler: GetCoreSchemaHandler, ) -> core_schema.CoreSchema: return core_schema.general_after_validator_function(cls._validate, core_schema.str_schema()) @classmethod def __get_pydantic_json_schema__( - cls, core_schema: core_schema.CoreSchema, handler: _schema_generation_shared.GetJsonSchemaHandler + cls, core_schema: core_schema.CoreSchema, handler: GetJsonSchemaHandler ) -> JsonSchemaValue: field_schema = handler(core_schema) field_schema.update(type='string', format='scope')