diff --git a/src/model/role.rs b/src/model/role.rs index df95157..c8accad 100644 --- a/src/model/role.rs +++ b/src/model/role.rs @@ -1,9 +1,9 @@ use std::ops::DerefMut; -use serde::Serialize; +use serde::{Deserialize, Serialize}; use sqlx::{FromRow, Sqlite, SqlitePool, Transaction}; -#[derive(FromRow, Serialize, Clone)] +#[derive(FromRow, Serialize, Clone, Deserialize, Debug)] pub struct Role { pub(crate) id: i64, pub(crate) name: String, diff --git a/src/model/user.rs b/src/model/user.rs index 9e9b8a3..72e801c 100644 --- a/src/model/user.rs +++ b/src/model/user.rs @@ -513,6 +513,21 @@ ASKÖ Ruderverein Donau Linz", self.name), .into_iter().map(|r| r.name).collect() } + pub async fn real_roles(&self, db: &SqlitePool) -> Vec { + sqlx::query_as!( + Role, + "SELECT r.id, r.name, r.cluster + FROM role r + JOIN user_role ur ON r.id = ur.role_id + JOIN user u ON u.id = ur.user_id + WHERE ur.user_id = ? AND u.deleted = 0;", + self.id + ) + .fetch_all(db) + .await + .unwrap() + } + pub async fn has_role_tx(&self, db: &mut Transaction<'_, Sqlite>, role: &str) -> bool { if sqlx::query!( "SELECT * FROM user_role WHERE user_id=? AND role_id = (SELECT id FROM role WHERE name = ?)", @@ -1154,7 +1169,7 @@ pub struct UserWithRolesAndMembershipPdf { #[serde(flatten)] pub user: User, pub membership_pdf: bool, - pub roles: Vec, + pub roles: Vec, // TODO: get rid of this... } impl UserWithRolesAndMembershipPdf { diff --git a/src/tera/admin/user.rs b/src/tera/admin/user.rs index 3c7564d..3cd9337 100644 --- a/src/tera/admin/user.rs +++ b/src/tera/admin/user.rs @@ -293,6 +293,8 @@ async fn update( data: Form>, admin: ManageUserUser, ) -> Flash { + println!("{data:#?}"); + let user = User::find_by_id(db, data.id).await; Log::create( db, diff --git a/templates/admin/user/index.html.tera b/templates/admin/user/index.html.tera index adf1026..82c2ebf 100644 --- a/templates/admin/user/index.html.tera +++ b/templates/admin/user/index.html.tera @@ -79,9 +79,25 @@
- {% for role in roles %} - {{ macros::checkbox(label=role.name, name="roles[" ~ role.id ~ "]", id=loop.index , checked=role.name in user.roles, disabled=allowed_to_edit == false) }} + {% for cluster, r in roles | group_by(attribute="cluster") %} + {{ cluster }} + {% endfor %} + + + {% for role in roles %} + {% if not role.cluster %} + {{ macros::checkbox(label=role.name, name="roles[" ~ role.id ~ "]", id=loop.index , checked=role.name in user.roles, disabled=allowed_to_edit == false) }} + {% endif %} + {% endfor %}
{% if user.membership_pdf %}