From b40850626b45b9b927d4d9e3f78449ce61f0fe9b Mon Sep 17 00:00:00 2001 From: philipp Date: Wed, 4 Sep 2024 19:40:52 +0300 Subject: [PATCH] improvements, styling, additional infos --- src/model/logbook.rs | 44 ++++++++ src/model/personal/equatorprice.rs | 3 +- src/model/personal/mod.rs | 20 ++-- src/model/personal/rowingbadge.rs | 39 +++---- templates/achievement.html.tera | 30 ++++-- templates/index.html.tera | 163 +++++++++++++++++------------ 6 files changed, 192 insertions(+), 107 deletions(-) diff --git a/src/model/logbook.rs b/src/model/logbook.rs index 4134cbb..86025fe 100644 --- a/src/model/logbook.rs +++ b/src/model/logbook.rs @@ -299,6 +299,50 @@ ORDER BY departure DESC ret } + pub async fn year_first_logbook_entry(db: &SqlitePool, user: &User) -> Option { + let log: Option = sqlx::query_as( + &format!(" + SELECT id, boat_id, shipmaster, steering_person, shipmaster_only_steering, departure, arrival, destination, distance_in_km, comments, logtype + FROM logbook + JOIN rower ON logbook.id = rower.logbook_id + WHERE arrival is not null AND rower_id = {} + ORDER BY arrival + LIMIT 1 + ", user.id) + ) + .fetch_optional(db) + .await + .unwrap(); //TODO: fixme + + if let Some(log) = log { + Some(log.arrival.unwrap().year()) + } else { + None + } + } + + pub async fn year_last_logbook_entry(db: &SqlitePool, user: &User) -> Option { + let log: Option = sqlx::query_as( + &format!(" + SELECT id, boat_id, shipmaster, steering_person, shipmaster_only_steering, departure, arrival, destination, distance_in_km, comments, logtype + FROM logbook + JOIN rower ON logbook.id = rower.logbook_id + WHERE arrival is not null AND rower_id = {} + ORDER BY arrival DESC + LIMIT 1 + ", user.id) + ) + .fetch_optional(db) + .await + .unwrap(); //TODO: fixme + + if let Some(log) = log { + Some(log.arrival.unwrap().year()) + } else { + None + } + } + pub(crate) async fn completed_wanderfahrten_with_user_over_km_in_year( db: &SqlitePool, user: &User, diff --git a/src/model/personal/equatorprice.rs b/src/model/personal/equatorprice.rs index e97c706..97a489a 100644 --- a/src/model/personal/equatorprice.rs +++ b/src/model/personal/equatorprice.rs @@ -1,5 +1,4 @@ use serde::Serialize; -use sqlx::SqlitePool; #[derive(Serialize, PartialEq, Debug)] pub(crate) enum Level { @@ -31,7 +30,7 @@ impl Level { } else if km < Level::GOLD.required_km() { Level::GOLD } else if km < Level::DIAMOND.required_km() { - Level::BRONZE + Level::DIAMOND } else { Level::DONE } diff --git a/src/model/personal/mod.rs b/src/model/personal/mod.rs index a91e551..cc9c53c 100644 --- a/src/model/personal/mod.rs +++ b/src/model/personal/mod.rs @@ -3,7 +3,7 @@ use equatorprice::Level; use serde::Serialize; use sqlx::SqlitePool; -use super::{stat::Stat, user::User}; +use super::{logbook::Logbook, stat::Stat, user::User}; pub(crate) mod equatorprice; pub(crate) mod rowingbadge; @@ -14,6 +14,9 @@ pub(crate) struct Achievements { pub(crate) curr_equatorprice_name: String, pub(crate) new_equatorprice_this_season: bool, pub(crate) rowingbadge: Option, + pub(crate) all_time_km: i32, + pub(crate) year_first_mentioned: Option, + pub(crate) year_last_mentioned: Option, } impl Achievements { @@ -31,25 +34,18 @@ impl Achievements { .await .rowed_km }; - println!( - "old: {}; new: {}", - rowed_km, - rowed_km - rowed_km_this_season - ); - println!( - "old: {:?}; new: {:?}", - Level::curr_level(rowed_km), - Level::curr_level(rowed_km - rowed_km_this_season) - ); + let new_equatorprice_this_season = Level::curr_level(rowed_km) != Level::curr_level(rowed_km - rowed_km_this_season); - println!("{new_equatorprice_this_season:?}"); Self { equatorprice: equatorprice::Next::new(rowed_km), curr_equatorprice_name: equatorprice::Level::curr_level(rowed_km).desc().to_string(), new_equatorprice_this_season, rowingbadge: rowingbadge::Status::for_user(db, user).await, + all_time_km: rowed_km, + year_first_mentioned: Logbook::year_first_logbook_entry(db, user).await, + year_last_mentioned: Logbook::year_last_logbook_entry(db, user).await, } } } diff --git a/src/model/personal/rowingbadge.rs b/src/model/personal/rowingbadge.rs index 32093b7..446b886 100644 --- a/src/model/personal/rowingbadge.rs +++ b/src/model/personal/rowingbadge.rs @@ -69,26 +69,29 @@ impl TryFrom<&User> for AgeBracket { type Error = String; fn try_from(value: &User) -> Result { - if let Some(birthdate) = value.birthdate.clone() { - let today = Local::now().date_naive(); - let birthdate = NaiveDate::parse_from_str(&birthdate, "%Y-%m-%d").unwrap(); + let Some(birthdate) = value.birthdate.clone() else { + return Err("User has no birthdate".to_string()); + }; - let age = today.year() - birthdate.year(); - if age <= 14 { - Ok(AgeBracket::Till14) - } else if age <= 18 { - Ok(AgeBracket::From14Till18) - } else if age <= 30 { - Ok(AgeBracket::From19Till30) - } else if age <= 60 { - Ok(AgeBracket::From31Till60) - } else if age <= 75 { - Ok(AgeBracket::From61Till75) - } else { - Ok(AgeBracket::From76) - } + let Ok(birthdate) = NaiveDate::parse_from_str(&birthdate, "%Y-%m-%d") else { + return Err("Birthdate in wrong format...".to_string()); + }; + + let today = Local::now().date_naive(); + + let age = today.year() - birthdate.year(); + if age <= 14 { + Ok(AgeBracket::Till14) + } else if age <= 18 { + Ok(AgeBracket::From14Till18) + } else if age <= 30 { + Ok(AgeBracket::From19Till30) + } else if age <= 60 { + Ok(AgeBracket::From31Till60) + } else if age <= 75 { + Ok(AgeBracket::From61Till75) } else { - Err("User has no birthdate".to_string()) + Ok(AgeBracket::From76) } } } diff --git a/templates/achievement.html.tera b/templates/achievement.html.tera index 63dd412..4232520 100644 --- a/templates/achievement.html.tera +++ b/templates/achievement.html.tera @@ -3,15 +3,19 @@ {% extends "base" %} {% block content %} -
+

Abzeichen für {{ rowingbadge_year }}

- - + + + + + + @@ -24,7 +28,15 @@ {% set achievement = person.1 %} - + + + + + {% if achievement.rowingbadge %} {% set badge = achievement.rowingbadge %} {% else %} - - - - - + + + + + {% endif %} {% endfor %} diff --git a/templates/index.html.tera b/templates/index.html.tera index 40286c6..bc5c3c3 100644 --- a/templates/index.html.tera +++ b/templates/index.html.tera @@ -79,78 +79,109 @@

Persönliches

-

- {% if achievements.rowingbadge and achievements.rowingbadge.achieved %}🎉{% endif %} - Fahrtenabzeichen - {% if achievements.rowingbadge %}{{ achievements.rowingbadge.year }}{% endif %} - + +

+ + {% if achievements.rowingbadge and achievements.rowingbadge.achieved %} + 🎉 + {% else %} + 📋 + {% endif %} + + Fahrtenabzeichen + {% if achievements.rowingbadge %}{{ achievements.rowingbadge.year }}{% endif %} + ? -

- {% if achievements.rowingbadge %} - {% set badge = achievements.rowingbadge %} -
{{ badge.category }}
- - -

Wanderfahrten

-
Nur 1 muss erreicht werden
-
    -
  1. - {% if badge.multi_day_trips_over_required_distance | length >= 1 %} - ✅ - {% else %} - ❌ - {% endif %} - 1 mehrtägige Wanderfahrt > {{ badge.multi_day_trips_required_distance }} km -
  2. -
  3. - {% if badge.single_day_trips_over_required_distance | length >= 2 %} - ✅ - {% else %} - ❌ - {% endif %} - 2 eintägige Wanderfahrten > {{ badge.single_day_trips_required_distance }} km -
  4. -
-
- Details zu den Wanderfahrten + class="w-6 h-6 inline-flex align-center justify-center rounded-full bg-primary-500 ml-2">? +

+ + {% if achievements.rowingbadge %} + {% set badge = achievements.rowingbadge %} +
{{ badge.category }}
+ + +

Wanderfahrten

+
Nur 1 muss erreicht werden
+
    +
  1. + {% if badge.multi_day_trips_over_required_distance | length >= 1 %} + ✅ + {% else %} + ❌ + {% endif %} + 1 mehrtägige Wanderfahrt > {{ badge.multi_day_trips_required_distance }} km +
  2. +
  3. + {% if badge.single_day_trips_over_required_distance | length >= 2 %} + ✅ + {% else %} + ❌ + {% endif %} + 2 eintägige Wanderfahrten > {{ badge.single_day_trips_required_distance }} km +
  4. +
+
+ Details zu den Wanderfahrten +
+ {% for log in badge.single_day_trips_over_required_distance %} + {{ log::show_old(log=log, state="completed", only_ones=false, index=loop.index) }} + {% endfor %} + {% for log in badge.multi_day_trips_over_required_distance %} + {{ log::show_old(log=log, state="completed", only_ones=false, index=loop.index) }} + {% endfor %} +
+
+ {% else %}
- {% for log in badge.single_day_trips_over_required_distance %} - {{ log::show_old(log=log, state="completed", only_ones=false, index=loop.index) }} - {% endfor %} - {% for log in badge.multi_day_trips_over_required_distance %} - {{ log::show_old(log=log, state="completed", only_ones=false, index=loop.index) }} - {% endfor %} + Wir haben leider kein Geburtsdatum von dir und können dir leider deinen heurigen Status für das Fahrtenabzeichen nicht anzeigen. Wenn du dein Geburtsdatum an it@rudernlinz.at schreibst, lässt sich das ändern :-)
- - {% else %} - Wir haben leider kein Geburtsdatum von dir und können dir leider deinen heurigen Status für das Fahrtenabzeichen nicht anzeigen. Wenn du dein Geburtsdatum an it@rudernlinz.at schreibst, lässt sich das ändern :-) - {% endif %} + {% endif %} +
-

