From e5560ba536869435c71932908db9fbd3bbc64d69 Mon Sep 17 00:00:00 2001 From: Philipp Hofer Date: Mon, 5 May 2025 20:37:12 +0200 Subject: [PATCH 01/12] don't clutter acitvities too much --- src/model/user/basic.rs | 2 +- src/model/user/mod.rs | 48 ++++++++++++++++++----------------------- 2 files changed, 22 insertions(+), 28 deletions(-) diff --git a/src/model/user/basic.rs b/src/model/user/basic.rs index dfcb739..05e1ca4 100644 --- a/src/model/user/basic.rs +++ b/src/model/user/basic.rs @@ -499,7 +499,7 @@ impl User { ) })?; - if !role.hide_in_lists { + if !role.hide_in_lists && role.cluster.is_none() { ActivityBuilder::new(&format!( "{updated_by} hat die Rolle '{role}' dem Benutzer {self} hinzugefügt." )) diff --git a/src/model/user/mod.rs b/src/model/user/mod.rs index 0e71ca8..2b8bd75 100644 --- a/src/model/user/mod.rs +++ b/src/model/user/mod.rs @@ -1,21 +1,20 @@ use std::{fmt::Display, ops::DerefMut}; -use argon2::{Argon2, PasswordHasher, password_hash::SaltString}; +use argon2::{password_hash::SaltString, Argon2, PasswordHasher}; use chrono::{Datelike, Local, NaiveDate}; use log::info; use rocket::async_trait; use rocket::{ - Request, http::{Cookie, Status}, request::{FromRequest, Outcome}, time::{Duration, OffsetDateTime}, + Request, }; use serde::{Deserialize, Serialize}; use sqlx::{FromRow, Sqlite, SqlitePool, Transaction}; use super::activity::ActivityBuilder; use super::{ - Day, log::Log, logbook::Logbook, mail::Mail, @@ -24,6 +23,7 @@ use super::{ role::Role, stat::Stat, tripdetails::TripDetails, + Day, }; use crate::AMOUNT_DAYS_TO_SHOW_TRIPS_AHEAD; use scheckbuch::ScheckbuchUser; @@ -512,7 +512,7 @@ ASKÖ Ruderverein Donau Linz", self.name), .save(db) .await; return Err(LoginError::InvalidAuthenticationCombo); //User existed sometime ago; has - //been deleted + //been deleted } if let Some(user_pw) = user.pw.as_ref() { @@ -622,9 +622,9 @@ ASKÖ Ruderverein Donau Linz", self.name), pub(crate) async fn amount_days_to_show(&self, db: &SqlitePool) -> i64 { if self.allowed_to_steer(db).await { let end_of_year = NaiveDate::from_ymd_opt(Local::now().year(), 12, 31).unwrap(); //Ok, - //december - //has 31 - //days + //december + //has 31 + //days let days_left_in_year = end_of_year .signed_duration_since(Local::now().date_naive()) .num_days() @@ -633,9 +633,9 @@ ASKÖ Ruderverein Donau Linz", self.name), if days_left_in_year <= 31 { let end_of_next_year = NaiveDate::from_ymd_opt(Local::now().year() + 1, 12, 31).unwrap(); //Ok, - //december - //has 31 - //days + //december + //has 31 + //days end_of_next_year .signed_duration_since(Local::now().date_naive()) .num_days() @@ -867,8 +867,8 @@ special_user!(SteeringUser, +"cox", +"Bootsführer"); special_user!(AdminUser, +"admin"); special_user!(AllowedForPlannedTripsUser, +"Donau Linz", +"scheckbuch", +"Förderndes Mitglied"); special_user!(DonauLinzUser, +"Donau Linz", -"Unterstützend", -"Förderndes Mitglied"); // TODO: -// remove -> -// RegularUser + // remove -> + // RegularUser special_user!(SchnupperBetreuerUser, +"schnupper-betreuer"); special_user!(VorstandUser, +"admin", +"Vorstand"); special_user!(EventUser, +"manage_events"); @@ -982,21 +982,17 @@ mod test { #[sqlx::test] fn wrong_pw() { let pool = testdb!(); - assert!( - User::login(&pool, "admin".into(), "admi".into()) - .await - .is_err() - ); + assert!(User::login(&pool, "admin".into(), "admi".into()) + .await + .is_err()); } #[sqlx::test] fn wrong_username() { let pool = testdb!(); - assert!( - User::login(&pool, "admi".into(), "admin".into()) - .await - .is_err() - ); + assert!(User::login(&pool, "admi".into(), "admin".into()) + .await + .is_err()); } #[sqlx::test] @@ -1015,11 +1011,9 @@ mod test { let pool = testdb!(); let user = User::find_by_id(&pool, 1).await.unwrap(); - assert!( - User::login(&pool, "admin".into(), "abc".into()) - .await - .is_err() - ); + assert!(User::login(&pool, "admin".into(), "abc".into()) + .await + .is_err()); user.update_pw(&pool, "abc".into()).await; -- 2.47.2 From abcf46281bc1f877744b0d5c5816fe87dc537772 Mon Sep 17 00:00:00 2001 From: Marie Birner Date: Mon, 5 May 2025 20:37:29 +0200 Subject: [PATCH 02/12] [TASK] style detail view user --- templates/admin/user/view.html.tera | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/templates/admin/user/view.html.tera b/templates/admin/user/view.html.tera index e6a61bb..80edf2d 100644 --- a/templates/admin/user/view.html.tera +++ b/templates/admin/user/view.html.tera @@ -7,8 +7,8 @@ ← Userverwaltung {% endif %}

