push
This commit is contained in:
		| @@ -1,12 +1,18 @@ | |||||||
| pub use sea_orm_migration::prelude::*; | pub use sea_orm_migration::prelude::*; | ||||||
|  |  | ||||||
| mod m20230208_114547_create_day; | mod m20230208_114547_create_day; | ||||||
|  | mod m20230209_063357_create_user; | ||||||
|  | mod m20230209_074936_create_trip; | ||||||
|  |  | ||||||
| pub struct Migrator; | pub struct Migrator; | ||||||
|  |  | ||||||
| #[async_trait::async_trait] | #[async_trait::async_trait] | ||||||
| impl MigratorTrait for Migrator { | impl MigratorTrait for Migrator { | ||||||
|     fn migrations() -> Vec<Box<dyn MigrationTrait>> { |     fn migrations() -> Vec<Box<dyn MigrationTrait>> { | ||||||
|         vec![Box::new(m20230208_114547_create_day::Migration)] |         vec![ | ||||||
|  |             Box::new(m20230208_114547_create_day::Migration), | ||||||
|  |             Box::new(m20230209_063357_create_user::Migration), | ||||||
|  |             Box::new(m20230209_074936_create_trip::Migration), | ||||||
|  |         ] | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -12,7 +12,12 @@ impl MigrationTrait for Migration { | |||||||
|                     .table(Day::Table) |                     .table(Day::Table) | ||||||
|                     .if_not_exists() |                     .if_not_exists() | ||||||
|                     .col(ColumnDef::new(Day::Day).date().not_null().primary_key()) |                     .col(ColumnDef::new(Day::Day).date().not_null().primary_key()) | ||||||
|                     .col(ColumnDef::new(Day::PlannedAmountCox).integer().default(0)) |                     .col( | ||||||
|  |                         ColumnDef::new(Day::PlannedAmountCox) | ||||||
|  |                             .not_null() | ||||||
|  |                             .integer() | ||||||
|  |                             .default(0), | ||||||
|  |                     ) | ||||||
|                     .col( |                     .col( | ||||||
|                         ColumnDef::new(Day::PlannedStartingTime) |                         ColumnDef::new(Day::PlannedStartingTime) | ||||||
|                             .string() |                             .string() | ||||||
| @@ -38,7 +43,7 @@ impl MigrationTrait for Migration { | |||||||
|  |  | ||||||
| /// Learn more at https://docs.rs/sea-query#iden | /// Learn more at https://docs.rs/sea-query#iden | ||||||
| #[derive(Iden)] | #[derive(Iden)] | ||||||
| enum Day { | pub enum Day { | ||||||
|     Table, |     Table, | ||||||
|     Day, |     Day, | ||||||
|     PlannedAmountCox, |     PlannedAmountCox, | ||||||
|   | |||||||
							
								
								
									
										54
									
								
								migration/src/m20230209_063357_create_user.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								migration/src/m20230209_063357_create_user.rs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,54 @@ | |||||||
|  | use sea_orm_migration::prelude::*; | ||||||
|  |  | ||||||
|  | #[derive(DeriveMigrationName)] | ||||||
|  | pub struct Migration; | ||||||
|  |  | ||||||
|  | #[async_trait::async_trait] | ||||||
|  | impl MigrationTrait for Migration { | ||||||
|  |     async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { | ||||||
|  |         manager | ||||||
|  |             .create_table( | ||||||
|  |                 Table::create() | ||||||
|  |                     .table(User::Table) | ||||||
|  |                     .if_not_exists() | ||||||
|  |                     .col( | ||||||
|  |                         ColumnDef::new(User::Id) | ||||||
|  |                             .integer() | ||||||
|  |                             .not_null() | ||||||
|  |                             .auto_increment() | ||||||
|  |                             .primary_key(), | ||||||
|  |                     ) | ||||||
|  |                     .col(ColumnDef::new(User::Name).string().not_null().unique_key()) | ||||||
|  |                     .col( | ||||||
|  |                         ColumnDef::new(User::IsCox) | ||||||
|  |                             .boolean() | ||||||
|  |                             .not_null() | ||||||
|  |                             .default(false), | ||||||
|  |                     ) | ||||||
|  |                     .col( | ||||||
|  |                         ColumnDef::new(User::IsAdmin) | ||||||
|  |                             .boolean() | ||||||
|  |                             .not_null() | ||||||
|  |                             .default(false), | ||||||
|  |                     ) | ||||||
|  |                     .to_owned(), | ||||||
|  |             ) | ||||||
|  |             .await | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { | ||||||
|  |         manager | ||||||
|  |             .drop_table(Table::drop().table(User::Table).to_owned()) | ||||||
|  |             .await | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /// Learn more at https://docs.rs/sea-query#iden | ||||||
|  | #[derive(Iden)] | ||||||
|  | pub enum User { | ||||||
|  |     Table, | ||||||
|  |     Id, | ||||||
|  |     Name, | ||||||
|  |     IsCox, | ||||||
|  |     IsAdmin, | ||||||
|  | } | ||||||
							
								
								
									
										67
									
								
								migration/src/m20230209_074936_create_trip.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										67
									
								
								migration/src/m20230209_074936_create_trip.rs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,67 @@ | |||||||
|  | use sea_orm_migration::prelude::*; | ||||||
|  |  | ||||||
|  | use crate::m20230208_114547_create_day::Day; | ||||||
|  | use crate::m20230209_063357_create_user::User; | ||||||
|  |  | ||||||
|  | #[derive(DeriveMigrationName)] | ||||||
|  | pub struct Migration; | ||||||
|  |  | ||||||
|  | #[async_trait::async_trait] | ||||||
|  | impl MigrationTrait for Migration { | ||||||
|  |     async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { | ||||||
|  |         manager | ||||||
|  |             .create_table( | ||||||
|  |                 Table::create() | ||||||
|  |                     .table(Trip::Table) | ||||||
|  |                     .if_not_exists() | ||||||
|  |                     .col(ColumnDef::new(Trip::Day).date().not_null()) | ||||||
|  |                     .foreign_key( | ||||||
|  |                         ForeignKey::create() | ||||||
|  |                             .name("FK_day") | ||||||
|  |                             .from(Trip::Table, Trip::Day) | ||||||
|  |                             .to(Day::Table, Day::Day), | ||||||
|  |                     ) | ||||||
|  |                     .col(ColumnDef::new(Trip::UserId).integer().not_null()) | ||||||
|  |                     .foreign_key( | ||||||
|  |                         ForeignKey::create() | ||||||
|  |                             .name("FK_userid") | ||||||
|  |                             .from(Trip::Table, Trip::UserId) | ||||||
|  |                             .to(User::Table, User::Id), | ||||||
|  |                     ) | ||||||
|  |                     .col(ColumnDef::new(Trip::CoxId).integer()) | ||||||
|  |                     .foreign_key( | ||||||
|  |                         ForeignKey::create() | ||||||
|  |                             .name("FK_coxid") | ||||||
|  |                             .from(Trip::Table, Trip::CoxId) | ||||||
|  |                             .to(User::Table, User::Id), | ||||||
|  |                     ) | ||||||
|  |                     .col(ColumnDef::new(Trip::Begin).string()) | ||||||
|  |                     .col( | ||||||
|  |                         ColumnDef::new(Trip::Created) | ||||||
|  |                             .timestamp() | ||||||
|  |                             .not_null() | ||||||
|  |                             .default("CURRENT_TIMESTAMP"), | ||||||
|  |                     ) | ||||||
|  |                     .primary_key(Index::create().col(Trip::Day).col(Trip::UserId)) | ||||||
|  |                     .to_owned(), | ||||||
|  |             ) | ||||||
|  |             .await | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { | ||||||
|  |         manager | ||||||
|  |             .drop_table(Table::drop().table(Trip::Table).to_owned()) | ||||||
|  |             .await | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /// Learn more at https://docs.rs/sea-query#iden | ||||||
|  | #[derive(Iden)] | ||||||
|  | enum Trip { | ||||||
|  |     Table, | ||||||
|  |     Day, | ||||||
|  |     UserId, | ||||||
|  |     CoxId, | ||||||
|  |     Begin, | ||||||
|  |     Created, | ||||||
|  | } | ||||||
							
								
								
									
										2
									
								
								mod.rs
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								mod.rs
									
									
									
									
									
								
							| @@ -3,3 +3,5 @@ | |||||||
| pub mod prelude; | pub mod prelude; | ||||||
|  |  | ||||||
| pub mod day; | pub mod day; | ||||||
|  | pub mod trip; | ||||||
|  | pub mod user; | ||||||
|   | |||||||
| @@ -1,3 +1,5 @@ | |||||||
| //! `SeaORM` Entity. Generated by sea-orm-codegen 0.11.0 | //! `SeaORM` Entity. Generated by sea-orm-codegen 0.11.0 | ||||||
|  |  | ||||||
| pub use super::day::Entity as Day; | pub use super::day::Entity as Day; | ||||||
|  | pub use super::trip::Entity as Trip; | ||||||
|  | pub use super::user::Entity as User; | ||||||
|   | |||||||
							
								
								
									
										177
									
								
								src/main.rs
									
									
									
									
									
								
							
							
						
						
									
										177
									
								
								src/main.rs
									
									
									
									
									
								
							| @@ -4,23 +4,92 @@ extern crate rocket; | |||||||
| mod models; | mod models; | ||||||
|  |  | ||||||
| use std::collections::HashMap; | use std::collections::HashMap; | ||||||
|  | use std::ops::Deref; | ||||||
|  |  | ||||||
| use chrono::Duration; | use chrono::Duration; | ||||||
| use chrono::Local; | use chrono::Local; | ||||||
|  | use chrono::NaiveDate; | ||||||
|  | use rocket::fairing::AdHoc; | ||||||
|  | use rocket::form; | ||||||
|  | use rocket::form::ValueField; | ||||||
|  | use rocket::http::Cookie; | ||||||
|  | use rocket::http::CookieJar; | ||||||
|  | use rocket::request; | ||||||
|  | use rocket::request::FromRequest; | ||||||
|  | use rocket::request::Outcome; | ||||||
| use rocket::response::Redirect; | use rocket::response::Redirect; | ||||||
|  | use rocket::Request; | ||||||
| use rocket::{form::Form, fs::FileServer, State}; | use rocket::{form::Form, fs::FileServer, State}; | ||||||
| use rocket_dyn_templates::context; | use rocket_dyn_templates::context; | ||||||
| use rocket_dyn_templates::Template; | use rocket_dyn_templates::Template; | ||||||
| use sea_orm::ColumnTrait; | use sea_orm::ColumnTrait; | ||||||
|  | use sea_orm::ModelTrait; | ||||||
| use sea_orm::QueryFilter; | use sea_orm::QueryFilter; | ||||||
| use sea_orm::{ | use sea_orm::{ | ||||||
|     ActiveModelTrait, Database, DatabaseConnection, EntityTrait, Order, QueryOrder, Set, |     ActiveModelTrait, Database, DatabaseConnection, EntityTrait, Order, QueryOrder, Set, | ||||||
| }; | }; | ||||||
|  | use serde::Serialize; | ||||||
|  |  | ||||||
| use crate::models::day; | use crate::models::{day, trip, user}; | ||||||
|  |  | ||||||
|  | #[derive(Serialize, Debug)] | ||||||
|  | struct TripWithUser { | ||||||
|  |     trip: trip::Model, | ||||||
|  |     user: user::Model, | ||||||
|  | } | ||||||
|  |  | ||||||
|  | impl TripWithUser { | ||||||
|  |     async fn new(trip: trip::Model, db: &DatabaseConnection) -> Self { | ||||||
|  |         Self { | ||||||
|  |             trip: trip.clone(), | ||||||
|  |             user: trip | ||||||
|  |                 .find_related(user::Entity) | ||||||
|  |                 .one(db) | ||||||
|  |                 .await | ||||||
|  |                 .unwrap() | ||||||
|  |                 .unwrap(), | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #[derive(Serialize, Debug)] | ||||||
|  | struct DayWithTrips { | ||||||
|  |     day: day::Model, | ||||||
|  |     trips: Vec<TripWithUser>, | ||||||
|  | } | ||||||
|  |  | ||||||
|  | impl DayWithTrips { | ||||||
|  |     async fn new(day: day::Model, db: &DatabaseConnection) -> Self { | ||||||
|  |         let mut trips = Vec::new(); | ||||||
|  |         for trip in day.find_related(trip::Entity).all(db).await.unwrap() { | ||||||
|  |             trips.push(TripWithUser::new(trip, db).await); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         Self { day, trips } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #[derive(Serialize)] | ||||||
|  | struct Name(user::Model); | ||||||
|  | #[rocket::async_trait] | ||||||
|  | impl<'r> FromRequest<'r> for Name { | ||||||
|  |     type Error = rocket::Error; | ||||||
|  |  | ||||||
|  |     async fn from_request(req: &'r Request<'_>) -> request::Outcome<Self, Self::Error> { | ||||||
|  |         match req.cookies().get("name") { | ||||||
|  |             Some(name) => { | ||||||
|  |                 let db = req.guard::<&'r State<DatabaseConnection>>(); | ||||||
|  |                 let name = name.value(); | ||||||
|  |                 let user = find_or_create_user(name, db.await.unwrap().inner()).await; | ||||||
|  |                 Outcome::Success(Name(user)) | ||||||
|  |             } | ||||||
|  |             None => Outcome::Forward(()), //No cookie set | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
| #[get("/")] | #[get("/")] | ||||||
| async fn index(db: &State<DatabaseConnection>) -> Template { | async fn index(db: &State<DatabaseConnection>, name: Name) -> Template { | ||||||
|     let days: Vec<day::Model> = day::Entity::find() |     let days: Vec<day::Model> = day::Entity::find() | ||||||
|         .filter(day::Column::Day.gte(format!("{}", Local::now().format("%Y-%m-%d")))) // don't show stuff from the past |         .filter(day::Column::Day.gte(format!("{}", Local::now().format("%Y-%m-%d")))) // don't show stuff from the past | ||||||
|         .order_by(day::Column::Day, Order::Asc) |         .order_by(day::Column::Day, Order::Asc) | ||||||
| @@ -28,38 +97,76 @@ async fn index(db: &State<DatabaseConnection>) -> Template { | |||||||
|         .await |         .await | ||||||
|         .unwrap(); |         .unwrap(); | ||||||
|  |  | ||||||
|     let days: HashMap<chrono::NaiveDate, day::Model> = |     let mut dwu = HashMap::new(); | ||||||
|         days.into_iter().map(|x| (x.day, x)).collect(); |     for day in days { | ||||||
|  |         dwu.insert( | ||||||
|  |             format!("{}", day.day.format("%Y-%m-%d")), | ||||||
|  |             DayWithTrips::new(day, db.inner()).await, | ||||||
|  |         ); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     let mut next_days = Vec::new(); |     let mut next_days = Vec::new(); | ||||||
|     for i in 0..6 { |     for i in 0..6 { | ||||||
|         next_days.push(Local::now() + Duration::days(i)); |         next_days.push(Local::now() + Duration::days(i)); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     println!("{:?}", next_days); |     Template::render("index", context! { dwu, next_days, name }) | ||||||
|  | } | ||||||
|  |  | ||||||
|     Template::render("index", context! { days, next_days }) | #[get("/", rank = 2)] | ||||||
|  | fn name() -> Template { | ||||||
|  |     Template::render("name", context! {}) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #[derive(FromForm)] | ||||||
|  | struct NameForm(String); | ||||||
|  |  | ||||||
|  | #[post("/setname", data = "<name>")] | ||||||
|  | fn setname(cookies: &CookieJar<'_>, name: Form<NameForm>) -> Redirect { | ||||||
|  |     cookies.add(Cookie::new("name", name.0.clone())); | ||||||
|  |     Redirect::to("/") | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #[derive(Debug)] | ||||||
|  | struct NaiveDateForm(NaiveDate); | ||||||
|  |  | ||||||
|  | impl<'v> rocket::form::FromFormField<'v> for NaiveDateForm { | ||||||
|  |     fn from_value(field: ValueField<'v>) -> form::Result<'v, NaiveDateForm> { | ||||||
|  |         let naivedate = chrono::NaiveDate::parse_from_str(&field.value, "%Y-%m-%d").unwrap(); //TODO: | ||||||
|  |                                                                                               //fixme | ||||||
|  |         Ok(NaiveDateForm(naivedate)) | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | impl Deref for NaiveDateForm { | ||||||
|  |     type Target = NaiveDate; | ||||||
|  |     fn deref(&self) -> &Self::Target { | ||||||
|  |         &self.0 | ||||||
|  |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| #[derive(FromForm, Debug)] | #[derive(FromForm, Debug)] | ||||||
| struct DayForm { | struct DayForm { | ||||||
|     day: String, |     day: NaiveDateForm, | ||||||
|     planned_amount_cox: Option<i32>, |     #[field(validate = range(0..20))] | ||||||
|  |     planned_amount_cox: i32, | ||||||
|     planned_starting_time: Option<String>, |     planned_starting_time: Option<String>, | ||||||
|     open_registration: bool, |     open_registration: bool, | ||||||
| } | } | ||||||
|  |  | ||||||
| #[put("/day", data = "<day>")] | #[put("/day", data = "<day>")] | ||||||
| async fn create(db: &State<DatabaseConnection>, day: Form<DayForm>) -> Redirect { | async fn create(db: &State<DatabaseConnection>, day: Form<DayForm>) -> Redirect { | ||||||
|     let id = chrono::NaiveDate::parse_from_str(&day.day, "%Y-%m-%d").unwrap(); |  | ||||||
|     let new_day = day::ActiveModel { |     let new_day = day::ActiveModel { | ||||||
|         day: Set(id), |         day: Set(*day.day), | ||||||
|         planned_amount_cox: Set(day.planned_amount_cox), |         planned_amount_cox: Set(day.planned_amount_cox), | ||||||
|         planned_starting_time: Set(day.planned_starting_time.clone()), |         planned_starting_time: Set(day.planned_starting_time.clone()), | ||||||
|         open_registration: Set(day.open_registration), |         open_registration: Set(day.open_registration), | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
|     let day: Option<day::Model> = day::Entity::find_by_id(id).one(db.inner()).await.unwrap(); |     let day: Option<day::Model> = day::Entity::find_by_id(*day.day) | ||||||
|  |         .one(db.inner()) | ||||||
|  |         .await | ||||||
|  |         .unwrap(); | ||||||
|     match day { |     match day { | ||||||
|         Some(_) => { |         Some(_) => { | ||||||
|             new_day.update(db.inner()).await.unwrap(); //TODO: fixme |             new_day.update(db.inner()).await.unwrap(); //TODO: fixme | ||||||
| @@ -72,13 +179,59 @@ async fn create(db: &State<DatabaseConnection>, day: Form<DayForm>) -> Redirect | |||||||
|     Redirect::to("/") |     Redirect::to("/") | ||||||
| } | } | ||||||
|  |  | ||||||
|  | #[derive(FromForm)] | ||||||
|  | struct RegisterForm { | ||||||
|  |     day: NaiveDateForm, | ||||||
|  |     name: String, | ||||||
|  | } | ||||||
|  |  | ||||||
|  | async fn find_or_create_user(name: &str, db: &DatabaseConnection) -> user::Model { | ||||||
|  |     let user = user::Entity::find() | ||||||
|  |         .filter(user::Column::Name.eq(name)) | ||||||
|  |         .one(db) | ||||||
|  |         .await | ||||||
|  |         .unwrap(); | ||||||
|  |  | ||||||
|  |     match user { | ||||||
|  |         Some(user) => user, | ||||||
|  |         None => { | ||||||
|  |             let user = user::ActiveModel { | ||||||
|  |                 name: Set(name.clone().into()), | ||||||
|  |                 ..Default::default() | ||||||
|  |             }; | ||||||
|  |             user.insert(db).await.unwrap() | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #[put("/register", data = "<register>")] | ||||||
|  | async fn register(db: &State<DatabaseConnection>, register: Form<RegisterForm>) -> Redirect { | ||||||
|  |     let day = day::Entity::find_by_id(*register.day) | ||||||
|  |         .one(db.inner()) | ||||||
|  |         .await | ||||||
|  |         .unwrap() | ||||||
|  |         .expect("There's no trip on this date (yet)"); | ||||||
|  |  | ||||||
|  |     let user = find_or_create_user(®ister.name, db.inner()).await; | ||||||
|  |  | ||||||
|  |     let day = format!("{}", day.day.format("%Y-%m-%d")); | ||||||
|  |     let trip = trip::ActiveModel { | ||||||
|  |         day: Set(day), | ||||||
|  |         user_id: Set(user.id), | ||||||
|  |         ..Default::default() | ||||||
|  |     }; | ||||||
|  |     trip.insert(db.inner()).await.unwrap(); | ||||||
|  |  | ||||||
|  |     Redirect::to("/") | ||||||
|  | } | ||||||
|  |  | ||||||
| #[launch] | #[launch] | ||||||
| async fn rocket() -> _ { | async fn rocket() -> _ { | ||||||
|     rocket::build() |     rocket::build() | ||||||
|         .attach(Template::fairing()) |         .attach(Template::fairing()) | ||||||
|         .manage(Database::connect("sqlite://db.sqlite").await.unwrap()) |         .manage(Database::connect("sqlite://db.sqlite").await.unwrap()) | ||||||
|         .mount("/public", FileServer::from("static/")) |         .mount("/public", FileServer::from("static/")) | ||||||
|         .mount("/", routes![index, create]) |         .mount("/", routes![index, create, register, name, setname]) | ||||||
| } | } | ||||||
|  |  | ||||||
| //#[tokio::main] | //#[tokio::main] | ||||||
|   | |||||||
| @@ -8,12 +8,21 @@ use serde::{Deserialize, Serialize}; | |||||||
| pub struct Model { | pub struct Model { | ||||||
|     #[sea_orm(primary_key, auto_increment = false)] |     #[sea_orm(primary_key, auto_increment = false)] | ||||||
|     pub day: chrono::NaiveDate, |     pub day: chrono::NaiveDate, | ||||||
|     pub planned_amount_cox: Option<i32>, |     pub planned_amount_cox: i32, | ||||||
|     pub planned_starting_time: Option<String>, |     pub planned_starting_time: Option<String>, | ||||||
|     pub open_registration: bool, |     pub open_registration: bool, | ||||||
| } | } | ||||||
|  |  | ||||||
| #[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)] | #[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)] | ||||||
| pub enum Relation {} | pub enum Relation { | ||||||
|  |     #[sea_orm(has_many = "super::trip::Entity")] | ||||||
|  |     Trip, | ||||||
|  | } | ||||||
|  |  | ||||||
|  | impl Related<super::trip::Entity> for Entity { | ||||||
|  |     fn to() -> RelationDef { | ||||||
|  |         Relation::Trip.def() | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
| impl ActiveModelBehavior for ActiveModel {} | impl ActiveModelBehavior for ActiveModel {} | ||||||
|   | |||||||
| @@ -3,3 +3,5 @@ | |||||||
| pub mod prelude; | pub mod prelude; | ||||||
|  |  | ||||||
| pub mod day; | pub mod day; | ||||||
|  | pub mod trip; | ||||||
|  | pub mod user; | ||||||
|   | |||||||
| @@ -1,3 +1,5 @@ | |||||||
| //! `SeaORM` Entity. Generated by sea-orm-codegen 0.11.0 | //! `SeaORM` Entity. Generated by sea-orm-codegen 0.11.0 | ||||||
|  |  | ||||||
| pub use super::day::Entity as Day; | pub use super::day::Entity as Day; | ||||||
|  | pub use super::trip::Entity as Trip; | ||||||
|  | pub use super::user::Entity as User; | ||||||
|   | |||||||
							
								
								
									
										58
									
								
								src/models/trip.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								src/models/trip.rs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,58 @@ | |||||||
|  | //! `SeaORM` Entity. Generated by sea-orm-codegen 0.11.0 | ||||||
|  |  | ||||||
|  | use sea_orm::entity::prelude::*; | ||||||
|  | use serde::{Deserialize, Serialize}; | ||||||
|  |  | ||||||
|  | #[derive(Clone, Debug, PartialEq, DeriveEntityModel, Eq, Serialize, Deserialize)] | ||||||
|  | #[sea_orm(table_name = "trip")] | ||||||
|  | pub struct Model { | ||||||
|  |     #[sea_orm(primary_key, auto_increment = false)] | ||||||
|  |     pub day: String, | ||||||
|  |     #[sea_orm(primary_key, auto_increment = false)] | ||||||
|  |     pub user_id: i32, | ||||||
|  |     pub cox_id: Option<i32>, | ||||||
|  |     pub begin: Option<String>, | ||||||
|  |     pub created: String, | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)] | ||||||
|  | pub enum Relation { | ||||||
|  |     #[sea_orm( | ||||||
|  |         belongs_to = "super::day::Entity", | ||||||
|  |         from = "Column::Day", | ||||||
|  |         to = "super::day::Column::Day", | ||||||
|  |         on_update = "NoAction", | ||||||
|  |         on_delete = "NoAction" | ||||||
|  |     )] | ||||||
|  |     Day, | ||||||
|  |     #[sea_orm( | ||||||
|  |         belongs_to = "super::user::Entity", | ||||||
|  |         from = "Column::CoxId", | ||||||
|  |         to = "super::user::Column::Id", | ||||||
|  |         on_update = "NoAction", | ||||||
|  |         on_delete = "NoAction" | ||||||
|  |     )] | ||||||
|  |     Cox, | ||||||
|  |     #[sea_orm( | ||||||
|  |         belongs_to = "super::user::Entity", | ||||||
|  |         from = "Column::UserId", | ||||||
|  |         to = "super::user::Column::Id", | ||||||
|  |         on_update = "NoAction", | ||||||
|  |         on_delete = "NoAction" | ||||||
|  |     )] | ||||||
|  |     User, | ||||||
|  | } | ||||||
|  |  | ||||||
|  | impl Related<super::day::Entity> for Entity { | ||||||
|  |     fn to() -> RelationDef { | ||||||
|  |         Relation::Day.def() | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | impl Related<super::user::Entity> for Entity { | ||||||
|  |     fn to() -> RelationDef { | ||||||
|  |         Relation::User.def() | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | impl ActiveModelBehavior for ActiveModel {} | ||||||
							
								
								
									
										19
									
								
								src/models/user.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								src/models/user.rs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,19 @@ | |||||||
|  | //! `SeaORM` Entity. Generated by sea-orm-codegen 0.11.0 | ||||||
|  |  | ||||||
|  | use sea_orm::entity::prelude::*; | ||||||
|  | use serde::{Deserialize, Serialize}; | ||||||
|  |  | ||||||
|  | #[derive(Clone, Debug, PartialEq, DeriveEntityModel, Eq, Serialize, Deserialize)] | ||||||
|  | #[sea_orm(table_name = "user")] | ||||||
|  | pub struct Model { | ||||||
|  |     #[sea_orm(primary_key)] | ||||||
|  |     pub id: i32, | ||||||
|  |     pub name: String, | ||||||
|  |     pub is_cox: bool, | ||||||
|  |     pub is_admin: bool, | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)] | ||||||
|  | pub enum Relation {} | ||||||
|  |  | ||||||
|  | impl ActiveModelBehavior for ActiveModel {} | ||||||
| @@ -6,12 +6,42 @@ | |||||||
| 	{{ day | date(format="%d.%m.%Y")}} | 	{{ day | date(format="%d.%m.%Y")}} | ||||||
| 	<br /> | 	<br /> | ||||||
| 	 | 	 | ||||||
| 	{% if days[day_string] and days[day_string].planned_amount_cox > 0%} | 	{% if dwu[day_string] and dwu[day_string].day.planned_amount_cox > 0%} | ||||||
| 		{% set cur_day = days[day_string] %} | 		{% set cur_day = dwu[day_string].day %} | ||||||
|  | 		{% set_global already_registered = false %} | ||||||
| 		Geplante Steuerpersonen: {{ cur_day.planned_amount_cox}}<br /> | 		Geplante Steuerpersonen: {{ cur_day.planned_amount_cox}}<br /> | ||||||
| 		Geplante Abfahrtszeit: {{ cur_day.planned_starting_time }}<br /> | 		Geplante Abfahrtszeit: {{ cur_day.planned_starting_time }}<br /> | ||||||
|  |  | ||||||
|  | 		Angemeldete Personen: | ||||||
|  | 		<ol> | ||||||
|  | 		{% for trip in dwu[day_string].trips %} | ||||||
|  | 			<li> | ||||||
|  | 			{% if trip.user.name == name.name %} | ||||||
|  | 				{% set_global already_registered = true %} | ||||||
|  | 				DU | ||||||
|  | 			{% else %} | ||||||
|  | 				{{ trip.user.name }} | ||||||
|  | 			{% endif %} | ||||||
|  | 		{% endfor %} | ||||||
|  | 		</ol> | ||||||
|  |  | ||||||
| 		{% if cur_day.open_registration %} | 		{% if cur_day.open_registration %} | ||||||
| 			ANMELDEN | 			<details> | ||||||
|  | 				<summary class="button">+</summary> | ||||||
|  | 				<form method="post" action="/register"> | ||||||
|  | 					<input type="hidden" name="_method" value="put" /> | ||||||
|  | 					<input type="hidden" name="day" value="{{ day_string }}" /> | ||||||
|  | 					<div class="row"> | ||||||
|  | 						<div class="six columns"> | ||||||
|  | 							<label for="name">Name</label> | ||||||
|  | 							<input class="u-full-width" type="text" id="name" name="name" value="{% if already_registered == false %}{{ name.name }}{% endif %}" /> | ||||||
|  | 						</div> | ||||||
|  | 						<div class="six columns"> | ||||||
|  | 							<input class="button-primary" type="submit" value="Speichern"> | ||||||
|  | 						</div> | ||||||
|  | 					</div> | ||||||
|  | 				</form> | ||||||
|  | 			</details> | ||||||
| 		{% else %} | 		{% else %} | ||||||
| 			Anmeldung an diesem Tag leider nicht möglich (zB bei USI Kursen) | 			Anmeldung an diesem Tag leider nicht möglich (zB bei USI Kursen) | ||||||
| 		{% endif %} | 		{% endif %} | ||||||
|   | |||||||
							
								
								
									
										10
									
								
								templates/name.html.tera
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								templates/name.html.tera
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,10 @@ | |||||||
|  | {% extends "base" %} | ||||||
|  | {% block content %} | ||||||
|  |  | ||||||
|  | What's your name? | ||||||
|  | <form action="/setname" method="post"> | ||||||
|  | 	<input type="text" name="name"/> | ||||||
|  | 	<input type="submit" value="Speichern"/> | ||||||
|  | </form> | ||||||
|  | {% endblock content %} | ||||||
|  |  | ||||||
							
								
								
									
										7
									
								
								templates/registration.html.tera
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								templates/registration.html.tera
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | |||||||
|  | <details> | ||||||
|  | 	<summary class="button">+</summary> | ||||||
|  | 	<form method="post" action="/register"> | ||||||
|  | 		<input type="hidden" name="_method" value="put" /> | ||||||
|  |  | ||||||
|  | 	</form> | ||||||
|  | </details> | ||||||
		Reference in New Issue
	
	Block a user