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..15fd6ec 100644 --- a/auth_backend/admin/admin.py +++ b/auth_backend/admin/admin.py @@ -1,3 +1,4 @@ +from markupsafe import Markup from sqladmin import ModelView from sqlalchemy import func, select from sqlalchemy.sql.expression import Select @@ -11,6 +12,11 @@ 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" name_plural = "Scopes" @@ -22,7 +28,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 +63,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", @@ -68,11 +74,18 @@ class GroupAdmin(ModelView, model=Group): "update_ts", "is_deleted", ] - column_searchable_list = ["name"] - column_sortable_list = ["id", "name", "parent_id", "is_deleted"] + column_searchable_list = ["id", "name"] + 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 +94,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 +120,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"] @@ -115,14 +128,21 @@ class UserAdmin(ModelView, model=User): form_columns = ["groups"] can_create = False can_delete = False - column_formatters = { - "scopes": lambda m, a: ", ".join(s.name for s in m.scopes), - } column_formatters_detail = { - "scopes": lambda m, a: ", ".join(s.name for s in (m.scopes or set())), + "scopes": lambda m, a: Markup( + '