Merge pull request 'nicer-cal' (#574) from nicer-cal into main
All checks were successful
CI/CD Pipeline / test (push) Successful in 10m6s
CI/CD Pipeline / deploy-staging (push) Has been skipped
CI/CD Pipeline / deploy-main (push) Successful in 6m0s

Reviewed-on: #574
This commit is contained in:
philipp 2024-06-06 07:11:43 +02:00
commit d00570ff2f
5 changed files with 33 additions and 4 deletions

View File

@ -98,6 +98,7 @@ FROM trip WHERE planned_event_id = ?
} }
} }
#[derive(Debug)]
pub struct EventUpdate<'a> { pub struct EventUpdate<'a> {
pub name: &'a str, pub name: &'a str,
pub planned_amount_cox: i32, pub planned_amount_cox: i32,
@ -343,6 +344,10 @@ WHERE trip_details.id=?
Ok(()) Ok(())
} }
pub fn is_cancelled(&self) -> bool {
self.max_people == 0
}
pub async fn get_ics_feed(db: &SqlitePool) -> String { pub async fn get_ics_feed(db: &SqlitePool) -> String {
let mut calendar = ICalendar::new("2.0", "ics-rs"); let mut calendar = ICalendar::new("2.0", "ics-rs");
@ -355,7 +360,22 @@ WHERE trip_details.id=?
event.day.replace('-', ""), event.day.replace('-', ""),
event.planned_starting_time.replace(':', "") event.planned_starting_time.replace(':', "")
))); )));
vevent.push(Summary::new(event.name)); let mut name = String::new();
if event.is_cancelled() {
name.push_str("ABGESAGT! :-( ");
}
name.push_str(&format!("{} ", event.name));
let tripdetails = event.trip_details(db).await;
if let Some(triptype) = tripdetails.triptype(db).await {
name.push_str(&format!("{} ", triptype.name))
}
if let Some(notes) = tripdetails.notes {
if !notes.is_empty() {
name.push_str(&format!("({notes}) "))
}
}
vevent.push(Summary::new(name));
calendar.add_event(vevent); calendar.add_event(vevent);
} }
let mut buf = Vec::new(); let mut buf = Vec::new();
@ -414,6 +434,6 @@ mod test {
let pool = testdb!(); let pool = testdb!();
let actual = Event::get_ics_feed(&pool).await; let actual = Event::get_ics_feed(&pool).await;
assert_eq!("BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:ics-rs\r\nBEGIN:VEVENT\r\nUID:1@rudernlinz.at\r\nDTSTAMP:19900101T180000\r\nDTSTART:19700101T100000\r\nSUMMARY:test-planned-event\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", actual); assert_eq!("BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:ics-rs\r\nBEGIN:VEVENT\r\nUID:1@rudernlinz.at\r\nDTSTAMP:19900101T180000\r\nDTSTART:19700101T100000\r\nSUMMARY:test-planned-event (trip_details for a planned event) \r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", actual);
} }
} }

View File

@ -7,6 +7,7 @@ use sqlx::{FromRow, SqlitePool};
use super::{ use super::{
notification::Notification, notification::Notification,
trip::{Trip, TripWithUserAndType}, trip::{Trip, TripWithUserAndType},
triptype::TripType,
}; };
#[derive(FromRow, Debug, Serialize, Deserialize)] #[derive(FromRow, Debug, Serialize, Deserialize)]
@ -51,6 +52,13 @@ WHERE id like ?
.ok() .ok()
} }
pub async fn triptype(&self, db: &SqlitePool) -> Option<TripType> {
match self.trip_type_id {
None => None,
Some(id) => TripType::find_by_id(db, id).await,
}
}
pub async fn find_by_startingdatetime( pub async fn find_by_startingdatetime(
db: &SqlitePool, db: &SqlitePool,
day: String, day: String,

View File

@ -4,7 +4,7 @@ use sqlx::{FromRow, SqlitePool};
#[derive(FromRow, Debug, Serialize, Deserialize, Clone)] #[derive(FromRow, Debug, Serialize, Deserialize, Clone)]
pub struct TripType { pub struct TripType {
pub id: i64, pub id: i64,
name: String, pub name: String,
desc: String, desc: String,
question: String, question: String,
icon: String, icon: String,

View File

@ -40,7 +40,7 @@ async fn create(
} }
//TODO: add constraints (e.g. planned_amount_cox > 0) //TODO: add constraints (e.g. planned_amount_cox > 0)
#[derive(FromForm)] #[derive(FromForm, Debug)]
struct UpdateEventForm<'r> { struct UpdateEventForm<'r> {
id: i64, id: i64,
name: &'r str, name: &'r str,

View File

@ -251,6 +251,7 @@
{{ macros::input(label='', name='planned_amount_cox', type='hidden', value=event.planned_amount_cox) }} {{ macros::input(label='', name='planned_amount_cox', type='hidden', value=event.planned_amount_cox) }}
{{ macros::input(label='', name='always_show', type='hidden', value=event.always_show) }} {{ macros::input(label='', name='always_show', type='hidden', value=event.always_show) }}
{{ macros::input(label='', name='is_locked', type='hidden', value=event.is_locked) }} {{ macros::input(label='', name='is_locked', type='hidden', value=event.is_locked) }}
{{ macros::input(label='', name='trip_type', type='hidden', value=event.trip_type_id) }}
<input value="Ausfahrt absagen" class="btn btn-alert" type="submit" /> <input value="Ausfahrt absagen" class="btn btn-alert" type="submit" />
</form> </form>
</div> </div>