diff options
author | Harald Eilertsen <haraldei@anduin.net> | 2020-08-23 21:59:25 +0200 |
---|---|---|
committer | Harald Eilertsen <haraldei@anduin.net> | 2020-08-23 21:59:25 +0200 |
commit | 87734ea6b0311903d42ed9ae55965bdf4ea13cb4 (patch) | |
tree | cb5eeb4731b8a95666dce5aeb75ac8beb13ec882 /src/controllers | |
parent | 8413c96ffb0a96b96e63d629aff7abffe03301e3 (diff) | |
download | ramaskrik-social-87734ea6b0311903d42ed9ae55965bdf4ea13cb4.tar.gz ramaskrik-social-87734ea6b0311903d42ed9ae55965bdf4ea13cb4.tar.bz2 ramaskrik-social-87734ea6b0311903d42ed9ae55965bdf4ea13cb4.zip |
Implement edit screenings in web ui.
Diffstat (limited to 'src/controllers')
-rw-r--r-- | src/controllers/screening.rs | 49 |
1 files changed, 48 insertions, 1 deletions
diff --git a/src/controllers/screening.rs b/src/controllers/screening.rs index 40eefd3..cf7d1b1 100644 --- a/src/controllers/screening.rs +++ b/src/controllers/screening.rs @@ -22,7 +22,7 @@ use crate::{ }; use std::result::Result; -use rocket::{delete, get, post}; +use rocket::{delete, get, patch, post}; use rocket::request::{Form, FromForm}; use rocket::response::Redirect; use rocket_contrib::{ @@ -96,6 +96,53 @@ pub fn create_screening(db: db::Connection, screening: Form<NewScreeningForm>) - Ok(Redirect::to("/screenings")) } +#[get("/<id>")] +pub fn edit(db: db::Connection, id: i32) -> Result<Template, Box<dyn Error>> { + #[derive(Serialize)] + struct Context { + screening: models::Screening, + rooms: Vec<models::Room>, + films: Vec<models::Film>, + } + + let ctx = Context { + screening: db.get_screening(id)?, + rooms: db.get_rooms()?, + films: db.get_films()?, + }; + + Ok(Template::render("screening/edit", &ctx)) +} + +#[derive(FromForm)] +pub struct EditScreeningForm { + id: i32, + film_id: i32, + room_id: i32, + date: String, + start_time: String, + end_time: String, +} + +#[patch("/", format = "application/x-www-form-urlencoded", data = "<screening>")] +pub fn update(db: db::Connection, screening: Form<EditScreeningForm>) -> Result<Redirect, Box<dyn Error>> { + let start_time = parse_datetime(&screening.date, &screening.start_time)?; + let mut end_time = parse_datetime(&screening.date, &screening.end_time)?; + + if end_time < start_time { + end_time = end_time + chrono::Duration::days(1); + } + + db.update_screening( + screening.id, + screening.room_id, + screening.film_id, + start_time, + end_time)?; + + Ok(Redirect::to("/screenings")) +} + #[derive(FromForm)] pub struct DeleteScreeningForm { screening_id: i32, |