update-fingerprint-responsible-people #663
@@ -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
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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(),
 | 
				
			||||||
        ),
 | 
					        ),
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user