also be able to cancel trips (not only events)
Some checks failed
CI/CD Pipeline / test (push) Has been cancelled
CI/CD Pipeline / deploy-staging (push) Has been cancelled
CI/CD Pipeline / deploy-main (push) Has been cancelled

This commit is contained in:
Philipp Hofer 2025-04-18 23:24:03 +02:00
parent 10740f988d
commit 5cd75ed8c8
5 changed files with 23 additions and 19 deletions

View File

@ -7,7 +7,7 @@ use crate::AMOUNT_DAYS_TO_SHOW_TRIPS_AHEAD;
use self::{ use self::{
event::{Event, EventWithDetails}, event::{Event, EventWithDetails},
trip::{Trip, TripWithUserAndType}, trip::{Trip, TripWithDetails},
waterlevel::Waterlevel, waterlevel::Waterlevel,
weather::Weather, weather::Weather,
}; };
@ -45,7 +45,7 @@ pub mod weather;
pub struct Day { pub struct Day {
day: NaiveDate, day: NaiveDate,
events: Vec<EventWithDetails>, events: Vec<EventWithDetails>,
trips: Vec<TripWithUserAndType>, trips: Vec<TripWithDetails>,
is_pinned: bool, is_pinned: bool,
regular_sees_this_day: bool, regular_sees_this_day: bool,
max_waterlevel: Option<WaterlevelDay>, max_waterlevel: Option<WaterlevelDay>,

View File

@ -30,11 +30,12 @@ pub struct Trip {
} }
#[derive(Serialize, Debug)] #[derive(Serialize, Debug)]
pub struct TripWithUserAndType { pub struct TripWithDetails {
#[serde(flatten)] #[serde(flatten)]
pub trip: Trip, pub trip: Trip,
pub rower: Vec<Registration>, pub rower: Vec<Registration>,
trip_type: Option<TripType>, trip_type: Option<TripType>,
cancelled: bool,
} }
pub struct TripUpdate<'a> { pub struct TripUpdate<'a> {
@ -52,7 +53,7 @@ impl<'a> TripUpdate<'a> {
} }
} }
impl TripWithUserAndType { impl TripWithDetails {
pub async fn from(db: &SqlitePool, trip: Trip) -> Self { pub async fn from(db: &SqlitePool, trip: Trip) -> Self {
let mut trip_type = None; let mut trip_type = None;
if let Some(trip_type_id) = trip.trip_type_id { if let Some(trip_type_id) = trip.trip_type_id {
@ -60,8 +61,9 @@ impl TripWithUserAndType {
} }
Self { Self {
rower: Registration::all_rower(db, trip.trip_details_id.unwrap()).await, rower: Registration::all_rower(db, trip.trip_details_id.unwrap()).await,
trip,
trip_type, trip_type,
cancelled: trip.is_cancelled(),
trip,
} }
} }
} }
@ -268,12 +270,12 @@ WHERE trip.id=?
} }
} }
pub async fn get_for_today(db: &SqlitePool) -> Vec<TripWithUserAndType> { pub async fn get_for_today(db: &SqlitePool) -> Vec<TripWithDetails> {
let today = Local::now().date_naive(); let today = Local::now().date_naive();
Self::get_for_day(db, today).await Self::get_for_day(db, today).await
} }
pub async fn get_for_day(db: &SqlitePool, day: NaiveDate) -> Vec<TripWithUserAndType> { pub async fn get_for_day(db: &SqlitePool, day: NaiveDate) -> Vec<TripWithDetails> {
let day = format!("{day}"); let day = format!("{day}");
let trips = sqlx::query_as!( let trips = sqlx::query_as!(
Trip, Trip,
@ -292,7 +294,7 @@ WHERE day=?
let mut ret = Vec::new(); let mut ret = Vec::new();
for trip in trips { for trip in trips {
ret.push(TripWithUserAndType::from(db, trip).await); ret.push(TripWithDetails::from(db, trip).await);
} }
ret ret
} }
@ -336,9 +338,7 @@ WHERE day=?
.unwrap(); //Okay, as trip_details can only be created with proper DB backing .unwrap(); //Okay, as trip_details can only be created with proper DB backing
if update.cancelled() && !was_already_cancelled { if update.cancelled() && !was_already_cancelled {
let rowers = TripWithUserAndType::from(db, update.trip.clone()) let rowers = TripWithDetails::from(db, update.trip.clone()).await.rower;
.await
.rower;
for user in rowers { for user in rowers {
if let Some(user) = User::find_by_name(db, &user.name).await { if let Some(user) = User::find_by_name(db, &user.name).await {
let notes = match update.notes { let notes = match update.notes {
@ -462,7 +462,7 @@ WHERE day=?
pub(crate) async fn get_pinned_for_day( pub(crate) async fn get_pinned_for_day(
db: &sqlx::Pool<sqlx::Sqlite>, db: &sqlx::Pool<sqlx::Sqlite>,
day: NaiveDate, day: NaiveDate,
) -> Vec<TripWithUserAndType> { ) -> Vec<TripWithDetails> {
let mut trips = Self::get_for_day(db, day).await; let mut trips = Self::get_for_day(db, day).await;
trips.retain(|e| e.trip.always_show); trips.retain(|e| e.trip.always_show);
trips trips

View File

@ -6,7 +6,7 @@ use sqlx::{FromRow, SqlitePool};
use super::{ use super::{
notification::Notification, notification::Notification,
trip::{Trip, TripWithUserAndType}, trip::{Trip, TripWithDetails},
triptype::TripType, triptype::TripType,
}; };
@ -138,7 +138,7 @@ WHERE day = ? AND planned_starting_time = ?
// This trip_details belongs to a planned_event, no need to do anything // This trip_details belongs to a planned_event, no need to do anything
continue; continue;
}; };
let pot_coxes = TripWithUserAndType::from(db, trip.clone()).await; let pot_coxes = TripWithDetails::from(db, trip.clone()).await;
let pot_coxes = pot_coxes.rower; let pot_coxes = pot_coxes.rower;
for user in pot_coxes { for user in pot_coxes {
let cox = User::find_by_id(db, trip.cox_id as i32).await.unwrap(); let cox = User::find_by_id(db, trip.cox_id as i32).await.unwrap();

View File

@ -3,7 +3,7 @@ use sqlx::{FromRow, SqlitePool};
use super::{ use super::{
notification::Notification, notification::Notification,
trip::{Trip, TripWithUserAndType}, trip::{Trip, TripWithDetails},
tripdetails::TripDetails, tripdetails::TripDetails,
user::{SteeringUser, User}, user::{SteeringUser, User},
}; };
@ -158,7 +158,7 @@ impl UserTrip {
.unwrap() .unwrap()
.cancelled() .cancelled()
{ {
let trip = TripWithUserAndType::from(db, trip.clone()).await; let trip = TripWithDetails::from(db, trip.clone()).await;
if trip.rower.len() == 1 { if trip.rower.len() == 1 {
trip_to_delete = Some(trip.trip); trip_to_delete = Some(trip.trip);
} }

View File

@ -240,7 +240,11 @@
<input type="hidden" name="_method" value="put" /> <input type="hidden" name="_method" value="put" />
<input type="hidden" name="id" value="{{ event.id }}" /> <input type="hidden" name="id" value="{{ event.id }}" />
{{ macros::input(label='Titel', name='name', type='input', value=event.name) }} {{ macros::input(label='Titel', name='name', type='input', value=event.name) }}
{{ macros::input(label='Anzahl Ruderer', name='max_people', type='number', required=true, value=event.max_people, min='0') }} {% if event.cancelled %}
<input type="hidden" name="max_people" value="-1" />
{% else %}
{{ macros::input(label='Anzahl Ruderer', name='max_people', type='number', required=true, value=event.max_people, min='0') }}
{% endif %}
{{ macros::input(label='Anzahl Steuerleute', name='planned_amount_cox', type='number', value=event.planned_amount_cox, required=true, min='0') }} {{ macros::input(label='Anzahl Steuerleute', name='planned_amount_cox', type='number', value=event.planned_amount_cox, required=true, min='0') }}
{{ macros::checkbox(label='Immer anzeigen', name='always_show', id=event.id,checked=event.always_show) }} {{ macros::checkbox(label='Immer anzeigen', name='always_show', id=event.id,checked=event.always_show) }}
{{ macros::checkbox(label='Gesperrt', name='is_locked', id=event.id,checked=event.is_locked) }} {{ macros::checkbox(label='Gesperrt', name='is_locked', id=event.id,checked=event.is_locked) }}
@ -300,7 +304,7 @@
{% if trip.always_show and not day.regular_sees_this_day %} {% if trip.always_show and not day.regular_sees_this_day %}
<span title="Du siehst diese Ausfahrt schon, obwohl sie mehr als {{ amount_days_to_show_trips_ahead }} Tage in der Zukunft liegt. Du Magier!">🔮</span> <span title="Du siehst diese Ausfahrt schon, obwohl sie mehr als {{ amount_days_to_show_trips_ahead }} Tage in der Zukunft liegt. Du Magier!">🔮</span>
{% endif -%} {% endif -%}
{% if trip.max_people == 0 %} {% if trip.cancelled %}
<strong class="text-[#f43f5e]">&#9888; <strong class="text-[#f43f5e]">&#9888;
{{ trip.planned_starting_time }} {{ trip.planned_starting_time }}
Uhr</strong> Uhr</strong>
@ -322,7 +326,7 @@
{% endif %} {% endif %}
<br /> <br />
<a href="#" data-sidebar="true" data-trigger="sidebar" data-header="<strong> <a href="#" data-sidebar="true" data-trigger="sidebar" data-header="<strong>
{% if trip.max_people == 0 %}&#9888;{% endif %} {% if trip.cancelled %}&#9888;{% endif %}
{{ trip.planned_starting_time }} Uhr</strong> ({{ trip.cox_name }}) {{ trip.planned_starting_time }} Uhr</strong> ({{ trip.cox_name }})
{% if trip.trip_type %}<small class='block'>{{ trip.trip_type.desc }}</small>{% endif %} {% if trip.trip_type %}<small class='block'>{{ trip.trip_type.desc }}</small>{% endif %}
{% if trip.notes %}<small class='block'>{{ trip.notes }}</small>{% endif %} {% if trip.notes %}<small class='block'>{{ trip.notes }}</small>{% endif %}