From da3e5804f95c25707ad84be759935780618bac33 Mon Sep 17 00:00:00 2001 From: petrCher <88943157+petrCher@users.noreply.github.com> Date: Mon, 27 Jul 2026 18:18:23 +0300 Subject: [PATCH 1/4] added userfriendly search --- auth_backend/admin/admin.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/auth_backend/admin/admin.py b/auth_backend/admin/admin.py index 80508cb..d3719f5 100644 --- a/auth_backend/admin/admin.py +++ b/auth_backend/admin/admin.py @@ -73,6 +73,13 @@ class GroupAdmin(ModelView, model=Group): column_default_sort = [("id", False)] form_excluded_columns = ["child", "users", "create_ts", "update_ts", "is_deleted"] form_converter = FilteredModelConverter + form_ajax_refs = { + "scopes": { + "fields": ["name"], + "order_by": "name", + "page_size": 20, + }, + } def list_query(self, request: Request) -> Select: return select(Group).where(Group.is_deleted == False) @@ -123,6 +130,14 @@ class UserAdmin(ModelView, model=User): } form_converter = FilteredModelConverter + form_ajax_refs = { + "groups": { + "fields": ["name"], + "order_by": "name", + "page_size": 20, + }, + } + def list_query(self, request: Request) -> Select: return select(User).where(User.is_deleted == False) From 19c746fc6305722527bc4627cc5ceaa900c929c1 Mon Sep 17 00:00:00 2001 From: petrCher <88943157+petrCher@users.noreply.github.com> Date: Tue, 4 Aug 2026 22:39:26 +0300 Subject: [PATCH 2/4] small fix with search columns --- auth_backend/admin/admin.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/auth_backend/admin/admin.py b/auth_backend/admin/admin.py index d3719f5..36b48f6 100644 --- a/auth_backend/admin/admin.py +++ b/auth_backend/admin/admin.py @@ -22,7 +22,7 @@ class ScopeAdmin(ModelView, model=Scope): "creator_id", "is_deleted", ] - column_searchable_list = ["id", "name"] + column_searchable_list = ["id", "name", "comment"] column_sortable_list = ["id", "name"] column_default_sort = [("id", False)] form_excluded_columns = ["create_ts", "update_ts", "groups", "user_sessions", "is_deleted"] @@ -57,7 +57,7 @@ async def delete_model(self, request, pk): class GroupAdmin(ModelView, model=Group): name = "Group" name_plural = "Groups" - column_list = ["id", "name", "scopes", "users", "parent_id"] + column_list = ["id", "name", "scopes"] column_details_list = [ "id", "name", @@ -69,7 +69,7 @@ class GroupAdmin(ModelView, model=Group): "is_deleted", ] column_searchable_list = ["name"] - column_sortable_list = ["id", "name", "parent_id", "is_deleted"] + column_sortable_list = ["id", "name"] column_default_sort = [("id", False)] form_excluded_columns = ["child", "users", "create_ts", "update_ts", "is_deleted"] form_converter = FilteredModelConverter @@ -114,7 +114,7 @@ async def delete_model(self, request, pk): class UserAdmin(ModelView, model=User): name = "User" name_plural = "Users" - column_list = ["id", "scopes", "groups"] + column_list = ["id", "groups"] column_details_list = ["id", "groups", "scopes", "is_deleted"] column_searchable_list = ["id"] column_sortable_list = ["id", "is_deleted"] From d56e175b45f0f88ce8c9f80b698c4a8b3edfdac1 Mon Sep 17 00:00:00 2001 From: petrCher <88943157+petrCher@users.noreply.github.com> Date: Thu, 6 Aug 2026 16:32:53 +0300 Subject: [PATCH 3/4] fixed environment --- .github/workflows/build_and_publish.yml | 4 ++-- auth_backend/admin/admin.py | 2 +- auth_backend/admin/auth.py | 2 +- auth_backend/settings.py | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/build_and_publish.yml b/.github/workflows/build_and_publish.yml index f40b915..381ffd7 100644 --- a/.github/workflows/build_and_publish.yml +++ b/.github/workflows/build_and_publish.yml @@ -144,7 +144,7 @@ jobs: --env JWT_PRIVATE_KEY='${{ secrets.JWT_PRIVATE_KEY }}' \ --env ADMIN_SECRET_KEY='${{ secrets.ADMIN_SECRET_KEY }}' \ --env ADMIN_LOGIN='${{ secrets.ADMIN_LOGIN }}' \ - --env AUTH_URL='${{ vars.AUTH_URL }}' \ + --env SQLADMIN_AUTH_URL='${{ vars.SQLADMIN_AUTH_URL }}' \ --name ${{ env.CONTAINER_NAME }} \ ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:test docker network connect web ${{ env.CONTAINER_NAME }} @@ -242,7 +242,7 @@ jobs: --env GUNICORN_CMD_ARGS='--log-config logging_prod.conf --forwarded-allow-ips="172.16.0.0/12"' \ --env ADMIN_SECRET_KEY='${{ secrets.ADMIN_SECRET_KEY }}' \ --env ADMIN_LOGIN='${{ secrets.ADMIN_LOGIN }}' \ - --env AUTH_URL='${{ vars.AUTH_URL }}' \ + --env SQLADMIN_AUTH_URL='${{ vars.SQLADMIN_AUTH_URL }}' \ --name ${{ env.CONTAINER_NAME }} \ ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest docker network connect web ${{ env.CONTAINER_NAME }} diff --git a/auth_backend/admin/admin.py b/auth_backend/admin/admin.py index 36b48f6..bdd2976 100644 --- a/auth_backend/admin/admin.py +++ b/auth_backend/admin/admin.py @@ -57,7 +57,7 @@ async def delete_model(self, request, pk): class GroupAdmin(ModelView, model=Group): name = "Group" name_plural = "Groups" - column_list = ["id", "name", "scopes"] + column_list = ["id", "name"] column_details_list = [ "id", "name", diff --git a/auth_backend/admin/auth.py b/auth_backend/admin/auth.py index 487348c..d383979 100644 --- a/auth_backend/admin/auth.py +++ b/auth_backend/admin/auth.py @@ -37,7 +37,7 @@ async def logout(self, request: Request) -> bool: @staticmethod async def _is_valid_token(token: str) -> dict[str, Any] | None: try: - result = AuthLib(auth_url=settings.AUTH_URL).check_token(token) + result = AuthLib(auth_url=settings.SQLADMIN_AUTH_URL).check_token(token) if not result: return None session_scopes = {scope["name"].lower() for scope in result.get("session_scopes", [])} diff --git a/auth_backend/settings.py b/auth_backend/settings.py index 1e75ac9..e3dc610 100644 --- a/auth_backend/settings.py +++ b/auth_backend/settings.py @@ -22,7 +22,7 @@ class Settings(BaseSettings): KAFKA_PASSWORD: str | None = None ADMIN_SECRET_KEY: str = "default" ADMIN_LOGIN: str = "admin" - AUTH_URL: str = "https://api.test.profcomff.com/auth/" + SQLADMIN_AUTH_URL: str = "https://api.test.profcomff.com/auth/" ROOT_PATH: str = '/' + os.getenv('APP_NAME', '') From 64d97d68ed929e54e10fa727e0180294f3e425b0 Mon Sep 17 00:00:00 2001 From: petrCher <88943157+petrCher@users.noreply.github.com> Date: Thu, 6 Aug 2026 17:38:00 +0300 Subject: [PATCH 4/4] parent logic updated --- auth_backend/admin/admin.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/auth_backend/admin/admin.py b/auth_backend/admin/admin.py index bdd2976..f9ffb06 100644 --- a/auth_backend/admin/admin.py +++ b/auth_backend/admin/admin.py @@ -10,6 +10,9 @@ from auth_backend.routes.user import patch_user_groups from auth_backend.schemas.models import GroupPatch, GroupPost, ScopePost +def _pk(value) -> int | None: + """id of the object or the value itself if it is not an object with an id attribute""" + return int(getattr(value, "id", value)) if value else None class ScopeAdmin(ModelView, model=Scope): name = "Scope" @@ -88,16 +91,16 @@ def count_query(self, request: Request) -> Select: return select(func.count(Group.id)).where(Group.is_deleted == False) async def insert_model(self, request, data): - scope_ids = [int(s) for s in (data.pop("scopes", None) or [])] - parent_id = int(data["parent_id"]) if data.get("parent_id") else None + scope_ids = [_pk(s) for s in (data.pop("scopes", None) or [])] + parent_id = _pk(data.get("parent")) group_inp = GroupPost(name=data["name"], parent_id=parent_id, scopes=scope_ids) with self.session_maker(expire_on_commit=False) as session: result = create_group_logic(group_inp, session) return Group.get(result["id"], session=session) async def update_model(self, request, pk, data): - scope_ids = [int(s) for s in (data.pop("scopes", None) or [])] - parent_id = int(data["parent_id"]) if data.get("parent_id") else None + scope_ids = [_pk(s) for s in (data.pop("scopes", None) or [])] + parent_id = _pk(data.get("parent")) group_inp = GroupPatch( name=data.get("name"), parent_id=parent_id,