Compare commits
63 Commits
main
...
c7f1702663
Author | SHA1 | Date | |
---|---|---|---|
c7f1702663 | |||
ccff9a3752 | |||
aac99c86fa | |||
2e13acc0b0 | |||
6a59634de3 | |||
63a32f02bf | |||
429f0c1ddc | |||
0354e4e190 | |||
7935d1837f | |||
f769af279b | |||
de62585b64 | |||
ac24be6c5e | |||
13976b02d8 | |||
3aef4fa971 | |||
29e9911653 | |||
eca711e572 | |||
09aa0fc136 | |||
cc9505ca1e | |||
22f70f533a | |||
6df029b4a7 | |||
1d4d59842b | |||
a63d29a42a | |||
1f4ebc31ed | |||
50cd3c2d75 | |||
0edd796f73 | |||
e883c0e6e2 | |||
d2390ca5c2 | |||
4906b757b8 | |||
0b62f59d19 | |||
924683511c | |||
d7d6eb2b43 | |||
4859890389 | |||
4f34cc180c | |||
3c26381901 | |||
e01f9806bd | |||
71087af0df | |||
6efcaaccf9 | |||
60578dfaba | |||
addf0f437b | |||
51df7f2d1e | |||
78faf1b0db | |||
e3fc756b3f | |||
7083d27644 | |||
8277ef6af8 | |||
67d5df9c18 | |||
3ffc44a5a2 | |||
bd2686fa9c | |||
495ee666cd | |||
5296b6a6c1 | |||
49e657ab54 | |||
25bbaca0d3 | |||
26038eabe4 | |||
57acd92e7c | |||
c136c60e62 | |||
a5e90ea014 | |||
f0f3909239 | |||
1438bbe3a8 | |||
a910cd745d | |||
6265440288 | |||
3baed66ebc | |||
499ce06438 | |||
67e5277c62 | |||
ce154bf060 |
@@ -25,15 +25,15 @@ jobs:
|
|||||||
cargo build
|
cargo build
|
||||||
cd frontend && npm install && npm run build
|
cd frontend && npm install && npm run build
|
||||||
- name: Frontend tests
|
- name: Frontend tests
|
||||||
run: cd frontend && npx playwright install && npx playwright test --workers 1 --reporter html,line
|
run: cd frontend && npx playwright install && npx playwright test --workers 1 --reporter line
|
||||||
- uses: actions/upload-artifact@v3
|
|
||||||
if: always()
|
|
||||||
with:
|
|
||||||
name: playwright-report
|
|
||||||
path: frontend/playwright-report/
|
|
||||||
retention-days: 30
|
|
||||||
- name: Backend tests
|
- name: Backend tests
|
||||||
run: cargo test --verbose
|
run: cargo test --verbose
|
||||||
|
#- uses: actions/upload-artifact@v3
|
||||||
|
# if: always()
|
||||||
|
# with:
|
||||||
|
# name: playwright-report
|
||||||
|
# path: frontend/playwright-report/
|
||||||
|
# retention-days: 30
|
||||||
|
|
||||||
deploy-staging:
|
deploy-staging:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
@@ -63,16 +63,16 @@ jobs:
|
|||||||
echo "$SSH_PRIVATE_KEY" > ~/.ssh/id_rsa
|
echo "$SSH_PRIVATE_KEY" > ~/.ssh/id_rsa
|
||||||
chmod 600 ~/.ssh/id_rsa
|
chmod 600 ~/.ssh/id_rsa
|
||||||
|
|
||||||
scp -C target/$CARGO_TARGET/release/rot $SSH_USER@$SSH_HOST:/root/rowing-staging/rot-updating
|
scp -C target/$CARGO_TARGET/release/rot $SSH_USER@$SSH_HOST:/home/rowing-staging/rot-updating
|
||||||
|
|
||||||
scp -C staging-diff.sql $SSH_USER@$SSH_HOST:/root/rowing-staging/
|
scp -C staging-diff.sql $SSH_USER@$SSH_HOST:/home/rowing-staging/
|
||||||
scp -C -r static $SSH_USER@$SSH_HOST:/root/rowing-staging/
|
scp -C -r static $SSH_USER@$SSH_HOST:/home/rowing-staging/
|
||||||
scp -C -r templates $SSH_USER@$SSH_HOST:/root/rowing-staging/
|
scp -C -r templates $SSH_USER@$SSH_HOST:/home/rowing-staging/
|
||||||
scp -C -r svelte $SSH_USER@$SSH_HOST:/root/rowing-staging/
|
scp -C -r svelte $SSH_USER@$SSH_HOST:/home/rowing-staging/
|
||||||
ssh $SSH_USER@$SSH_HOST 'sudo systemctl stop rowing-staging'
|
ssh $SSH_USER@$SSH_HOST 'sudo systemctl stop rotstaging'
|
||||||
ssh $SSH_USER@$SSH_HOST 'rm -f /root/rowing-staging/db.sqlite && cp /root/rowing-prod/db.sqlite /root/rowing-staging/db.sqlite && mkdir -p /root/rowing-staging/svelte/build && mkdir -p /root/rowing-staging/data-ergo/thirty && mkdir -p /root/rowing-staging/data-ergo/dozen && sqlite3 /root/rowing-staging/db.sqlite < /root/rowing-staging/staging-diff.sql'
|
ssh $SSH_USER@$SSH_HOST 'rm /home/rowing-staging/db.sqlite && cp /home/rowing/db.sqlite /home/rowing-staging/db.sqlite && mkdir -p /home/rowing-staging/svelte/build && mkdir -p /home/rowing-staging/data-ergo/thirty && mkdir -p /home/rowing-staging/data-ergo/dozen && sqlite3 /home/rowing-staging/db.sqlite < /home/rowing-staging/staging-diff.sql'
|
||||||
ssh $SSH_USER@$SSH_HOST 'mv /root/rowing-staging/rot-updating /root/rowing-staging/rot'
|
ssh $SSH_USER@$SSH_HOST 'mv /home/rowing-staging/rot-updating /home/rowing-staging/rot'
|
||||||
ssh $SSH_USER@$SSH_HOST 'sudo systemctl start rowing-staging'
|
ssh $SSH_USER@$SSH_HOST 'sudo systemctl start rotstaging'
|
||||||
env:
|
env:
|
||||||
SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
|
SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
|
||||||
SSH_HOST: ${{ secrets.SSH_HOST }}
|
SSH_HOST: ${{ secrets.SSH_HOST }}
|
||||||
@@ -106,14 +106,14 @@ jobs:
|
|||||||
echo "$SSH_PRIVATE_KEY" > ~/.ssh/id_rsa
|
echo "$SSH_PRIVATE_KEY" > ~/.ssh/id_rsa
|
||||||
chmod 600 ~/.ssh/id_rsa
|
chmod 600 ~/.ssh/id_rsa
|
||||||
|
|
||||||
scp -C target/$CARGO_TARGET/release/rot $SSH_USER@$SSH_HOST:/root/rowing-prod/rot-updating
|
scp -C target/$CARGO_TARGET/release/rot $SSH_USER@$SSH_HOST:/home/rowing/rot-updating
|
||||||
scp -C -r static $SSH_USER@$SSH_HOST:/root/rowing-prod/
|
scp -C -r static $SSH_USER@$SSH_HOST:/home/rowing/
|
||||||
scp -C -r templates $SSH_USER@$SSH_HOST:/root/rowing-prod/
|
scp -C -r templates $SSH_USER@$SSH_HOST:/home/rowing/
|
||||||
scp -C -r svelte $SSH_USER@$SSH_HOST:/root/rowing-prod/
|
scp -C -r svelte $SSH_USER@$SSH_HOST:/home/rowing/
|
||||||
ssh $SSH_USER@$SSH_HOST 'mkdir -p /root/rowing-prod/svelte/build && mkdir -p /root/rowing-prod/data-ergo/thirty && mkdir -p /root/rowing-prod/data-ergo/dozen'
|
ssh $SSH_USER@$SSH_HOST 'mkdir -p /home/rowing/svelte/build && mkdir -p /home/rowing/data-ergo/thirty && mkdir -p /home/rowing/data-ergo/dozen'
|
||||||
ssh $SSH_USER@$SSH_HOST 'sudo systemctl stop rowing-prod'
|
ssh $SSH_USER@$SSH_HOST 'sudo systemctl stop rot'
|
||||||
ssh $SSH_USER@$SSH_HOST 'mv /root/rowing-prod/rot-updating /root/rowing-prod/rot'
|
ssh $SSH_USER@$SSH_HOST 'mv /home/rowing/rot-updating /home/rowing/rot'
|
||||||
ssh $SSH_USER@$SSH_HOST 'sudo systemctl start rowing-prod'
|
ssh $SSH_USER@$SSH_HOST 'sudo systemctl start rot'
|
||||||
env:
|
env:
|
||||||
SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
|
SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
|
||||||
SSH_HOST: ${{ secrets.SSH_HOST }}
|
SSH_HOST: ${{ secrets.SSH_HOST }}
|
||||||
|
2
fd
2
fd
@@ -1,5 +1,5 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
scp root@app.rudernlinz.at:/root/rowing-prod/db.sqlite db.sqlite
|
scp root@128.140.64.118:/home/rowing/db.sqlite db.sqlite
|
||||||
#sqlite3 db.sqlite < seeds.sql
|
#sqlite3 db.sqlite < seeds.sql
|
||||||
|
|
||||||
|
@@ -413,7 +413,6 @@ function initNewChoice(select: HTMLInputElement) {
|
|||||||
steering_person.setAttribute("required", "required");
|
steering_person.setAttribute("required", "required");
|
||||||
}
|
}
|
||||||
const choice = new Choices(select, {
|
const choice = new Choices(select, {
|
||||||
searchResultLimit: 100,
|
|
||||||
searchFields: ["label", "value", "customProperties.searchableText"],
|
searchFields: ["label", "value", "customProperties.searchableText"],
|
||||||
removeItemButton: true,
|
removeItemButton: true,
|
||||||
loadingText: "Wird geladen...",
|
loadingText: "Wird geladen...",
|
||||||
|
6
package-lock.json
generated
6
package-lock.json
generated
@@ -1,6 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "rowt",
|
|
||||||
"lockfileVersion": 3,
|
|
||||||
"requires": true,
|
|
||||||
"packages": {}
|
|
||||||
}
|
|
@@ -8,7 +8,7 @@ use crate::model::{
|
|||||||
notification::Notification,
|
notification::Notification,
|
||||||
role::Role,
|
role::Role,
|
||||||
};
|
};
|
||||||
use chrono::{Datelike, Local, NaiveDate};
|
use chrono::NaiveDate;
|
||||||
use rocket::{fs::TempFile, tokio::io::AsyncReadExt};
|
use rocket::{fs::TempFile, tokio::io::AsyncReadExt};
|
||||||
use sqlx::SqlitePool;
|
use sqlx::SqlitePool;
|
||||||
|
|
||||||
@@ -529,13 +529,6 @@ impl User {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) async fn remove_membership_pdf(&self, db: &SqlitePool, updated_by: &ManageUserUser) {
|
pub(crate) async fn remove_membership_pdf(&self, db: &SqlitePool, updated_by: &ManageUserUser) {
|
||||||
ActivityBuilder::new(&format!(
|
|
||||||
"{updated_by} hat die Beitrittserklärung vom Beutzer gelöscht."
|
|
||||||
))
|
|
||||||
.user(self)
|
|
||||||
.save(db)
|
|
||||||
.await;
|
|
||||||
|
|
||||||
sqlx::query!(
|
sqlx::query!(
|
||||||
"UPDATE user SET membership_pdf = null where id = ?",
|
"UPDATE user SET membership_pdf = null where id = ?",
|
||||||
self.id
|
self.id
|
||||||
@@ -578,32 +571,4 @@ impl User {
|
|||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) async fn has_to_pay_einschreibgebuehr_this_year(&self, db: &SqlitePool) -> bool {
|
|
||||||
if !self.has_role(db, "schnupperant").await {
|
|
||||||
if let Some(member_since_date) = &self.member_since_date {
|
|
||||||
if let Ok(member_since_date) =
|
|
||||||
NaiveDate::parse_from_str(member_since_date, "%Y-%m-%d")
|
|
||||||
{
|
|
||||||
if member_since_date.year() == Local::now().year()
|
|
||||||
&& !self.has_role(db, "no-einschreibgebuehr").await
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
false
|
|
||||||
}
|
|
||||||
pub(crate) fn has_to_pay_only_half(&self) -> bool {
|
|
||||||
if let Some(member_since_date) = &self.member_since_date {
|
|
||||||
if let Ok(member_since_date) = NaiveDate::parse_from_str(member_since_date, "%Y-%m-%d")
|
|
||||||
{
|
|
||||||
let halfprice_startdate =
|
|
||||||
NaiveDate::from_ymd_opt(Local::now().year(), 7, 1).unwrap();
|
|
||||||
return member_since_date >= halfprice_startdate;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
false
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@@ -1,9 +1,10 @@
|
|||||||
use super::User;
|
use super::User;
|
||||||
use crate::{
|
use crate::{
|
||||||
model::family::Family, BOAT_STORAGE, DUAL_MEMBERSHIP, EINSCHREIBGEBUEHR, FAMILY_THREE_OR_MORE,
|
BOAT_STORAGE, DUAL_MEMBERSHIP, EINSCHREIBGEBUEHR, FAMILY_THREE_OR_MORE, FAMILY_TWO, FOERDERND,
|
||||||
FAMILY_TWO, FOERDERND, REGULAR, RENNRUDERBEITRAG, SCHECKBUCH, STUDENT_OR_PUPIL, TRIAL_ROWING,
|
REGULAR, RENNRUDERBEITRAG, SCHECKBUCH, STUDENT_OR_PUPIL, TRIAL_ROWING, TRIAL_ROWING_REDUCED,
|
||||||
TRIAL_ROWING_REDUCED, UNTERSTUETZEND,
|
UNTERSTUETZEND, model::family::Family,
|
||||||
};
|
};
|
||||||
|
use chrono::{Datelike, Local, NaiveDate};
|
||||||
use serde::Serialize;
|
use serde::Serialize;
|
||||||
use sqlx::SqlitePool;
|
use sqlx::SqlitePool;
|
||||||
|
|
||||||
@@ -80,52 +81,30 @@ impl User {
|
|||||||
let mut fee = Fee::new();
|
let mut fee = Fee::new();
|
||||||
|
|
||||||
if let Some(family) = Family::find_by_opt_id(db, self.family_id).await {
|
if let Some(family) = Family::find_by_opt_id(db, self.family_id).await {
|
||||||
let mut einschreibgebuehr = false;
|
|
||||||
let mut half_price = true;
|
|
||||||
for member in family.members(db).await {
|
for member in family.members(db).await {
|
||||||
fee.add_person(&member);
|
fee.add_person(&member);
|
||||||
if member.has_role(db, "paid").await {
|
if member.has_role(db, "paid").await {
|
||||||
fee.paid();
|
fee.paid();
|
||||||
}
|
}
|
||||||
fee.merge(member.fee_without_families(db, true).await);
|
fee.merge(member.fee_without_families(db).await);
|
||||||
if member.has_to_pay_einschreibgebuehr_this_year(db).await {
|
|
||||||
einschreibgebuehr = true;
|
|
||||||
}
|
|
||||||
if !member.has_to_pay_only_half() {
|
|
||||||
half_price = false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if family.amount_family_members(db).await > 2 {
|
if family.amount_family_members(db).await > 2 {
|
||||||
if half_price {
|
|
||||||
fee.add(
|
|
||||||
"Familie 3+ Personen (Halbpreis)".into(),
|
|
||||||
FAMILY_THREE_OR_MORE / 2,
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
fee.add("Familie 3+ Personen".into(), FAMILY_THREE_OR_MORE);
|
fee.add("Familie 3+ Personen".into(), FAMILY_THREE_OR_MORE);
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if half_price {
|
|
||||||
fee.add("Familie 2 Personen (Halbpreis)".into(), FAMILY_TWO / 2);
|
|
||||||
} else {
|
} else {
|
||||||
fee.add("Familie 2 Personen".into(), FAMILY_TWO);
|
fee.add("Familie 2 Personen".into(), FAMILY_TWO);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
if einschreibgebuehr {
|
|
||||||
fee.add("Einschreibgebühr (Familie)".into(), EINSCHREIBGEBUEHR);
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
fee.add_person(self);
|
fee.add_person(self);
|
||||||
if self.has_role(db, "paid").await {
|
if self.has_role(db, "paid").await {
|
||||||
fee.paid();
|
fee.paid();
|
||||||
}
|
}
|
||||||
fee.merge(self.fee_without_families(db, false).await);
|
fee.merge(self.fee_without_families(db).await);
|
||||||
}
|
}
|
||||||
|
|
||||||
Some(fee)
|
Some(fee)
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn fee_without_families(&self, db: &SqlitePool, entry_fee_paid_with_family: bool) -> Fee {
|
async fn fee_without_families(&self, db: &SqlitePool) -> Fee {
|
||||||
let mut fee = Fee::new();
|
let mut fee = Fee::new();
|
||||||
|
|
||||||
if !self.has_role(db, "Donau Linz").await
|
if !self.has_role(db, "Donau Linz").await
|
||||||
@@ -146,24 +125,38 @@ impl User {
|
|||||||
|
|
||||||
let amount_boats = self.amount_boats(db).await;
|
let amount_boats = self.amount_boats(db).await;
|
||||||
if amount_boats > 0 {
|
if amount_boats > 0 {
|
||||||
if self.has_to_pay_only_half() {
|
|
||||||
fee.add(
|
|
||||||
format!("{}x Bootsplatz (Halbpreis)", amount_boats),
|
|
||||||
amount_boats * BOAT_STORAGE / 2,
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
fee.add(
|
fee.add(
|
||||||
format!("{}x Bootsplatz", amount_boats),
|
format!("{}x Bootsplatz", amount_boats),
|
||||||
amount_boats * BOAT_STORAGE,
|
amount_boats * BOAT_STORAGE,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if self.has_to_pay_einschreibgebuehr_this_year(db).await && !entry_fee_paid_with_family {
|
if !self.has_role(db, "schnupperant").await {
|
||||||
|
if let Some(member_since_date) = &self.member_since_date {
|
||||||
|
if let Ok(member_since_date) =
|
||||||
|
NaiveDate::parse_from_str(member_since_date, "%Y-%m-%d")
|
||||||
|
{
|
||||||
|
if member_since_date.year() == Local::now().year()
|
||||||
|
&& !self.has_role(db, "no-einschreibgebuehr").await
|
||||||
|
{
|
||||||
fee.add("Einschreibgebühr".into(), EINSCHREIBGEBUEHR);
|
fee.add("Einschreibgebühr".into(), EINSCHREIBGEBUEHR);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
let halfprice = self.has_to_pay_only_half();
|
let halfprice = if let Some(member_since_date) = &self.member_since_date {
|
||||||
|
match NaiveDate::parse_from_str(member_since_date, "%Y-%m-%d") {
|
||||||
|
Ok(member_since_date) => {
|
||||||
|
let halfprice_startdate =
|
||||||
|
NaiveDate::from_ymd_opt(Local::now().year(), 7, 1).unwrap();
|
||||||
|
member_since_date >= halfprice_startdate
|
||||||
|
}
|
||||||
|
Err(_) => false,
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
false
|
||||||
|
};
|
||||||
|
|
||||||
if self.has_role(db, "schnupperant").await {
|
if self.has_role(db, "schnupperant").await {
|
||||||
if self.has_role(db, "Student").await || self.has_role(db, "Schüler").await {
|
if self.has_role(db, "Student").await || self.has_role(db, "Schüler").await {
|
||||||
|
@@ -102,13 +102,6 @@ impl UserWithDetails {
|
|||||||
user,
|
user,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn allowed_to_row(&self) -> bool {
|
|
||||||
self.roles.contains(&"Donau Linz".into())
|
|
||||||
|| self.roles.contains(&"Förderndes Mitglied".into())
|
|
||||||
|| self.roles.contains(&"scheckbuch".into())
|
|
||||||
|| self.user.name == "Externe Steuerperson"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
@@ -431,7 +424,7 @@ WHERE family_id IS NULL;
|
|||||||
"
|
"
|
||||||
SELECT id, name, pw, deleted, last_access, dob, weight, sex, member_since_date, birthdate, mail, nickname, phone, address, family_id, user_token
|
SELECT id, name, pw, deleted, last_access, dob, weight, sex, member_since_date, birthdate, mail, nickname, phone, address, family_id, user_token
|
||||||
FROM user
|
FROM user
|
||||||
WHERE deleted = 0 AND (SELECT COUNT(*) FROM user_role WHERE user_id=user.id AND role_id in (SELECT id FROM role WHERE name = 'cox' or name = 'Bootsführer')) > 0
|
WHERE deleted = 0 AND (SELECT COUNT(*) FROM user_role WHERE user_id=user.id AND role_id = (SELECT id FROM role WHERE name = 'cox')) > 0
|
||||||
ORDER BY last_access DESC
|
ORDER BY last_access DESC
|
||||||
"
|
"
|
||||||
)
|
)
|
||||||
@@ -795,7 +788,6 @@ macro_rules! special_user {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl $name {
|
impl $name {
|
||||||
#[allow(dead_code)]
|
|
||||||
pub fn into_inner(self) -> User {
|
pub fn into_inner(self) -> User {
|
||||||
self.user
|
self.user
|
||||||
}
|
}
|
||||||
@@ -857,7 +849,7 @@ special_user!(ErgoUser, +"ergo");
|
|||||||
special_user!(SteeringUser, +"cox", +"Bootsführer");
|
special_user!(SteeringUser, +"cox", +"Bootsführer");
|
||||||
special_user!(AdminUser, +"admin");
|
special_user!(AdminUser, +"admin");
|
||||||
special_user!(AllowedForPlannedTripsUser, +"Donau Linz", +"scheckbuch", +"Förderndes Mitglied");
|
special_user!(AllowedForPlannedTripsUser, +"Donau Linz", +"scheckbuch", +"Förderndes Mitglied");
|
||||||
special_user!(DonauLinzUser, +"Donau Linz", +"Förderndes Mitglied", -"Unterstützend"); // TODO:
|
special_user!(DonauLinzUser, +"Donau Linz", -"Unterstützend", -"Förderndes Mitglied"); // TODO:
|
||||||
// remove ->
|
// remove ->
|
||||||
// RegularUser
|
// RegularUser
|
||||||
special_user!(SchnupperBetreuerUser, +"schnupper-betreuer");
|
special_user!(SchnupperBetreuerUser, +"schnupper-betreuer");
|
||||||
|
@@ -40,7 +40,7 @@ async fn index(
|
|||||||
let allowed_to_edit = AllowedToUpdateBoathouse::new(db, &admin.user)
|
let allowed_to_edit = AllowedToUpdateBoathouse::new(db, &admin.user)
|
||||||
.await
|
.await
|
||||||
.is_some();
|
.is_some();
|
||||||
context.insert("allowed_to_edit", &allowed_to_edit);
|
context.insert("allowed_to_edit", &boathouse);
|
||||||
|
|
||||||
context.insert(
|
context.insert(
|
||||||
"loggedin_user",
|
"loggedin_user",
|
||||||
|
120
src/tera/log.rs
120
src/tera/log.rs
@@ -47,46 +47,12 @@ impl<'r> FromRequest<'r> for KioskCookie {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[get("/", rank = 2)]
|
#[get("/", rank = 2)]
|
||||||
async fn index_loggedin(
|
async fn index(
|
||||||
db: &State<SqlitePool>,
|
db: &State<SqlitePool>,
|
||||||
flash: Option<FlashMessage<'_>>,
|
flash: Option<FlashMessage<'_>>,
|
||||||
user: DonauLinzUser,
|
user: DonauLinzUser,
|
||||||
) -> Template {
|
) -> Template {
|
||||||
let mut context = Context::new();
|
|
||||||
|
|
||||||
let boats = Boat::for_user(db, &user).await;
|
let boats = Boat::for_user(db, &user).await;
|
||||||
context.insert("boats", &boats);
|
|
||||||
|
|
||||||
context.insert(
|
|
||||||
"loggedin_user",
|
|
||||||
&UserWithDetails::from_user(user.into_inner(), db).await,
|
|
||||||
);
|
|
||||||
|
|
||||||
let context = index(db, flash, context).await;
|
|
||||||
Template::render("log", context.into_json())
|
|
||||||
}
|
|
||||||
|
|
||||||
#[get("/")]
|
|
||||||
async fn index_kiosk(
|
|
||||||
db: &State<SqlitePool>,
|
|
||||||
flash: Option<FlashMessage<'_>>,
|
|
||||||
_kiosk: KioskCookie,
|
|
||||||
) -> Template {
|
|
||||||
let mut context = Context::new();
|
|
||||||
|
|
||||||
let boats = Boat::all(db).await;
|
|
||||||
context.insert("boats", &boats);
|
|
||||||
|
|
||||||
context.insert("show_kiosk_header", &true);
|
|
||||||
|
|
||||||
let context = index(db, flash, context).await;
|
|
||||||
Template::render("kiosk", context.into_json())
|
|
||||||
}
|
|
||||||
|
|
||||||
async fn index(db: &SqlitePool, flash: Option<FlashMessage<'_>>, mut context: Context) -> Context {
|
|
||||||
if let Some(msg) = flash {
|
|
||||||
context.insert("flash", &msg.into_inner());
|
|
||||||
}
|
|
||||||
|
|
||||||
let mut coxes: Vec<UserWithDetails> = futures::future::join_all(
|
let mut coxes: Vec<UserWithDetails> = futures::future::join_all(
|
||||||
User::cox(db)
|
User::cox(db)
|
||||||
@@ -95,7 +61,9 @@ async fn index(db: &SqlitePool, flash: Option<FlashMessage<'_>>, mut context: Co
|
|||||||
.map(|user| UserWithDetails::from_user(user, db)),
|
.map(|user| UserWithDetails::from_user(user, db)),
|
||||||
)
|
)
|
||||||
.await;
|
.await;
|
||||||
coxes.retain(|u| u.roles.contains(&"Donau Linz".into()));
|
coxes.retain(|u| {
|
||||||
|
u.roles.contains(&"Donau Linz".into()) || u.roles.contains(&"scheckbuch".into())
|
||||||
|
});
|
||||||
|
|
||||||
let mut users: Vec<UserWithDetails> = futures::future::join_all(
|
let mut users: Vec<UserWithDetails> = futures::future::join_all(
|
||||||
User::all(db)
|
User::all(db)
|
||||||
@@ -104,13 +72,24 @@ async fn index(db: &SqlitePool, flash: Option<FlashMessage<'_>>, mut context: Co
|
|||||||
.map(|user| UserWithDetails::from_user(user, db)),
|
.map(|user| UserWithDetails::from_user(user, db)),
|
||||||
)
|
)
|
||||||
.await;
|
.await;
|
||||||
users.retain(|u| u.allowed_to_row());
|
users.retain(|u| {
|
||||||
|
u.roles.contains(&"Donau Linz".into())
|
||||||
|
|| u.roles.contains(&"Förderndes Mitglied".into())
|
||||||
|
|| u.roles.contains(&"scheckbuch".into())
|
||||||
|
|| u.user.name == "Externe Steuerperson"
|
||||||
|
});
|
||||||
|
|
||||||
let logtypes = LogType::all(db).await;
|
let logtypes = LogType::all(db).await;
|
||||||
let distances = Distance::all(db).await;
|
let distances = Distance::all(db).await;
|
||||||
|
|
||||||
let on_water = Logbook::on_water(db).await;
|
let on_water = Logbook::on_water(db).await;
|
||||||
|
|
||||||
|
let mut context = Context::new();
|
||||||
|
if let Some(msg) = flash {
|
||||||
|
context.insert("flash", &msg.into_inner());
|
||||||
|
}
|
||||||
|
|
||||||
|
context.insert("boats", &boats);
|
||||||
context.insert("planned_trips", &Trip::get_for_today(db).await);
|
context.insert("planned_trips", &Trip::get_for_today(db).await);
|
||||||
context.insert(
|
context.insert(
|
||||||
"reservations",
|
"reservations",
|
||||||
@@ -119,10 +98,14 @@ async fn index(db: &SqlitePool, flash: Option<FlashMessage<'_>>, mut context: Co
|
|||||||
context.insert("coxes", &coxes);
|
context.insert("coxes", &coxes);
|
||||||
context.insert("users", &users);
|
context.insert("users", &users);
|
||||||
context.insert("logtypes", &logtypes);
|
context.insert("logtypes", &logtypes);
|
||||||
|
context.insert(
|
||||||
|
"loggedin_user",
|
||||||
|
&UserWithDetails::from_user(user.into_inner(), db).await,
|
||||||
|
);
|
||||||
context.insert("on_water", &on_water);
|
context.insert("on_water", &on_water);
|
||||||
context.insert("distances", &distances);
|
context.insert("distances", &distances);
|
||||||
|
|
||||||
context
|
Template::render("log", context.into_json())
|
||||||
}
|
}
|
||||||
|
|
||||||
#[get("/show", rank = 3)]
|
#[get("/show", rank = 3)]
|
||||||
@@ -197,6 +180,63 @@ async fn new_kiosk(
|
|||||||
Redirect::to("/log")
|
Redirect::to("/log")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[get("/")]
|
||||||
|
async fn kiosk(
|
||||||
|
db: &State<SqlitePool>,
|
||||||
|
flash: Option<FlashMessage<'_>>,
|
||||||
|
_kiosk: KioskCookie,
|
||||||
|
) -> Template {
|
||||||
|
let boats = Boat::all(db).await;
|
||||||
|
let mut coxes: Vec<UserWithDetails> = futures::future::join_all(
|
||||||
|
User::cox(db)
|
||||||
|
.await
|
||||||
|
.into_iter()
|
||||||
|
.map(|user| UserWithDetails::from_user(user, db)),
|
||||||
|
)
|
||||||
|
.await;
|
||||||
|
|
||||||
|
coxes.retain(|u| {
|
||||||
|
u.roles.contains(&"Donau Linz".into()) || u.roles.contains(&"scheckbuch".into())
|
||||||
|
});
|
||||||
|
|
||||||
|
let mut users: Vec<UserWithDetails> = futures::future::join_all(
|
||||||
|
User::all(db)
|
||||||
|
.await
|
||||||
|
.into_iter()
|
||||||
|
.map(|user| UserWithDetails::from_user(user, db)),
|
||||||
|
)
|
||||||
|
.await;
|
||||||
|
|
||||||
|
users.retain(|u| {
|
||||||
|
u.roles.contains(&"Donau Linz".into()) || u.roles.contains(&"scheckbuch".into())
|
||||||
|
});
|
||||||
|
|
||||||
|
let logtypes = LogType::all(db).await;
|
||||||
|
let distances = Distance::all(db).await;
|
||||||
|
|
||||||
|
let on_water = Logbook::on_water(db).await;
|
||||||
|
|
||||||
|
let mut context = Context::new();
|
||||||
|
if let Some(msg) = flash {
|
||||||
|
context.insert("flash", &msg.into_inner());
|
||||||
|
}
|
||||||
|
|
||||||
|
context.insert("planned_trips", &Trip::get_for_today(db).await);
|
||||||
|
context.insert("boats", &boats);
|
||||||
|
context.insert(
|
||||||
|
"reservations",
|
||||||
|
&BoatReservation::all_future_with_groups(db).await,
|
||||||
|
);
|
||||||
|
context.insert("coxes", &coxes);
|
||||||
|
context.insert("users", &users);
|
||||||
|
context.insert("logtypes", &logtypes);
|
||||||
|
context.insert("on_water", &on_water);
|
||||||
|
context.insert("distances", &distances);
|
||||||
|
context.insert("show_kiosk_header", &true);
|
||||||
|
|
||||||
|
Template::render("kiosk", context.into_json())
|
||||||
|
}
|
||||||
|
|
||||||
async fn create_logbook(
|
async fn create_logbook(
|
||||||
db: &SqlitePool,
|
db: &SqlitePool,
|
||||||
data: Form<LogToAdd>,
|
data: Form<LogToAdd>,
|
||||||
@@ -529,11 +569,11 @@ async fn delete_kiosk(
|
|||||||
|
|
||||||
pub fn routes() -> Vec<Route> {
|
pub fn routes() -> Vec<Route> {
|
||||||
routes![
|
routes![
|
||||||
index_loggedin,
|
index,
|
||||||
index_kiosk,
|
|
||||||
create,
|
create,
|
||||||
create_kiosk,
|
create_kiosk,
|
||||||
home,
|
home,
|
||||||
|
kiosk,
|
||||||
home_kiosk,
|
home_kiosk,
|
||||||
new_kiosk,
|
new_kiosk,
|
||||||
show,
|
show,
|
||||||
|
Reference in New Issue
Block a user