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 @@
+
+ |
+
+ |
+
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,