diff --git a/app/templates/admin/_role_row.html b/app/templates/admin/_role_row.html new file mode 100644 index 0000000..2cb0256 --- /dev/null +++ b/app/templates/admin/_role_row.html @@ -0,0 +1,17 @@ + + {{ r.id }} + {{ r.name }} + {{ r.description or "" }} + {% for perm in r.permissions %}{{ perm.name }}{% endfor %} + + + + + diff --git a/app/templates/admin/_role_row_edit.html b/app/templates/admin/_role_row_edit.html new file mode 100644 index 0000000..90a0af7 --- /dev/null +++ b/app/templates/admin/_role_row_edit.html @@ -0,0 +1,26 @@ + + +
+ #{{ r.id }} ยท {{ r.name }} +
+ Permissions + {% for perm in permissions %} + + {% endfor %} +
+
+ + +
+
+ + diff --git a/app/templates/admin/_roles_table.html b/app/templates/admin/_roles_table.html index 015c4d2..516812c 100644 --- a/app/templates/admin/_roles_table.html +++ b/app/templates/admin/_roles_table.html @@ -5,19 +5,7 @@ {% for r in roles %} - - {{ r.id }} - {{ r.name }} - {{ r.description or "" }} - {% for perm in r.permissions %}{{ perm.name }}{% endfor %} - - - - + {% include "admin/_role_row.html" %} {% endfor %} diff --git a/app/web/admin.py b/app/web/admin.py index ca69962..0ab9c65 100644 --- a/app/web/admin.py +++ b/app/web/admin.py @@ -197,10 +197,58 @@ async def create_role( return templates.TemplateResponse( request, "admin/_roles_table.html", - {"roles": await role_crud.list_roles(db)}, + { + "roles": await role_crud.list_roles(db), + "permissions": await role_crud.list_permissions(db), + }, ) +@router.get("/roles/{role_id}/edit", response_class=HTMLResponse) +async def edit_role_row( + request: Request, + role_id: int, + db: AsyncSession = Depends(get_db), + _: User = Depends(web_require("roles:write")), +): + role = await role_crud.get(db, role_id) + if role is None: + raise HTTPException(status_code=404, detail="Role not found") + return templates.TemplateResponse( + request, + "admin/_role_row_edit.html", + {"r": role, "permissions": await role_crud.list_permissions(db)}, + ) + + +@router.get("/roles/{role_id}/row", response_class=HTMLResponse) +async def role_row( + request: Request, + role_id: int, + db: AsyncSession = Depends(get_db), + _: User = Depends(web_require("roles:read")), +): + role = await role_crud.get(db, role_id) + if role is None: + raise HTTPException(status_code=404, detail="Role not found") + return templates.TemplateResponse(request, "admin/_role_row.html", {"r": role}) + + +@router.post("/roles/{role_id}", response_class=HTMLResponse) +async def update_role( + request: Request, + role_id: int, + permission_ids: list[int] = Form(default=[]), + db: AsyncSession = Depends(get_db), + _: User = Depends(web_require("roles:write")), +): + role = await role_crud.get(db, role_id) + if role is None: + raise HTTPException(status_code=404, detail="Role not found") + await role_crud.update(db, role, {"permission_ids": permission_ids}) + return templates.TemplateResponse(request, "admin/_role_row.html", {"r": role}) + + @router.delete("/roles/{role_id}") async def delete_role( role_id: int,