forked from Ruderverein-Donau-Linz/rowt
		
	push
This commit is contained in:
		@@ -1,12 +1,18 @@
 | 
			
		||||
pub use sea_orm_migration::prelude::*;
 | 
			
		||||
 | 
			
		||||
mod m20230208_114547_create_day;
 | 
			
		||||
mod m20230209_063357_create_user;
 | 
			
		||||
mod m20230209_074936_create_trip;
 | 
			
		||||
 | 
			
		||||
pub struct Migrator;
 | 
			
		||||
 | 
			
		||||
#[async_trait::async_trait]
 | 
			
		||||
impl MigratorTrait for Migrator {
 | 
			
		||||
    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)
 | 
			
		||||
                    .if_not_exists()
 | 
			
		||||
                    .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(
 | 
			
		||||
                        ColumnDef::new(Day::PlannedStartingTime)
 | 
			
		||||
                            .string()
 | 
			
		||||
@@ -38,7 +43,7 @@ impl MigrationTrait for Migration {
 | 
			
		||||
 | 
			
		||||
/// Learn more at https://docs.rs/sea-query#iden
 | 
			
		||||
#[derive(Iden)]
 | 
			
		||||
enum Day {
 | 
			
		||||
pub enum Day {
 | 
			
		||||
    Table,
 | 
			
		||||
    Day,
 | 
			
		||||
    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,
 | 
			
		||||
}
 | 
			
		||||
@@ -1,3 +1,5 @@
 | 
			
		||||
//! `SeaORM` Entity. Generated by sea-orm-codegen 0.11.0
 | 
			
		||||
 | 
			
		||||
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;
 | 
			
		||||
 | 
			
		||||
use std::collections::HashMap;
 | 
			
		||||
use std::ops::Deref;
 | 
			
		||||
 | 
			
		||||
use chrono::Duration;
 | 
			
		||||
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::Request;
 | 
			
		||||
use rocket::{form::Form, fs::FileServer, State};
 | 
			
		||||
use rocket_dyn_templates::context;
 | 
			
		||||
use rocket_dyn_templates::Template;
 | 
			
		||||
use sea_orm::ColumnTrait;
 | 
			
		||||
use sea_orm::ModelTrait;
 | 
			
		||||
use sea_orm::QueryFilter;
 | 
			
		||||
use sea_orm::{
 | 
			
		||||
    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("/")]
 | 
			
		||||
async fn index(db: &State<DatabaseConnection>) -> Template {
 | 
			
		||||
async fn index(db: &State<DatabaseConnection>, name: Name) -> Template {
 | 
			
		||||
    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
 | 
			
		||||
        .order_by(day::Column::Day, Order::Asc)
 | 
			
		||||
@@ -28,38 +97,76 @@ async fn index(db: &State<DatabaseConnection>) -> Template {
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap();
 | 
			
		||||
 | 
			
		||||
    let days: HashMap<chrono::NaiveDate, day::Model> =
 | 
			
		||||
        days.into_iter().map(|x| (x.day, x)).collect();
 | 
			
		||||
    let mut dwu = HashMap::new();
 | 
			
		||||
    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();
 | 
			
		||||
    for i in 0..6 {
 | 
			
		||||
        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)]
 | 
			
		||||
struct DayForm {
 | 
			
		||||
    day: String,
 | 
			
		||||
    planned_amount_cox: Option<i32>,
 | 
			
		||||
    day: NaiveDateForm,
 | 
			
		||||
    #[field(validate = range(0..20))]
 | 
			
		||||
    planned_amount_cox: i32,
 | 
			
		||||
    planned_starting_time: Option<String>,
 | 
			
		||||
    open_registration: bool,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[put("/day", data = "<day>")]
 | 
			
		||||
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 {
 | 
			
		||||
        day: Set(id),
 | 
			
		||||
        day: Set(*day.day),
 | 
			
		||||
        planned_amount_cox: Set(day.planned_amount_cox),
 | 
			
		||||
        planned_starting_time: Set(day.planned_starting_time.clone()),
 | 
			
		||||
        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 {
 | 
			
		||||
        Some(_) => {
 | 
			
		||||
            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("/")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[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]
 | 
			
		||||
async fn rocket() -> _ {
 | 
			
		||||
    rocket::build()
 | 
			
		||||
        .attach(Template::fairing())
 | 
			
		||||
        .manage(Database::connect("sqlite://db.sqlite").await.unwrap())
 | 
			
		||||
        .mount("/public", FileServer::from("static/"))
 | 
			
		||||
        .mount("/", routes![index, create])
 | 
			
		||||
        .mount("/", routes![index, create, register, name, setname])
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//#[tokio::main]
 | 
			
		||||
 
 | 
			
		||||
@@ -8,12 +8,21 @@ use serde::{Deserialize, Serialize};
 | 
			
		||||
pub struct Model {
 | 
			
		||||
    #[sea_orm(primary_key, auto_increment = false)]
 | 
			
		||||
    pub day: chrono::NaiveDate,
 | 
			
		||||
    pub planned_amount_cox: Option<i32>,
 | 
			
		||||
    pub planned_amount_cox: i32,
 | 
			
		||||
    pub planned_starting_time: Option<String>,
 | 
			
		||||
    pub open_registration: bool,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[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 {}
 | 
			
		||||
 
 | 
			
		||||
@@ -3,3 +3,5 @@
 | 
			
		||||
pub mod prelude;
 | 
			
		||||
 | 
			
		||||
pub mod day;
 | 
			
		||||
pub mod trip;
 | 
			
		||||
pub mod user;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,3 +1,5 @@
 | 
			
		||||
//! `SeaORM` Entity. Generated by sea-orm-codegen 0.11.0
 | 
			
		||||
 | 
			
		||||
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")}}
 | 
			
		||||
	<br />
 | 
			
		||||
	
 | 
			
		||||
	{% if days[day_string] and days[day_string].planned_amount_cox > 0%}
 | 
			
		||||
		{% set cur_day = days[day_string] %}
 | 
			
		||||
	{% if dwu[day_string] and dwu[day_string].day.planned_amount_cox > 0%}
 | 
			
		||||
		{% set cur_day = dwu[day_string].day %}
 | 
			
		||||
		{% set_global already_registered = false %}
 | 
			
		||||
		Geplante Steuerpersonen: {{ cur_day.planned_amount_cox}}<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 %}
 | 
			
		||||
			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 %}
 | 
			
		||||
			Anmeldung an diesem Tag leider nicht möglich (zB bei USI Kursen)
 | 
			
		||||
		{% 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