From 63edc3d249d373a5312950a0f8071be4c9ecdf7b Mon Sep 17 00:00:00 2001 From: Philipp Hofer Date: Sat, 17 May 2025 10:08:07 +0200 Subject: [PATCH] default duration in cal of trips with type Lange Ausfahrt -> 6 hrs (instead of 3); Fixes #939 --- src/model/event.rs | 21 +++++++++++++++++++-- src/model/personal/cal.rs | 4 ++-- src/model/trip.rs | 28 +++++++++++++++++++++------- src/tera/auth.rs | 6 +++--- 4 files changed, 45 insertions(+), 14 deletions(-) diff --git a/src/model/event.rs b/src/model/event.rs index 4af2276..5fa0ba7 100644 --- a/src/model/event.rs +++ b/src/model/event.rs @@ -2,8 +2,8 @@ use std::io::Write; use chrono::{Duration, NaiveDate, NaiveTime}; use ics::{ - ICalendar, properties::{DtEnd, DtStart, Summary}, + ICalendar, }; use serde::Serialize; use sqlx::{FromRow, Row, SqlitePool}; @@ -142,6 +142,14 @@ WHERE planned_event.id like ? .ok() } + async fn trip_type(&self, db: &SqlitePool) -> Option { + if let Some(trip_type_id) = self.trip_type_id { + TripType::find_by_id(db, trip_type_id).await + } else { + None + } + } + pub async fn get_pinned_for_day(db: &SqlitePool, day: NaiveDate) -> Vec { let mut events = Self::get_for_day(db, day).await; events.retain(|e| e.event.always_show); @@ -485,7 +493,16 @@ WHERE trip_details.id=? let original_time = NaiveTime::parse_from_str(&self.planned_starting_time, "%H:%M") .expect("Failed to parse time"); - let later_time = original_time + Duration::hours(3); + + let long_trip = match self.trip_type(db).await { + Some(a) if a.name == "Lange Ausfahrt" => true, + _ => false, + }; + let later_time = if long_trip { + original_time + Duration::hours(6) + } else { + original_time + Duration::hours(3) + }; if later_time > original_time { // Check if no day-overflow let time_three_hours_later = later_time.format("%H%M").to_string(); diff --git a/src/model/personal/cal.rs b/src/model/personal/cal.rs index 2f5d68d..fdbe963 100644 --- a/src/model/personal/cal.rs +++ b/src/model/personal/cal.rs @@ -1,6 +1,6 @@ use std::io::Write; -use ics::{ICalendar, components::Property}; +use ics::{components::Property, ICalendar}; use sqlx::SqlitePool; use crate::model::{event::Event, trip::Trip, user::User}; @@ -19,7 +19,7 @@ pub(crate) async fn get_personal_cal(db: &SqlitePool, user: &User) -> String { let trips = Trip::all_with_user(db, user).await; for trip in trips { - calendar.add_event(trip.get_vevent(user).await); + calendar.add_event(trip.get_vevent(db, user).await); } let mut buf = Vec::new(); write!(&mut buf, "{}", calendar).unwrap(); diff --git a/src/model/trip.rs b/src/model/trip.rs index b654721..100cf67 100644 --- a/src/model/trip.rs +++ b/src/model/trip.rs @@ -145,7 +145,15 @@ WHERE trip_details.id=? .ok() } - pub(crate) async fn get_vevent(self, user: &User) -> ics::Event { + async fn trip_type(&self, db: &SqlitePool) -> Option { + if let Some(trip_type_id) = self.trip_type_id { + TripType::find_by_id(db, trip_type_id).await + } else { + None + } + } + + pub(crate) async fn get_vevent<'a>(self, db: &'a SqlitePool, user: &'a User) -> ics::Event<'a> { let mut vevent = ics::Event::new(format!("trip-{}@rudernlinz.at", self.id), "19900101T180000"); let time_str = self.planned_starting_time.replace(':', ""); @@ -163,7 +171,15 @@ WHERE trip_details.id=? let original_time = NaiveTime::parse_from_str(&self.planned_starting_time, "%H:%M") .expect("Failed to parse time"); - let later_time = original_time + Duration::hours(3); + let long_trip = match self.trip_type(db).await { + Some(a) if a.name == "Lange Ausfahrt" => true, + _ => false, + }; + let later_time = if long_trip { + original_time + Duration::hours(6) + } else { + original_time + Duration::hours(3) + }; if later_time > original_time { // Check if no day-overflow let time_three_hours_later = later_time.format("%H%M").to_string(); @@ -567,11 +583,9 @@ mod test { let last_notification = &Notification::for_user(&pool, &cox).await[0]; - assert!( - last_notification - .message - .starts_with("cox2 hat eine Ausfahrt zur selben Zeit") - ); + assert!(last_notification + .message + .starts_with("cox2 hat eine Ausfahrt zur selben Zeit")); } #[sqlx::test] diff --git a/src/tera/auth.rs b/src/tera/auth.rs index 4d4cde3..9bf204e 100644 --- a/src/tera/auth.rs +++ b/src/tera/auth.rs @@ -1,5 +1,4 @@ use rocket::{ - FromForm, Request, Route, State, form::Form, get, http::{Cookie, CookieJar}, @@ -9,12 +8,13 @@ use rocket::{ response::{Flash, Redirect}, routes, time::{Duration, OffsetDateTime}, + FromForm, Request, Route, State, }; -use rocket_dyn_templates::{Template, context, tera}; +use rocket_dyn_templates::{context, tera, Template}; use sqlx::SqlitePool; use crate::model::{ - activity::{self, ActivityBuilder, ReasonAuth}, + activity::{ActivityBuilder, ReasonAuth}, log::Log, user::{LoginError, User}, };