- Äquatorpreis - + +

+ {% set price = achievements.equatorprice %} + + {% if achievements.curr_equatorprice_name == "-" %} + 📋 + {% elif achievements.curr_equatorprice_name == "Bronze" %} + 🥉 + {% elif achievements.curr_equatorprice_name == "Silber" %} + 🥈 + {% elif achievements.curr_equatorprice_name == "Gold" %} + 🥇 + {% elif achievements.curr_equatorprice_name == "Diamant" %} + 💍 + {% endif %} + + Äquatorpreis + ? -

- {% set price = achievements.equatorprice %} - {% if price.level == "DONE" %} - Gratuliere, du hast alles in deinem Rudererleben erreicht, was es (beim Äquatorpreis) zu erreichen gibt. - {% else %} - - -
- Details - Du bist insgesamt {{ price.rowed_km }} km gerudert. Um den Äquatorpreis in {{ price.level }} zu erhalten, benötigst du noch {{ price.missing_km }} km um die notwendigen {{ price.required_km }} km zu erreichen. -
- {% endif %} + class="w-6 h-6 inline-flex align-center justify-center rounded-full bg-primary-500 ml-2">? +

+ +
+ {% if price.level == "DONE" %} + Gratuliere, du hast alles in deinem Rudererleben erreicht, was es (beim Äquatorpreis) zu erreichen gibt. + {% else %} + + +
+ Details + Du bist insgesamt {{ price.rowed_km }} km gerudert. Um den Äquatorpreis in {{ price.desc }} zu erhalten, benötigst du noch {{ price.missing_km }} km um die notwendigen {{ price.required_km }} km zu erreichen. +
+ {% endif %} +
+
-- 2.45.2
NameÄquatorpreisFahrtenabzeichen (FA) geschafftErster LogLetzter LogGesamt-KMÄquatorpreis (ÄP)ÄP diese
Saison bekommen
Fahrtenabzeichen (FA)
geschafft
FA - KM FA - fehlende KM Eintagesausfahrten
{{ user.name }}{% if achievement.new_equatorprice_this_season %}(NEU!) {% endif %}{{ achievement.curr_equatorprice_name }} {% if achievement.year_first_mentioned %}{{ achievement.year_first_mentioned }}{% endif %}{% if achievement.year_last_mentioned %}{{ achievement.year_last_mentioned }}{% endif %}{{ achievement.all_time_km }} + {{ achievement.curr_equatorprice_name }} + + {% if achievement.new_equatorprice_this_season %}🎉{% else %}-{% endif %} + @@ -57,11 +69,11 @@ no birthdate of this personno birthdate of this personno birthdate of this personno birthdate of this personno birthdate of this personGeb.datum fehlt 👻Geb.datum fehlt 👻Geb.datum fehlt 👻Geb.datum fehlt 👻Geb.datum fehlt 👻