This commit is contained in:
philipp 2023-03-14 14:00:53 +01:00
parent 5cb486b5ce
commit c79a342ce8
5 changed files with 138 additions and 10 deletions

View File

@ -6,3 +6,24 @@
- Every cox can define which boats they use
- Link for specific trip
- Basic auth (with e.g. ekrv) to prevent spam bots? (Or on first login there are 2 input fields: name + e.g. name of "strom")
# DB
- users
- id: i32
- name: String
- pw: Option<String>
- is_cox: bool
- is_admin: bool
- day
- day: chrono::NaiveDate
- planned_amount_cox: i32
- planned_starting_time: Option<String>
- open_registration: bool
- trip
- day: String
- user_id: i32
- cox_id: Option<i32>
- begin: Option<String>
- created: chrono::DateTime

BIN
db.sqlite

Binary file not shown.

View File

@ -43,7 +43,13 @@ impl MigrationTrait for Migration {
.not_null()
.default(Expr::current_timestamp()),
)
.primary_key(Index::create().col(Trip::Day).col(Trip::UserId))
.primary_key(
Index::create()
.col(Trip::Day)
.col(Trip::UserId)
.col(Trip::CoxId)
.col(Trip::Begin),
)
.to_owned(),
)
.await

View File

@ -3,7 +3,7 @@ use rocket::{
response::{Flash, Redirect},
Route, State,
};
use sea_orm::{ActiveModelTrait, DatabaseConnection, EntityTrait, Set};
use sea_orm::{ActiveModelTrait, ColumnTrait, DatabaseConnection, EntityTrait, QueryFilter, Set};
use crate::models::{day, trip, user};
@ -14,6 +14,8 @@ struct RegisterForm {
day: NaiveDateForm,
#[field(validate = len(3..))]
name: String,
time: Option<String>,
cox_id: Option<i32>,
}
#[put("/", data = "<register>")]
@ -42,6 +44,8 @@ async fn register(
let trip = trip::ActiveModel {
day: Set(day.clone()),
user_id: Set(user.id),
begin: Set(register.time.clone()),
cox_id: Set(register.cox_id.clone()),
..Default::default()
};
@ -65,6 +69,8 @@ async fn register(
struct DeleteForm {
day: NaiveDateForm,
user: i32,
cox_id: Option<i32>,
begin: Option<String>,
}
#[delete("/", data = "<delete>")]
@ -87,7 +93,11 @@ async fn delete(
);
}
let trip = trip::Entity::find_by_id((format!("{}", day.day.format("%Y-%m-%d")), user.id))
let trip = trip::Entity::find()
.filter(trip::Column::Day.eq(format!("{}", day.day.format("%Y-%m-%d"))))
.filter(trip::Column::UserId.eq(user.id))
.filter(trip::Column::CoxId.eq(delete.cox_id))
.filter(trip::Column::Begin.eq(delete.begin.clone()))
.one(db.inner())
.await
.unwrap();
@ -101,6 +111,8 @@ async fn delete(
trip::Entity::delete(trip::ActiveModel {
day: Set(trip.day),
user_id: Set(trip.user_id),
//cox_id: Set(delete.cox_id),
begin: Set(delete.begin.clone()),
..Default::default()
})
.exec(db.inner())

View File

@ -5,15 +5,46 @@
{% for day_with_trip in data %}
{% set day = day_with_trip.day %}
{% set day_string = day.day | date(format="%Y-%m-%d") %}
{% set trips = day_with_trip.trips %}
{% set_global default_trips = [] %}
{% set_global indep_trips = [] %}
{% for trip in day_with_trip.trips %}
{% if trip.trip.begin or trip.trip.cox_id %}
{% set_global indep_trips = indep_trips | concat(with=trip) %}
{% else %}
{% set_global default_trips = default_trips | concat(with=trip) %}
{% endif %}
{% endfor %}
{% set cox = trips | filter(attribute="user.is_cox", value=true) %}
{% set cox = default_trips | filter(attribute="user.is_cox", value=true) %}
{% set amount_cox = cox | length %}
{% set cox_needed = amount_cox < day.planned_amount_cox %}
<div class="bg-gray p-3 mb-1 data-block" data-needed="{{ cox_needed}}">
<strong class="block">{{ day.day | date(format="%d.%m.%Y")}}</strong>
<strong class="block">{{ day.day | date(format="%A, %d.%m.%Y", locale="de_AT")}}</strong>
{% if user.is_cox %}
<details class="text-right">
<summary class="button">NEUE AUSFAHRT</summary>
<form method="post" class="text-left" action="/register">
<input type="hidden" name="_method" value="put" />
<input type="hidden" name="day" value="{{ day_string }}" />
<div class="row content-align-bottom">
<div class="four columns">
<label for="name">Name</label>
<input class="u-full-width" type="text" id="name" name="name" value="{{ user.name }}" />
</div>
<div class="four columns">
<label for="time">Time</label>
<input class="u-full-width" type="text" id="time" name="time" value="17:00" />
</div>
<div class="four columns">
<input class="button-primary" type="submit" value="Speichern">
</div>
</div>
</form>
</details>
{% endif %}
{% if user.is_admin %}
<details class="text-right" style="margin-top: -3rem;">
<summary class="button">&#x270e;</summary>
@ -43,18 +74,20 @@
{% endif %}
{% if day.planned_amount_cox > 0%}
{% set rowers = trips | filter(attribute="user.is_cox", value=false) | sort(attribute="trip.created") %}
{% set rowers = default_trips | filter(attribute="user.is_cox", value=false) | sort(attribute="trip.created") %}
{% if cox_needed %}
{% set cox_left = day.planned_amount_cox - amount_cox %}
<div class="block text-red">Es {{ cox_left | pluralize(singular="wird", plural="werden")}} noch {{ cox_left }} Steuerperson{{ cox_left | pluralize(plural="en")}} gesucht!</div>
{% endif %}
<strong class="block mt-1">Abfahrtszeit: {{ day.planned_starting_time }} Uhr</strong>
<div style="max-width: 75%">{{ trips | length }} angemeldete Person{{ trips | length | pluralize(plural="en") }}: {{ cox | length }} Steuerperson{{ cox | length | pluralize(plural="en") }} ({% for c in cox %}{{ c.user.name }} {% if c.user.name == user.name %}
<div style="max-width: 75%">{{ default_trips | length }} angemeldete Person{{ default_trips | length | pluralize(plural="en") }}: {{ cox | length }} Steuerperson{{ cox | length | pluralize(plural="en") }} ({% for c in cox %}{{ c.user.name }} {% if c.user.name == user.name %}
<form method="post" action="/register">
<input type="hidden" name="_method" value="delete" />
<input type="hidden" name="day" value="{{ day.day}}" />
<input type="hidden" name="user" value="{{ c.user.id}}" />
<input type="hidden" name="cox_id" value="{{ c.trip.cox_id}}" />
<input type="hidden" name="begin" value="{{ c.trip.begin}}" />
<input type="submit" value="Abmelden" style="float: left;" />
</form>
{% endif %} {% endfor %}), {{ rowers | length }} Ruderer:</div>
@ -68,6 +101,8 @@
<input type="hidden" name="_method" value="delete" />
<input type="hidden" name="day" value="{{ day.day}}" />
<input type="hidden" name="user" value="{{ r.user.id}}" />
<input type="hidden" name="cox_id" value="{{ r.trip.cox_id}}" />
<input type="hidden" name="begin" value="{{ r.trip.begin}}" />
<input type="submit" value="Abmelden" />
@ -97,9 +132,63 @@
{% else %}
Anmeldung an diesem Tag leider nicht möglich (zB bei USI Kursen)
{% endif %}
{% else %}
(Noch) keine Ausfahrt geplant
{% endif %}
{% for trip in indep_trips %}
{% if trip.trip.begin %}
{{trip.user.name}} @ {{trip.trip.begin}}
{% set rowers = indep_trips | filter(attribute="trip.cox_id", value=trip.user.id) %}
{% if trip.user.name == user.name and rowers | length == 0 %}
<form method="post" action="/register">
<input type="hidden" name="_method" value="delete" />
<input type="hidden" name="day" value="{{ day.day}}" />
<input type="hidden" name="user" value="{{ trip.user.id}}" />
<input type="hidden" name="cox_id" value="{{ trip.trip.cox_id}}" />
<input type="hidden" name="begin" value="{{ trip.trip.begin}}" />
<input type="submit" value="Abmelden" style="float: left;" />
</form>
{% endif %}
:
<ol>
{% for r in rowers %}
<li>
{{ r.user.name }} (angemeldet seit {{ r.trip.created | date(format="%d.%m. %H:%M", timezone="Europe/Vienna") }})
{% if r.user.name == user.name %}
<form method="post" action="/register">
<input type="hidden" name="_method" value="delete" />
<input type="hidden" name="day" value="{{ day.day}}" />
<input type="hidden" name="user" value="{{ r.user.id}}" />
<input type="hidden" name="cox_id" value="{{ trip.cox_id}}" />
<input type="hidden" name="begin" value="{{ trip.begin}}" />
<input type="submit" value="Abmelden" />
</form>
{% endif %}
</li>
{% endfor %}
</ol>
<details class="text-right">
<summary class="button">&plus;</summary>
<form method="post" class="text-left" action="/register">
<input type="hidden" name="_method" value="put" />
<input type="hidden" name="day" value="{{ day_string }}" />
<input type="hidden" name="cox_id" value="{{ trip.user.id }}" />
<div class="row content-align-bottom">
<div class="six columns">
<label for="name">Name</label>
<input class="u-full-width" type="text" id="name" name="name" value="{{ user.name }}" />
</div>
<div class="six columns">
<input class="button-primary" type="submit" value="Speichern">
</div>
</div>
</form>
</details>
{% endif %}
{% endfor %}
</div>
{% endfor %}