Initial commit

This commit is contained in:
Dietrich 2020-07-23 11:45:59 +02:00
commit d303232201
22 changed files with 1649 additions and 0 deletions

1
.env Normal file
View File

@ -0,0 +1 @@
DATABASE_URL=database.sqlite

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
/target

1362
Cargo.lock generated Normal file

File diff suppressed because it is too large Load Diff

18
Cargo.toml Normal file
View File

@ -0,0 +1,18 @@
[package]
name = "rocket_page"
version = "0.1.0"
authors = ["Dietrich <dietrich@teilgedanken.de>"]
edition = "2018"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
rocket = "0.4.5"
diesel = { version = "1.4.0", features = ["sqlite"] }
serde_derive = "*"
serde = "*"
[dependencies.rocket_contrib]
version = "0.4.5"
default-features = false
features = ["diesel_sqlite_pool", "handlebars_templates"]

10
Rocket.toml Normal file
View File

@ -0,0 +1,10 @@
[global.databases]
page_db = { url = "database.sqlite" }
[development]
address = "localhost"
port = 8000
workers = 8
keep_alive = 5
log = "normal"
limits = { forms = 32768 }

BIN
database.sqlite Normal file

Binary file not shown.

5
diesel.toml Normal file
View File

@ -0,0 +1,5 @@
# For documentation on how to configure this file,
# see diesel.rs/guides/configuring-diesel-cli
[print_schema]
file = "src/schema.rs"

0
migrations/.gitkeep Normal file
View File

View File

@ -0,0 +1,2 @@
-- This file should undo anything in `up.sql`
Drop TABLE stunden;

View File

@ -0,0 +1,7 @@
-- Your SQL goes here
CREATE TABLE stunden (
id Integer PRIMARY KEY NOT NULL,
title Text NOT NULL,
short Text NOT NULL,
ordinal Integer NOT NULL
);

View File

@ -0,0 +1,2 @@
-- This file should undo anything in `up.sql`
Drop TABLE Klassen;

View File

@ -0,0 +1,8 @@
-- Your SQL goes here
CREATE TABLE klassen (
id Integer PRIMARY KEY NOT NULL,
stufe Integer not null,
gruppe Text NOT NULL,
titel Text,
ordinal Integer NOT NULL
);

View File

@ -0,0 +1,2 @@
-- This file should undo anything in `up.sql`
Alter Table klassen Rename Column ordnung to ordinal;

View File

@ -0,0 +1,2 @@
-- Your SQL goes here
Alter Table klassen Rename Column ordinal to ordnung;

View File

@ -0,0 +1 @@
-- This file should undo anything in `up.sql`

View File

@ -0,0 +1,11 @@
-- Your SQL
CREATE TABLE Vertretungen (
id Integer PRIMARY KEY NOT NULL,
klasse Integer not null,
stunde Integer not null,
fehlend Text NOT NULL,
vertretung Text NOT NULL,
kommentar Text NOT NULL,
FOREIGN KEY(klasse) REFERENCES klasse(id),
FOREIGN KEY(stunde) REFERENCES stunde(id)
);

93
src/main.rs Normal file
View File

@ -0,0 +1,93 @@
#![feature(proc_macro_hygiene, decl_macro)]
#[macro_use]
extern crate rocket;
#[macro_use]
extern crate rocket_contrib;
#[macro_use]
extern crate diesel;
#[macro_use]
extern crate serde_derive;
pub mod models;
pub mod schema;
use crate::models::Klassen;
use crate::schema::klassen;
use diesel::RunQueryDsl;
use rocket::request::{Form, FromParam};
use rocket::response::Redirect;
use rocket_contrib::databases;
use rocket_contrib::templates::Template;
struct StundenByID(i32);
#[derive(Debug)]
enum WebError {
I32NotParsed,
}
impl<'a> FromParam<'_> for StundenByID {
type Error = WebError;
fn from_param(param: &rocket::http::RawStr) -> Result<Self, Self::Error> {
if let Ok(n) = param.parse::<i32>() {
Ok(StundenByID(n))
} else {
Err(WebError::I32NotParsed)
}
}
}
#[database("page_db")]
struct DbConn(databases::diesel::SqliteConnection);
#[derive(Debug, Serialize)]
struct ListAllContext {
klassen: Vec<Klassen>,
parent: String,
}
#[get("/")]
fn index(conn: DbConn) -> Template {
Template::render(
"uebersicht",
ListAllContext {
klassen: klassen::dsl::klassen.load(&*conn).expect("database acess"),
parent: "base".to_string(),
},
)
}
#[get("/add/klasse")]
fn get_klasse_form() -> Template {
Template::render("add_klasse_form", "")
}
#[derive(FromForm, Insertable)]
#[table_name = "klassen"]
struct KlasseForm {
stufe: i32,
gruppe: String,
titel: Option<String>,
ordnung: i32,
}
#[post("/add/klasse", data = "<klasse>")]
fn post_klasse_form(klasse: Form<KlasseForm>, conn: DbConn) -> Result<Redirect, String> {
match diesel::insert_into(schema::klassen::table)
.values(klasse.into_inner())
.execute(&*conn)
{
Ok(_) => Ok(Redirect::to("/admin/add/klasse")),
Err(_) => Err("Klasse konnte nicht erstellt werden!".to_string()),
}
}
fn main() {
rocket::ignite()
.attach(DbConn::fairing())
.attach(Template::fairing())
.mount("/", routes![index])
.mount("/admin/", routes![get_klasse_form])
.mount("/admin/", routes![post_klasse_form])
.launch();
}

