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 80508cb..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" @@ -22,7 +25,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 +60,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"] column_details_list = [ "id", "name", @@ -69,10 +72,17 @@ 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 + 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) @@ -81,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, @@ -107,7 +117,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"] @@ -123,6 +133,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) 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', '')