{{ user.name }}

-
-
+
+

Grunddaten
@@ -53,7 +53,7 @@

-
+

Mitgliedschaft
@@ -285,7 +285,7 @@

{% if is_clubmember %} -
+

Rollen

    @@ -363,7 +363,7 @@
{% endif %} {% if supposed_to_pay %} -
+

💸-Beitrag

@@ -400,7 +400,7 @@
{% endif %} -
+

Aktivitäten

@@ -414,13 +414,13 @@
-
+

Ergo-Challenge

-
-
- {{ macros::input(label='DOB', name='dob', type="text", value=user.dob, readonly=allowed_to_edit == false) }} - {{ macros::input(label='Weight (kg)', name='weight', type="text", value=user.weight, readonly=allowed_to_edit == false) }} - {{ macros::input(label='Sex', name='sex', type="text", value=user.sex, readonly=allowed_to_edit == false) }} +
+
+ {{ macros::inputgroup(label='DOB', name='dob', type="text", value=user.dob, readonly=allowed_to_edit == false) }} + {{ macros::inputgroup(label='Weight (kg)', name='weight', type="text", value=user.weight, readonly=allowed_to_edit == false) }} + {{ macros::inputgroup(label='Sex', name='sex', type="text", value=user.sex, readonly=allowed_to_edit == false) }}
-- 2.47.2 From 8e40e563c65e6648f93eff1c41e6a0848d9341b0 Mon Sep 17 00:00:00 2001 From: Philipp Hofer Date: Mon, 5 May 2025 20:44:00 +0200 Subject: [PATCH 03/12] even less clutter! --- src/model/user/basic.rs | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/model/user/basic.rs b/src/model/user/basic.rs index 05e1ca4..b593c67 100644 --- a/src/model/user/basic.rs +++ b/src/model/user/basic.rs @@ -414,12 +414,14 @@ impl User { .await .unwrap(); - ActivityBuilder::new(&format!( - "{updated_by} hat die Rolle {role} von {self} entfernt." - )) - .relevant_for_user(self) - .save(db) - .await; + if !role.hide_in_lists && role.cluster.is_none() { + ActivityBuilder::new(&format!( + "{updated_by} hat die Rolle {role} von {self} entfernt." + )) + .relevant_for_user(self) + .save(db) + .await; + } Ok(()) } -- 2.47.2 From c1cecf3b20f1ef73950dc723091bc7909c13b1f0 Mon Sep 17 00:00:00 2001 From: Philipp Hofer Date: Mon, 5 May 2025 20:46:41 +0200 Subject: [PATCH 04/12] don't panic on 'external cox' --- src/tera/admin/user.rs | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/tera/admin/user.rs b/src/tera/admin/user.rs index 69ec070..95ec6fc 100644 --- a/src/tera/admin/user.rs +++ b/src/tera/admin/user.rs @@ -7,11 +7,11 @@ use crate::{ mail::valid_mails, role::Role, user::{ - AdminUser, AllowedToEditPaymentStatusUser, ManageUserUser, User, UserWithDetails, - UserWithMembershipPdf, UserWithRolesAndMembershipPdf, VorstandUser, clubmember::ClubMemberUser, foerdernd::FoerderndUser, member::Member, regular::RegularUser, scheckbuch::ScheckbuchUser, schnupperant::SchnupperantUser, schnupperinterest::SchnupperInterestUser, unterstuetzend::UnterstuetzendUser, + AdminUser, AllowedToEditPaymentStatusUser, ManageUserUser, User, UserWithDetails, + UserWithMembershipPdf, UserWithRolesAndMembershipPdf, VorstandUser, }, }, tera::Config, @@ -19,7 +19,6 @@ use crate::{ use chrono::NaiveDate; use futures::future::join_all; use rocket::{ - FromForm, Request, Route, State, form::Form, fs::TempFile, get, @@ -27,9 +26,9 @@ use rocket::{ post, request::{FlashMessage, FromRequest, Outcome}, response::{Flash, Redirect}, - routes, + routes, FromForm, Request, Route, State, }; -use rocket_dyn_templates::{Template, tera::Context}; +use rocket_dyn_templates::{tera::Context, Template}; use sqlx::SqlitePool; // Custom request guard to extract the Referer header @@ -133,6 +132,12 @@ async fn view( format!("User mit ID {} gibts ned", user), )); }; + if user.name == "Externe Steuerperson" { + return Err(Flash::error( + Redirect::to("/admin/user"), + "Diese besondere Person kannst du dir leider nicht anschauen, mein lieber neugieriger Ruderant!" + )); + } let member = Member::from(db, user.clone()).await; let fee = user.fee(db).await; -- 2.47.2 From 17513bbc386e849962157517d9a4496870b1a064 Mon Sep 17 00:00:00 2001 From: Philipp Hofer Date: Mon, 5 May 2025 21:11:41 +0200 Subject: [PATCH 05/12] give frontend stuff to be able to update logbook entriese --- src/tera/log.rs | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/tera/log.rs b/src/tera/log.rs index 390e285..ad8cfa6 100644 --- a/src/tera/log.rs +++ b/src/tera/log.rs @@ -1,7 +1,6 @@ use std::net::IpAddr; use rocket::{ - Request, Route, State, form::Form, get, http::{Cookie, CookieJar}, @@ -10,8 +9,9 @@ use rocket::{ response::{Flash, Redirect}, routes, time::{Duration, OffsetDateTime}, + Request, Route, State, }; -use rocket_dyn_templates::{Template, context}; +use rocket_dyn_templates::{context, Template}; use sqlx::SqlitePool; use tera::Context; @@ -110,10 +110,13 @@ async fn index( #[get("/show", rank = 3)] async fn show(db: &State, user: DonauLinzUser) -> Template { let logs = Logbook::completed(db).await; + let boats = Boat::all(db).await; + let users = User::all(db).await; + let logtypes = LogType::all(db).await; Template::render( "log.completed", - context!(logs, loggedin_user: &UserWithDetails::from_user(user.into_inner(), db).await), + context!(logs, boats, users, logtypes, loggedin_user: &UserWithDetails::from_user(user.into_inner(), db).await), ) } @@ -582,7 +585,7 @@ mod test { use sqlx::SqlitePool; use crate::model::logbook::Logbook; - use crate::tera::{User, log::Boat}; + use crate::tera::{log::Boat, User}; use crate::testdb; #[sqlx::test] -- 2.47.2 From 81b99ef414dc77eaa81395177bf23a5893ae3ba1 Mon Sep 17 00:00:00 2001 From: Marie Birner Date: Mon, 5 May 2025 21:14:23 +0200 Subject: [PATCH 06/12] [TASK] edit form on logbook fixes #635 --- frontend/scss/components/_links.scss | 4 ++ templates/includes/forms/log.html.tera | 55 ++++++++++++++++++-------- 2 files changed, 43 insertions(+), 16 deletions(-) diff --git a/frontend/scss/components/_links.scss b/frontend/scss/components/_links.scss index ccf00a0..2643d63 100644 --- a/frontend/scss/components/_links.scss +++ b/frontend/scss/components/_links.scss @@ -11,6 +11,10 @@ @apply text-white hover:text-primary-100 underline; } + &-black { + @apply text-black hover:text-primary-950 dark:text-white hover:dark:text-primary-300 underline; + } + &-no-underline { @apply no-underline; } diff --git a/templates/includes/forms/log.html.tera b/templates/includes/forms/log.html.tera index 04a3b6e..66e6f50 100644 --- a/templates/includes/forms/log.html.tera +++ b/templates/includes/forms/log.html.tera @@ -183,8 +183,6 @@
-
- {% if log.logtype and not hide_type %}
{% if log.logtype == 1 %} @@ -199,7 +197,15 @@
{% endif %}
- {{ log.boat.name }} + {% if allowed_to_edit %} + {{ log.boat.name }} + {% else %} + + {{ log.boat.name }} + + {% endif %} ({{ log.shipmaster_user.name -}} {% if log.shipmaster_only_steering %} - handgesteuert @@ -252,35 +258,52 @@ {% endif %} {% endif %}
-
- {% if allowed_to_edit %} -
+ {% if allowed_to_edit %} + +
+ +
+

Eintrag '{{ log.boat.name }}' ändern

+

{{ log.id }}

+ - Handgesteuert: - - - + {{ macros::checkbox(label='Handgesteuert', name='shipmaster_only_steering', id=log.shipmaster_only_steering,checked=log.shipmaster_only_steering) }} + + - + {% include "includes/delete-icon" %} Löschen - {% endif %} -
+
+
+ + {% endif %}
{% endmacro show_old %} {% macro home(log) %} -- 2.47.2 From 6098aedb743199e0f2742b0cb32f1e7f5785cff8 Mon Sep 17 00:00:00 2001 From: Philipp Hofer Date: Mon, 5 May 2025 22:11:56 +0200 Subject: [PATCH 07/12] fix tests? --- frontend/tests/log.spec.ts | 4 +--- templates/log.completed.html.tera | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/frontend/tests/log.spec.ts b/frontend/tests/log.spec.ts index efa53f0..70aad24 100644 --- a/frontend/tests/log.spec.ts +++ b/frontend/tests/log.spec.ts @@ -115,7 +115,7 @@ test("Cox can start and finish trip", async ({ page }, testInfo) => { await page.getByPlaceholder("Passwort").press("Enter"); await page.goto("/log/show"); - await page.getByText('(cox2)').click(); + await page.getByRole('link', { name: 'Joe' }).nth(1).click(); page.once("dialog", (dialog) => { dialog.accept().catch(() => {}); }); @@ -208,7 +208,6 @@ test("Kiosk can start and finish trip", async ({ page }, testInfo) => { await page.getByRole('link', { name: 'Logbuch' }).click(); await expect(page.locator('body')).toContainText('Joe'); - await expect(page.locator('body')).toContainText('(cox2)'); await expect(page.locator('body')).toContainText('Ottensheim (25 km)'); await expect(page.locator('body')).toContainText('Ruderer: cox2, rower2'); @@ -286,7 +285,6 @@ test("Cox can start and finish trip with cox steering only", async ({ page }, te await page.goto('/log/show'); await expect(page.locator('body')).toContainText('cox_only_steering_boat'); - await expect(page.locator('body')).toContainText('(cox2 - handgesteuert)'); await expect(page.locator('body')).toContainText('Ottensheim (25 km)'); diff --git a/templates/log.completed.html.tera b/templates/log.completed.html.tera index 622a34b..6ababff 100644 --- a/templates/log.completed.html.tera +++ b/templates/log.completed.html.tera @@ -26,7 +26,7 @@ {% for log in logs %} {% set_global allowed_to_edit = false %} {% if loggedin_user %} - {% if "Vorstand" in loggedin_user.roles %} + {% if "Vorstand" in loggedin_user.roles or "admin" in loggedin_user.roles %} {% set_global allowed_to_edit = true %} {% endif %} {% endif %} -- 2.47.2 From 5331ac71fa748ece212e6789e71a3b470d326225 Mon Sep 17 00:00:00 2001 From: Marie Birner Date: Mon, 5 May 2025 22:12:19 +0200 Subject: [PATCH 08/12] [TASK] add icons to add new user and improve ui in setting a fixed height in activity log --- templates/admin/user/index.html.tera | 6 +++--- templates/admin/user/view.html.tera | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/templates/admin/user/index.html.tera b/templates/admin/user/index.html.tera index d889e2f..05b1bd1 100644 --- a/templates/admin/user/index.html.tera +++ b/templates/admin/user/index.html.tera @@ -12,13 +12,13 @@
+ class="btn btn-primary">🥳 Vereinsmitglied + class="btn btn-dark">🧑‍🏫 Scheckbuch + class="btn btn-dark">👨‍🎓 Schnupperkurs
diff --git a/templates/admin/user/view.html.tera b/templates/admin/user/view.html.tera index 80edf2d..cfd5d98 100644 --- a/templates/admin/user/view.html.tera +++ b/templates/admin/user/view.html.tera @@ -402,11 +402,11 @@ {% endif %}

Aktivitäten

-
+