37
src/models.rs Normal file
View File

@ -0,0 +1,37 @@
use super::schema::klassen;
#[derive(Queryable, Debug, Serialize)]
pub struct Stunden {
pub id: i32,
pub title: String,
pub short: String,
pub ordinal: i32,
}
#[derive(Queryable, Debug, Serialize)]
pub struct Vertretungen {
pub id: i32,
pub klasse_link: i32,
pub stunde_link: i32,
pub fehlend: String,
pub vertretung: String,
pub kommentar: String,
}
#[derive(Queryable, Debug, Serialize)]
pub struct Klassen {
pub id: i32,
pub stufe: i32,
pub gruppe: String,
pub titel: Option<String>,
pub ordnung: i32,
}
#[derive(Insertable)]
#[table_name = "klassen"]
pub struct NewKlassen {
pub stufe: i32,
pub gruppe: String,
pub titel: Option<String>,
pub ordnung: i32,
}

31
src/schema.rs Normal file
View File

@ -0,0 +1,31 @@
table! {
vertretungen (id) {
id -> Integer,
klasse -> Integer,
stunde -> Integer,
fehlend -> Text,
vertretung -> Text,
kommentar -> Text,
}
}
table! {
klassen (id) {
id -> Integer,
stufe -> Integer,
gruppe -> Text,
titel -> Nullable<Text>,
ordnung -> Integer,
}
}
table! {
stunden (id) {
id -> Integer,
title -> Text,
short -> Text,
ordinal -> Integer,
}
}
allow_tables_to_appear_in_same_query!(vertretungen, klassen, stunden,);

View File

@ -0,0 +1,29 @@
{{#* inline "page"}}
<h1>Login</h1>
<form action="/admin/add/klasse" method="post" accept-charset="utf-8">
<table>
<tr>
<th>Stufe:</th>
<td><input type="number" name="stufe"></td>
</tr>
<tr>
<th>Teil:</th>
<td><input type="text" name="gruppe"></td>
</tr>
<tr>
<th>Titel:</th>
<td><input type="text" name="titel"></td>
</tr>
<tr>
<th>Ordnung:</th>
<td><input type="number" name="ordnung"></td>
</tr>
<tr>
<th></th>
<td><input type="submit" value="Klasse Erstellen"></td>
</tr>
</table>
</form>
{{/inline}}
{{! remove whitespaces with ~ }}
{{~> (parent)~}}

17
templates/base.hbs Normal file
View File

@ -0,0 +1,17 @@
<!DOCTYPE html>
<html lang="en" dir="ltr">
<head>
<link rel="stylesheet" type="text/css" href="/static/style.css" />
<style>
</style>
<meta charset="utf-8">
<title>Vertretungsplan Uhlandshöhe</title>
</head>
<body>
{{~> page}}
<h3> End</h3>
</body>
</html>

10
templates/uebersicht.hbs Normal file
View File

@ -0,0 +1,10 @@
{{#* inline "page"}}
<h1>Stundenplan</h1>
<ul>
{{#each klassen}}
<li>{{this.id}}. {{this.stufe}}{{this.gruppe}}</li>
{{/each}}
</ul>
{{/inline}}
{{! remove whitespaces with ~ }}
{{~> (parent)~}}