Compare commits

...

3 Commits

Author SHA1 Message Date
7e41cd3f73 Merge pull request 'add-notification' (#661) from add-notification into staging
Some checks are pending
CI/CD Pipeline / test (push) Waiting to run
CI/CD Pipeline / deploy-staging (push) Blocked by required conditions
CI/CD Pipeline / deploy-main (push) Blocked by required conditions
Reviewed-on: #661
2024-07-30 23:27:11 +02:00
2a8c339dcd push
Some checks failed
CI/CD Pipeline / deploy-staging (push) Has been cancelled
CI/CD Pipeline / test (push) Has been cancelled
CI/CD Pipeline / deploy-main (push) Has been cancelled
2024-07-30 23:24:46 +02:00
0dd10e1dd6 Merge pull request 'extend filter' (#660) from add-filter into main
All checks were successful
CI/CD Pipeline / test (push) Successful in 10m18s
CI/CD Pipeline / deploy-staging (push) Has been skipped
CI/CD Pipeline / deploy-main (push) Successful in 6m30s
Reviewed-on: #660
2024-07-29 14:27:22 +02:00
2 changed files with 51 additions and 30 deletions

View File

@ -1,6 +1,6 @@
use std::ops::DerefMut; use std::ops::DerefMut;
use chrono::{Datelike, Local, NaiveDateTime}; use chrono::{Datelike, Duration, Local, NaiveDateTime};
use rocket::FromForm; use rocket::FromForm;
use serde::Serialize; use serde::Serialize;
use sqlx::{FromRow, Sqlite, SqlitePool, Transaction}; use sqlx::{FromRow, Sqlite, SqlitePool, Transaction};
@ -110,6 +110,20 @@ pub struct LogbookWithBoatAndRowers {
pub rowers: Vec<User>, pub rowers: Vec<User>,
} }
impl LogbookWithBoatAndRowers {
pub(crate) async fn from(db: &SqlitePool, log: Logbook) -> Self {
Self {
rowers: Rower::for_log(db, &log).await,
boat: Boat::find_by_id(db, log.boat_id as i32).await.unwrap(),
shipmaster_user: User::find_by_id(db, log.shipmaster as i32).await.unwrap(),
steering_user: User::find_by_id(db, log.steering_person as i32)
.await
.unwrap(),
logbook: log,
}
}
}
#[derive(Debug, PartialEq)] #[derive(Debug, PartialEq)]
pub enum LogbookAdminUpdateError { pub enum LogbookAdminUpdateError {
NotAllowed, NotAllowed,
@ -248,15 +262,7 @@ ORDER BY departure DESC
let mut ret = Vec::new(); let mut ret = Vec::new();
for log in logs { for log in logs {
ret.push(LogbookWithBoatAndRowers { ret.push(LogbookWithBoatAndRowers::from(db, log).await);
rowers: Rower::for_log(db, &log).await,
boat: Boat::find_by_id(db, log.boat_id as i32).await.unwrap(),
shipmaster_user: User::find_by_id(db, log.shipmaster as i32).await.unwrap(),
steering_user: User::find_by_id(db, log.steering_person as i32)
.await
.unwrap(),
logbook: log,
});
} }
ret ret
} }
@ -280,15 +286,7 @@ ORDER BY departure DESC
let mut ret = Vec::new(); let mut ret = Vec::new();
for log in logs { for log in logs {
ret.push(LogbookWithBoatAndRowers { ret.push(LogbookWithBoatAndRowers::from(db, log).await);
rowers: Rower::for_log(db, &log).await,
boat: Boat::find_by_id(db, log.boat_id as i32).await.unwrap(),
shipmaster_user: User::find_by_id(db, log.shipmaster as i32).await.unwrap(),
steering_user: User::find_by_id(db, log.steering_person as i32)
.await
.unwrap(),
logbook: log,
});
} }
ret ret
} }
@ -313,15 +311,7 @@ ORDER BY departure DESC
let mut ret = Vec::new(); let mut ret = Vec::new();
for log in logs { for log in logs {
ret.push(LogbookWithBoatAndRowers { ret.push(LogbookWithBoatAndRowers::from(db, log).await);
rowers: Rower::for_log(db, &log).await,
boat: Boat::find_by_id(db, log.boat_id as i32).await.unwrap(),
shipmaster_user: User::find_by_id(db, log.shipmaster as i32).await.unwrap(),
steering_user: User::find_by_id(db, log.steering_person as i32)
.await
.unwrap(),
logbook: log,
});
} }
ret ret
} }
@ -713,6 +703,37 @@ ORDER BY departure DESC
|| user.has_role(db, "Vorstand").await || user.has_role(db, "Vorstand").await
|| user.id == self.shipmaster || user.id == self.shipmaster
{ {
let now = Local::now().naive_local();
let difference = now - self.departure;
if difference > Duration::hours(1) {
let vorstand = Role::find_by_name(db, "Vorstand").await.unwrap();
let logbook = LogbookWithBoatAndRowers::from(db, self.clone()).await;
let mut msg = format!("{} hat folgenden Logbuch-Eintrag jetzt gelöscht, welcher bereits vor über einer Stunde begonnen wurde: Schiffsführer: {}, Steuerperson: {}, Abfahrt: {}", user.name, logbook.steering_user.name, logbook.steering_user.name, logbook.logbook.departure.format("%Y-%m-%d %H:%M"));
if let Some(destination) = logbook.logbook.destination {
msg.push_str(&format!(", Ziel: {}", destination));
} else {
msg.push_str(", kein Ziel eingegeben");
}
msg.push_str(", Ruderer: ");
let mut it = logbook.rowers.clone().into_iter().peekable();
while let Some(rower) = it.next() {
msg.push_str(&rower.name);
if it.peek().is_some() {
msg.push_str(" + ");
}
}
Notification::create_for_role(
db,
&vorstand,
&msg,
"Ungewöhnliches Verhalten",
None,
None,
)
.await;
}
sqlx::query!("DELETE FROM logbook WHERE id=?", self.id) sqlx::query!("DELETE FROM logbook WHERE id=?", self.id)
.execute(db) .execute(db)
.await .await

View File

@ -311,12 +311,12 @@ async fn update(
Flash::success( Flash::success(
Redirect::to("/log/show"), Redirect::to("/log/show"),
format!("Logbucheintrag erfolgreich bearbeitet"), "Logbucheintrag erfolgreich bearbeitet".to_string(),
) )
} }
Err(LogbookAdminUpdateError::NotAllowed) => Flash::error( Err(LogbookAdminUpdateError::NotAllowed) => Flash::error(
Redirect::to("/log/show"), Redirect::to("/log/show"),
format!("Du hast keine Erlaubnis, diesen Logbucheintrag zu bearbeiten!"), "Du hast keine Erlaubnis, diesen Logbucheintrag zu bearbeiten!".to_string(),
), ),
} }
} }