Merge pull request 'default duration in cal of trips with type Lange Ausfahrt -> 6 hrs (instead of 3); Fixes #939' (#1040) from longer-long-trips into staging
All checks were successful
CI/CD Pipeline / test (push) Successful in 15m39s
CI/CD Pipeline / deploy-staging (push) Successful in 7m41s
CI/CD Pipeline / deploy-main (push) Has been skipped

Reviewed-on: #1040
This commit is contained in:
philipp 2025-05-17 10:08:58 +02:00
commit 6df029b4a7
4 changed files with 45 additions and 14 deletions

View File

@ -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<TripType> {
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<EventWithDetails> {
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();

View File

@ -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();

View File

@ -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<TripType> {
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
assert!(last_notification
.message
.starts_with("cox2 hat eine Ausfahrt zur selben Zeit")
);
.starts_with("cox2 hat eine Ausfahrt zur selben Zeit"));
}
#[sqlx::test]

View File

@ -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},
};