Merge pull request 'dont-repeatedly-get-price' (#1043) from dont-repeatedly-get-price into staging
Reviewed-on: #1043
This commit was merged in pull request #1043.
	This commit is contained in:
		| @@ -367,7 +367,6 @@ ORDER BY departure DESC | ||||
|         min_distance: i32, | ||||
|         year: i32, | ||||
|         filter: Filter, | ||||
|         exclude_last_log: bool, | ||||
|     ) -> Vec<LogbookWithBoatAndRowers> { | ||||
|         let logs: Vec<Logbook> = sqlx::query_as( | ||||
|                &format!(" | ||||
| @@ -399,9 +398,6 @@ ORDER BY departure DESC | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         if exclude_last_log { | ||||
|             ret.pop(); | ||||
|         } | ||||
|  | ||||
|         ret | ||||
|     } | ||||
|   | ||||
| @@ -2,7 +2,7 @@ use std::cmp; | ||||
|  | ||||
| use chrono::{Datelike, Local, NaiveDate}; | ||||
| use serde::Serialize; | ||||
| use sqlx::{Sqlite, SqlitePool, Transaction}; | ||||
| use sqlx::{Acquire, Sqlite, SqlitePool, Transaction}; | ||||
|  | ||||
| use crate::model::{ | ||||
|     logbook::{Filter, Logbook, LogbookWithBoatAndRowers}, | ||||
| @@ -141,11 +141,7 @@ impl Status { | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     pub(crate) async fn for_user_tx( | ||||
|         db: &mut Transaction<'_, Sqlite>, | ||||
|         user: &User, | ||||
|         exclude_last_log: bool, | ||||
|     ) -> Option<Self> { | ||||
|     pub(crate) async fn for_user_tx(db: &mut Transaction<'_, Sqlite>, user: &User) -> Option<Self> { | ||||
|         let Ok(agebracket) = AgeBracket::try_from(user) else { | ||||
|             return None; | ||||
|         }; | ||||
| @@ -164,7 +160,6 @@ impl Status { | ||||
|                 agebracket.required_dist_single_day_in_km(), | ||||
|                 year, | ||||
|                 Filter::SingleDayOnly, | ||||
|                 exclude_last_log, | ||||
|             ) | ||||
|             .await; | ||||
|         let multi_day_trips_over_required_distance = | ||||
| @@ -174,7 +169,6 @@ impl Status { | ||||
|                 agebracket.required_dist_multi_day_in_km(), | ||||
|                 year, | ||||
|                 Filter::MultiDayOnly, | ||||
|                 exclude_last_log, | ||||
|             ) | ||||
|             .await; | ||||
|  | ||||
| @@ -195,7 +189,7 @@ impl Status { | ||||
|  | ||||
|     pub(crate) async fn for_user(db: &SqlitePool, user: &User) -> Option<Self> { | ||||
|         let mut tx = db.begin().await.unwrap(); | ||||
|         let ret = Self::for_user_tx(&mut tx, user, false).await; | ||||
|         let ret = Self::for_user_tx(&mut tx, user).await; | ||||
|         tx.commit().await.unwrap(); | ||||
|         ret | ||||
|     } | ||||
| @@ -204,11 +198,19 @@ impl Status { | ||||
|         db: &mut Transaction<'_, Sqlite>, | ||||
|         user: &User, | ||||
|     ) -> bool { | ||||
|         if let Some(status) = Self::for_user_tx(db, user, false).await { | ||||
|         if let Some(status) = Self::for_user_tx(db, user).await { | ||||
|             // if user has agebracket... | ||||
|             if status.achieved { | ||||
|                 // ... and has achieved the 'Fahrtenabzeichen' | ||||
|                 let without_last_entry = Self::for_user_tx(db, user, true).await.unwrap(); | ||||
|                 let mut without_last = db.begin().await.unwrap(); | ||||
|                 let last = Logbook::completed_with_user_tx(&mut without_last, user).await; | ||||
|                 let last = last.last().unwrap(); | ||||
|                 sqlx::query!("DELETE FROM logbook WHERE id=?", last.logbook.id) | ||||
|                     .execute(&mut *without_last) | ||||
|                     .await | ||||
|                     .unwrap(); //Okay, because we can only create a Logbook of a valid id | ||||
|  | ||||
|                 let without_last_entry = Self::for_user_tx(&mut without_last, user).await.unwrap(); | ||||
|                 if !without_last_entry.achieved { | ||||
|                     // ... and this wasn't the case before the last logentry | ||||
|                     return true; | ||||
|   | ||||
| @@ -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, ReasonAuth}; | ||||
| 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; | ||||
| @@ -487,7 +487,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() { | ||||
| @@ -590,9 +590,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() | ||||
| @@ -601,9 +601,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() | ||||
| @@ -835,8 +835,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"); | ||||
| @@ -950,21 +950,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] | ||||
| @@ -984,11 +980,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; | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user