forked from Ruderverein-Donau-Linz/rowt
Compare commits
82 Commits
ecf73f72e5
...
main
Author | SHA1 | Date | |
---|---|---|---|
9890a4ac09 | |||
b60834ca18 | |||
f8b16b2a95 | |||
39e1c4432a | |||
c548bf211b | |||
bdf92f40f0 | |||
f1423b8713 | |||
47b46cf41d | |||
8ba763e54e | |||
4134b2a65b | |||
f289c7b6d7 | |||
0f1bc39b4b | |||
3eb84ce46b | |||
c8b01bcd03 | |||
9b31ea981a | |||
b4a22820e7 | |||
af0aad2a99 | |||
fe6db2cdd5 | |||
5cd75ed8c8 | |||
1ed0d8fd32 | |||
10740f988d | |||
f98963a28a | |||
37b6ea6057 | |||
06c5e5a9d1 | |||
0059dfe96f | |||
e01afa7d74 | |||
2458b0a100 | |||
36245fd0f7 | |||
85bec7f591 | |||
7e0b30f058 | |||
b0a2d3d539 | |||
ac5f9d253d | |||
8340e8b33f | |||
db429b6fe3 | |||
cf90ab6e1a | |||
3b25143a08 | |||
4ce9a573fe | |||
78aafe4d41 | |||
dc2ee38aa0 | |||
2b79df8e42 | |||
43c0b9ffc1 | |||
588520914c | |||
f1d4b6d008 | |||
da3949cca1 | |||
819c4bb31b | |||
0c425f7a8e | |||
5da4b592ea | |||
654674ce53 | |||
7e9acbb5ac | |||
9a30ce0afb | |||
21b33566bc | |||
eb9dd3f864 | |||
29f2cadb99 | |||
ca3de1123b | |||
f42bf5ea3a | |||
dfb53291b7 | |||
1c628f40ed | |||
9fcd5a1a8f | |||
2f4874321f | |||
6c83d00c2c | |||
0568e1fd4d | |||
298f384875 | |||
418bcc3143 | |||
35dffdd8f0 | |||
b9368e6c64 | |||
2853340a39 | |||
2ec4ec49a1 | |||
cc1ebb8ff6 | |||
2520108fba | |||
1e70e798af | |||
b419004949 | |||
94938fb4ea | |||
2368f03761 | |||
a7d33548d4 | |||
0f345862ee | |||
856e3b2cff | |||
9b9cf98473 | |||
ae61564ad4 | |||
a2a39103e0 | |||
d82bd3ebeb | |||
32800b1897 | |||
cfd8b12556 |
@@ -63,73 +63,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:/home/wolfgangsee/rot-updating
|
scp -C target/$CARGO_TARGET/release/rot $SSH_USER@$SSH_HOST:/root/rowing-wolfgangsee/rot-updating
|
||||||
scp -C -r static $SSH_USER@$SSH_HOST:/home/wolfgangsee/
|
scp -C -r static $SSH_USER@$SSH_HOST:/root/rowing-wolfgangsee/
|
||||||
scp -C -r templates $SSH_USER@$SSH_HOST:/home/wolfgangsee/
|
scp -C -r templates $SSH_USER@$SSH_HOST:/root/rowing-wolfgangsee/
|
||||||
scp -C -r svelte $SSH_USER@$SSH_HOST:/home/wolfgangsee/
|
scp -C -r svelte $SSH_USER@$SSH_HOST:/root/rowing-wolfgangsee/
|
||||||
ssh $SSH_USER@$SSH_HOST 'mkdir -p /home/wolfgangsee/svelte/build'
|
ssh $SSH_USER@$SSH_HOST 'mkdir -p /root/rowing-wolfgangsee/svelte/build'
|
||||||
ssh $SSH_USER@$SSH_HOST 'sudo systemctl stop wolfgangsee'
|
ssh $SSH_USER@$SSH_HOST 'sudo systemctl stop rowing-wolfgangsee'
|
||||||
ssh $SSH_USER@$SSH_HOST 'mv /home/wolfgangsee/rot-updating /home/wolfgangsee/rot'
|
ssh $SSH_USER@$SSH_HOST 'mv /root/rowing-wolfgangsee/rot-updating /root/rowing-wolfgangsee/rot'
|
||||||
ssh $SSH_USER@$SSH_HOST 'sudo systemctl start wolfgangsee'
|
ssh $SSH_USER@$SSH_HOST 'sudo systemctl start rowing-wolfgangsee'
|
||||||
env:
|
|
||||||
SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
|
|
||||||
SSH_HOST: ${{ secrets.SSH_HOST }}
|
|
||||||
SSH_USER: ${{ secrets.SSH_USER }}
|
|
||||||
- name: Deploy Normannen
|
|
||||||
run: |
|
|
||||||
mkdir -p ~/.ssh
|
|
||||||
ssh-keyscan -H $SSH_HOST >> ~/.ssh/known_hosts
|
|
||||||
echo "$SSH_PRIVATE_KEY" > ~/.ssh/id_rsa
|
|
||||||
chmod 600 ~/.ssh/id_rsa
|
|
||||||
|
|
||||||
scp -C target/$CARGO_TARGET/release/rot $SSH_USER@$SSH_HOST:/home/normannen/rot-updating
|
|
||||||
scp -C -r static $SSH_USER@$SSH_HOST:/home/normannen/
|
|
||||||
scp -C -r templates $SSH_USER@$SSH_HOST:/home/normannen/
|
|
||||||
scp -C -r svelte $SSH_USER@$SSH_HOST:/home/normannen/
|
|
||||||
ssh $SSH_USER@$SSH_HOST 'mkdir -p /home/normannen/svelte/build'
|
|
||||||
ssh $SSH_USER@$SSH_HOST 'sudo systemctl stop normannen'
|
|
||||||
ssh $SSH_USER@$SSH_HOST 'mv /home/normannen/rot-updating /home/normannen/rot'
|
|
||||||
ssh $SSH_USER@$SSH_HOST 'sudo systemctl start normannen'
|
|
||||||
env:
|
|
||||||
SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
|
|
||||||
SSH_HOST: ${{ secrets.SSH_HOST }}
|
|
||||||
SSH_USER: ${{ secrets.SSH_USER }}
|
|
||||||
|
|
||||||
- name: Deploy Ister
|
|
||||||
run: |
|
|
||||||
mkdir -p ~/.ssh
|
|
||||||
ssh-keyscan -H $SSH_HOST >> ~/.ssh/known_hosts
|
|
||||||
echo "$SSH_PRIVATE_KEY" > ~/.ssh/id_rsa
|
|
||||||
chmod 600 ~/.ssh/id_rsa
|
|
||||||
|
|
||||||
scp -C target/$CARGO_TARGET/release/rot $SSH_USER@$SSH_HOST:/home/ister/rot-updating
|
|
||||||
scp -C -r static $SSH_USER@$SSH_HOST:/home/ister/
|
|
||||||
scp -C -r templates $SSH_USER@$SSH_HOST:/home/ister/
|
|
||||||
scp -C -r svelte $SSH_USER@$SSH_HOST:/home/ister/
|
|
||||||
ssh $SSH_USER@$SSH_HOST 'mkdir -p /home/ister/svelte/build'
|
|
||||||
ssh $SSH_USER@$SSH_HOST 'sudo systemctl stop ister'
|
|
||||||
ssh $SSH_USER@$SSH_HOST 'mv /home/ister/rot-updating /home/ister/rot'
|
|
||||||
ssh $SSH_USER@$SSH_HOST 'sudo systemctl start ister'
|
|
||||||
env:
|
|
||||||
SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
|
|
||||||
SSH_HOST: ${{ secrets.SSH_HOST }}
|
|
||||||
SSH_USER: ${{ secrets.SSH_USER }}
|
|
||||||
|
|
||||||
- name: Deploy Kufstein
|
|
||||||
run: |
|
|
||||||
mkdir -p ~/.ssh
|
|
||||||
ssh-keyscan -H $SSH_HOST >> ~/.ssh/known_hosts
|
|
||||||
echo "$SSH_PRIVATE_KEY" > ~/.ssh/id_rsa
|
|
||||||
chmod 600 ~/.ssh/id_rsa
|
|
||||||
|
|
||||||
scp -C target/$CARGO_TARGET/release/rot $SSH_USER@$SSH_HOST:/home/kufstein/rot-updating
|
|
||||||
scp -C -r static $SSH_USER@$SSH_HOST:/home/kufstein/
|
|
||||||
scp -C -r templates $SSH_USER@$SSH_HOST:/home/kufstein/
|
|
||||||
scp -C -r svelte $SSH_USER@$SSH_HOST:/home/kufstein/
|
|
||||||
ssh $SSH_USER@$SSH_HOST 'mkdir -p /home/kufstein/svelte/build'
|
|
||||||
ssh $SSH_USER@$SSH_HOST 'sudo systemctl stop kufstein'
|
|
||||||
ssh $SSH_USER@$SSH_HOST 'mv /home/kufstein/rot-updating /home/kufstein/rot'
|
|
||||||
ssh $SSH_USER@$SSH_HOST 'sudo systemctl start kufstein'
|
|
||||||
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 }}
|
||||||
|
246
Cargo.lock
generated
246
Cargo.lock
generated
@@ -287,9 +287,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "bstr"
|
name = "bstr"
|
||||||
version = "1.11.3"
|
version = "1.12.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "531a9155a481e2ee699d4f98f43c0ca4ff8ee1bfd55c31e9e98fb29d2b176fe0"
|
checksum = "234113d19d0d7d613b40e86fb654acf958910802bcceab913a4f9e7cda03b1a4"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"memchr",
|
"memchr",
|
||||||
"serde",
|
"serde",
|
||||||
@@ -321,9 +321,9 @@ checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "cc"
|
name = "cc"
|
||||||
version = "1.2.17"
|
version = "1.2.19"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "1fcb57c740ae1daf453ae85f16e37396f672b039e00d9d866e07ddb24e328e3a"
|
checksum = "8e3a13707ac958681c13b39b458c073d0d9bc8a22cb1b2f4c8e55eb72c13f362"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"shlex",
|
"shlex",
|
||||||
]
|
]
|
||||||
@@ -520,20 +520,20 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "cron"
|
name = "cron"
|
||||||
version = "0.12.1"
|
version = "0.15.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "6f8c3e73077b4b4a6ab1ea5047c37c57aee77657bc8ecd6f29b0af082d0b0c07"
|
checksum = "5877d3fbf742507b66bc2a1945106bd30dd8504019d596901ddd012a4dd01740"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"chrono",
|
"chrono",
|
||||||
"nom 7.1.3",
|
|
||||||
"once_cell",
|
"once_cell",
|
||||||
|
"winnow 0.6.26",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "crossbeam-channel"
|
name = "crossbeam-channel"
|
||||||
version = "0.5.14"
|
version = "0.5.15"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "06ba6d68e24814cb8de6bb986db8222d3a027d15872cabc0d18817bc3c0e4471"
|
checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"crossbeam-utils",
|
"crossbeam-utils",
|
||||||
]
|
]
|
||||||
@@ -626,9 +626,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "deranged"
|
name = "deranged"
|
||||||
version = "0.4.1"
|
version = "0.4.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "28cfac68e08048ae1883171632c2aef3ebc555621ae56fbccce1cbf22dd7f058"
|
checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"powerfmt",
|
"powerfmt",
|
||||||
]
|
]
|
||||||
@@ -721,9 +721,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "email-encoding"
|
name = "email-encoding"
|
||||||
version = "0.4.0"
|
version = "0.4.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "20b9cde6a71f9f758440470f3de16db6c09a02c443ce66850d87f5410548fb8e"
|
checksum = "9298e6504d9b9e780ed3f7dfd43a61be8cd0e09eb07f7706a945b0072b6670b6"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"base64",
|
"base64",
|
||||||
"memchr",
|
"memchr",
|
||||||
@@ -756,9 +756,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "env_logger"
|
name = "env_logger"
|
||||||
version = "0.11.7"
|
version = "0.11.8"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "c3716d7a920fb4fac5d84e9d4bce8ceb321e9414b4409da61b07b75c1e3d0697"
|
checksum = "13c863f0904021b108aa8b2f55046443e6b1ebde8fd4a15c399893aae4fa069f"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anstream",
|
"anstream",
|
||||||
"anstyle",
|
"anstyle",
|
||||||
@@ -775,9 +775,9 @@ checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "errno"
|
name = "errno"
|
||||||
version = "0.3.10"
|
version = "0.3.11"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d"
|
checksum = "976dd42dc7e85965fe702eb8164f21f450704bdde31faefd6471dba214cb594e"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"libc",
|
"libc",
|
||||||
"windows-sys 0.59.0",
|
"windows-sys 0.59.0",
|
||||||
@@ -839,9 +839,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "flate2"
|
name = "flate2"
|
||||||
version = "1.1.0"
|
version = "1.1.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "11faaf5a5236997af9848be0bef4db95824b1d534ebc64d0f0c6cf3e67bd38dc"
|
checksum = "7ced92e76e966ca2fd84c8f7aa01a4aea65b0eb6648d72f7c8f3e2764a67fece"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"crc32fast",
|
"crc32fast",
|
||||||
"miniz_oxide",
|
"miniz_oxide",
|
||||||
@@ -1013,7 +1013,7 @@ dependencies = [
|
|||||||
"libc",
|
"libc",
|
||||||
"log",
|
"log",
|
||||||
"rustversion",
|
"rustversion",
|
||||||
"windows 0.48.0",
|
"windows",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -1197,13 +1197,13 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "hostname"
|
name = "hostname"
|
||||||
version = "0.4.0"
|
version = "0.4.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "f9c7c7c8ac16c798734b8a24560c1362120597c40d5e1459f09498f8f6c8f2ba"
|
checksum = "a56f203cd1c76362b69e3863fd987520ac36cf70a8c92627449b2f64a8cf7d65"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cfg-if",
|
"cfg-if",
|
||||||
"libc",
|
"libc",
|
||||||
"windows 0.52.0",
|
"windows-link",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -1286,9 +1286,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "iana-time-zone"
|
name = "iana-time-zone"
|
||||||
version = "0.1.62"
|
version = "0.1.63"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "b2fd658b06e56721792c5df4475705b6cda790e9298d19d2f8af083457bcd127"
|
checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"android_system_properties",
|
"android_system_properties",
|
||||||
"core-foundation-sys",
|
"core-foundation-sys",
|
||||||
@@ -1355,9 +1355,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "icu_locid_transform_data"
|
name = "icu_locid_transform_data"
|
||||||
version = "1.5.0"
|
version = "1.5.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e"
|
checksum = "7515e6d781098bf9f7205ab3fc7e9709d34554ae0b21ddbcb5febfa4bc7df11d"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "icu_normalizer"
|
name = "icu_normalizer"
|
||||||
@@ -1379,9 +1379,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "icu_normalizer_data"
|
name = "icu_normalizer_data"
|
||||||
version = "1.5.0"
|
version = "1.5.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516"
|
checksum = "c5e8338228bdc8ab83303f16b797e177953730f601a96c25d10cb3ab0daa0cb7"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "icu_properties"
|
name = "icu_properties"
|
||||||
@@ -1400,9 +1400,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "icu_properties_data"
|
name = "icu_properties_data"
|
||||||
version = "1.5.0"
|
version = "1.5.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569"
|
checksum = "85fb8799753b75aee8d2a21d7c14d9f38921b54b3dbda10f5a3c7a7b82dba5e2"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "icu_provider"
|
name = "icu_provider"
|
||||||
@@ -1471,9 +1471,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "indexmap"
|
name = "indexmap"
|
||||||
version = "2.8.0"
|
version = "2.9.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "3954d50fe15b02142bf25d3b8bdadb634ec3948f103d04ffe3031bc8fe9d7058"
|
checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"equivalent",
|
"equivalent",
|
||||||
"hashbrown 0.15.2",
|
"hashbrown 0.15.2",
|
||||||
@@ -1549,9 +1549,9 @@ checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "jiff"
|
name = "jiff"
|
||||||
version = "0.2.5"
|
version = "0.2.8"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "c102670231191d07d37a35af3eb77f1f0dbf7a71be51a962dcd57ea607be7260"
|
checksum = "e5ad87c89110f55e4cd4dc2893a9790820206729eaf221555f742d540b0724a0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"jiff-static",
|
"jiff-static",
|
||||||
"log",
|
"log",
|
||||||
@@ -1562,9 +1562,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "jiff-static"
|
name = "jiff-static"
|
||||||
version = "0.2.5"
|
version = "0.2.8"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "4cdde31a9d349f1b1f51a0b3714a5940ac022976f4b49485fc04be052b183b4c"
|
checksum = "d076d5b64a7e2fe6f0743f02c43ca4a6725c0f904203bfe276a5b3e793103605"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
@@ -1573,9 +1573,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "job_scheduler_ng"
|
name = "job_scheduler_ng"
|
||||||
version = "2.0.5"
|
version = "2.2.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "87c252207f323e2996d087759ebdcff8f608cd3eaa9896909a0c2dd3050a3c6a"
|
checksum = "b6d2655e8c656a1d51c0464ad9cfd19312e3f3ea61326d26a3400323a6cb9a28"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"chrono",
|
"chrono",
|
||||||
"cron",
|
"cron",
|
||||||
@@ -1638,7 +1638,7 @@ dependencies = [
|
|||||||
"idna",
|
"idna",
|
||||||
"mime",
|
"mime",
|
||||||
"native-tls",
|
"native-tls",
|
||||||
"nom 8.0.0",
|
"nom",
|
||||||
"percent-encoding",
|
"percent-encoding",
|
||||||
"quoted_printable",
|
"quoted_printable",
|
||||||
"socket2",
|
"socket2",
|
||||||
@@ -1648,9 +1648,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "libc"
|
name = "libc"
|
||||||
version = "0.2.171"
|
version = "0.2.172"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "c19937216e9d3aa9956d9bb8dfc0b0c8beb6058fc4f7a4dc4d850edf86a237d6"
|
checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "libm"
|
name = "libm"
|
||||||
@@ -1682,9 +1682,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "linux-raw-sys"
|
name = "linux-raw-sys"
|
||||||
version = "0.9.3"
|
version = "0.9.4"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "fe7db12097d22ec582439daf8618b8fdd1a7bef6270e9af3b1ebcd30893cf413"
|
checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "litemap"
|
name = "litemap"
|
||||||
@@ -1760,17 +1760,11 @@ version = "0.3.17"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
|
checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "minimal-lexical"
|
|
||||||
version = "0.2.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "miniz_oxide"
|
name = "miniz_oxide"
|
||||||
version = "0.8.5"
|
version = "0.8.8"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "8e3e04debbb59698c15bacbb6d93584a8c0ca9cc3213cb423d31f760d8843ce5"
|
checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"adler2",
|
"adler2",
|
||||||
]
|
]
|
||||||
@@ -1834,16 +1828,6 @@ dependencies = [
|
|||||||
"tempfile",
|
"tempfile",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "nom"
|
|
||||||
version = "7.1.3"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a"
|
|
||||||
dependencies = [
|
|
||||||
"memchr",
|
|
||||||
"minimal-lexical",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "nom"
|
name = "nom"
|
||||||
version = "8.0.0"
|
version = "8.0.0"
|
||||||
@@ -1965,9 +1949,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "once_cell"
|
name = "once_cell"
|
||||||
version = "1.21.1"
|
version = "1.21.3"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "d75b0bedcc4fe52caa0e03d9f1151a323e4aa5e2d78ba3580400cd3c9e2bc4bc"
|
checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "opaque-debug"
|
name = "opaque-debug"
|
||||||
@@ -1977,9 +1961,9 @@ checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "openssl"
|
name = "openssl"
|
||||||
version = "0.10.71"
|
version = "0.10.72"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "5e14130c6a98cd258fdcb0fb6d744152343ff729cbfcb28c656a9d12b999fbcd"
|
checksum = "fedfea7d58a1f73118430a55da6a286e7b044961736ce96a16a17068ea25e5da"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bitflags 2.9.0",
|
"bitflags 2.9.0",
|
||||||
"cfg-if",
|
"cfg-if",
|
||||||
@@ -2009,18 +1993,18 @@ checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "openssl-src"
|
name = "openssl-src"
|
||||||
version = "300.4.2+3.4.1"
|
version = "300.5.0+3.5.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "168ce4e058f975fe43e89d9ccf78ca668601887ae736090aacc23ae353c298e2"
|
checksum = "e8ce546f549326b0e6052b649198487d91320875da901e7bd11a06d1ee3f9c2f"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cc",
|
"cc",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "openssl-sys"
|
name = "openssl-sys"
|
||||||
version = "0.9.106"
|
version = "0.9.107"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "8bb61ea9811cc39e3c2069f40b8b8e2e70d8569b361f879786cc7ed48b777cdd"
|
checksum = "8288979acd84749c744a9014b4382d42b8f7b2592847b5afb2ed29e5d16ede07"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cc",
|
"cc",
|
||||||
"libc",
|
"libc",
|
||||||
@@ -2376,9 +2360,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "redox_syscall"
|
name = "redox_syscall"
|
||||||
version = "0.5.10"
|
version = "0.5.11"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "0b8c0c260b63a8219631167be35e6a988e9554dbd323f8bd08439c8ed1302bd1"
|
checksum = "d2f103c6d277498fbceb16e84d317e2a400f160f46904d5f5410848c829511a3"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bitflags 2.9.0",
|
"bitflags 2.9.0",
|
||||||
]
|
]
|
||||||
@@ -2610,9 +2594,9 @@ checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rustix"
|
name = "rustix"
|
||||||
version = "1.0.3"
|
version = "1.0.5"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "e56a18552996ac8d29ecc3b190b4fdbb2d91ca4ec396de7bbffaf43f3d637e96"
|
checksum = "d97817398dd4bb2e6da002002db259209759911da105da92bec29ccb12cf58bf"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bitflags 2.9.0",
|
"bitflags 2.9.0",
|
||||||
"errno",
|
"errno",
|
||||||
@@ -2623,9 +2607,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rustls"
|
name = "rustls"
|
||||||
version = "0.23.25"
|
version = "0.23.26"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "822ee9188ac4ec04a2f0531e55d035fb2de73f18b41a63c70c2712503b6fb13c"
|
checksum = "df51b5869f3a441595eac5e8ff14d486ff285f7b8c0df8770e49c3b56351f0f0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"log",
|
"log",
|
||||||
"once_cell",
|
"once_cell",
|
||||||
@@ -2863,18 +2847,18 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "smallvec"
|
name = "smallvec"
|
||||||
version = "1.14.0"
|
version = "1.15.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "7fcf8323ef1faaee30a44a340193b1ac6814fd9b7b4e88e9d4519a3e4abe1cfd"
|
checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"serde",
|
"serde",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "socket2"
|
name = "socket2"
|
||||||
version = "0.5.8"
|
version = "0.5.9"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8"
|
checksum = "4f5fd57c80058a56cf5c777ab8a126398ece8e442983605d280a44ce79d0edef"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"libc",
|
"libc",
|
||||||
"windows-sys 0.52.0",
|
"windows-sys 0.52.0",
|
||||||
@@ -2901,9 +2885,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "sqlx"
|
name = "sqlx"
|
||||||
version = "0.8.3"
|
version = "0.8.4"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "4410e73b3c0d8442c5f99b425d7a435b5ee0ae4167b3196771dd3f7a01be745f"
|
checksum = "14e22987355fbf8cfb813a0cf8cd97b1b4ec834b94dbd759a9e8679d41fabe83"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"sqlx-core",
|
"sqlx-core",
|
||||||
"sqlx-macros",
|
"sqlx-macros",
|
||||||
@@ -2914,10 +2898,11 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "sqlx-core"
|
name = "sqlx-core"
|
||||||
version = "0.8.3"
|
version = "0.8.4"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "6a007b6936676aa9ab40207cde35daab0a04b823be8ae004368c0793b96a61e0"
|
checksum = "55c4720d7d4cd3d5b00f61d03751c685ad09c33ae8290c8a2c11335e0604300b"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
"base64",
|
||||||
"bytes",
|
"bytes",
|
||||||
"chrono",
|
"chrono",
|
||||||
"crc",
|
"crc",
|
||||||
@@ -2936,7 +2921,6 @@ dependencies = [
|
|||||||
"once_cell",
|
"once_cell",
|
||||||
"percent-encoding",
|
"percent-encoding",
|
||||||
"rustls",
|
"rustls",
|
||||||
"rustls-pemfile",
|
|
||||||
"serde",
|
"serde",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
"sha2",
|
"sha2",
|
||||||
@@ -2951,9 +2935,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "sqlx-macros"
|
name = "sqlx-macros"
|
||||||
version = "0.8.3"
|
version = "0.8.4"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "3112e2ad78643fef903618d78cf0aec1cb3134b019730edb039b69eaf531f310"
|
checksum = "175147fcb75f353ac7675509bc58abb2cb291caf0fd24a3623b8f7e3eb0a754b"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
@@ -2964,9 +2948,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "sqlx-macros-core"
|
name = "sqlx-macros-core"
|
||||||
version = "0.8.3"
|
version = "0.8.4"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "4e9f90acc5ab146a99bf5061a7eb4976b573f560bc898ef3bf8435448dd5e7ad"
|
checksum = "1cde983058e53bfa75998e1982086c5efe3c370f3250bf0357e344fa3352e32b"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"dotenvy",
|
"dotenvy",
|
||||||
"either",
|
"either",
|
||||||
@@ -2990,9 +2974,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "sqlx-mysql"
|
name = "sqlx-mysql"
|
||||||
version = "0.8.3"
|
version = "0.8.4"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "4560278f0e00ce64938540546f59f590d60beee33fffbd3b9cd47851e5fff233"
|
checksum = "847d2e5393a4f39e47e4f36cab419709bc2b83cbe4223c60e86e1471655be333"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"atoi",
|
"atoi",
|
||||||
"base64",
|
"base64",
|
||||||
@@ -3033,9 +3017,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "sqlx-postgres"
|
name = "sqlx-postgres"
|
||||||
version = "0.8.3"
|
version = "0.8.4"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "c5b98a57f363ed6764d5b3a12bfedf62f07aa16e1856a7ddc2a0bb190a959613"
|
checksum = "cc35947a541b9e0a2e3d85da444f1c4137c13040267141b208395a0d0ca4659f"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"atoi",
|
"atoi",
|
||||||
"base64",
|
"base64",
|
||||||
@@ -3071,9 +3055,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "sqlx-sqlite"
|
name = "sqlx-sqlite"
|
||||||
version = "0.8.3"
|
version = "0.8.4"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "f85ca71d3a5b24e64e1d08dd8fe36c6c95c339a896cc33068148906784620540"
|
checksum = "6c48291dac4e5ed32da0927a0b981788be65674aeb62666d19873ab4289febde"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"atoi",
|
"atoi",
|
||||||
"chrono",
|
"chrono",
|
||||||
@@ -3089,6 +3073,7 @@ dependencies = [
|
|||||||
"serde",
|
"serde",
|
||||||
"serde_urlencoded",
|
"serde_urlencoded",
|
||||||
"sqlx-core",
|
"sqlx-core",
|
||||||
|
"thiserror",
|
||||||
"tracing",
|
"tracing",
|
||||||
"url",
|
"url",
|
||||||
]
|
]
|
||||||
@@ -3292,9 +3277,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tokio"
|
name = "tokio"
|
||||||
version = "1.44.1"
|
version = "1.44.2"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "f382da615b842244d4b8738c82ed1275e6c5dd90c459a30941cd07080b06c91a"
|
checksum = "e6b88822cbe49de4185e3a4cbf8321dd487cf5fe0c5c65695fef6346371e9c48"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"backtrace",
|
"backtrace",
|
||||||
"bytes",
|
"bytes",
|
||||||
@@ -3373,7 +3358,7 @@ dependencies = [
|
|||||||
"serde",
|
"serde",
|
||||||
"serde_spanned",
|
"serde_spanned",
|
||||||
"toml_datetime",
|
"toml_datetime",
|
||||||
"winnow",
|
"winnow 0.7.6",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -3839,22 +3824,38 @@ dependencies = [
|
|||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "windows"
|
name = "windows-core"
|
||||||
version = "0.52.0"
|
version = "0.61.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be"
|
checksum = "4763c1de310c86d75a878046489e2e5ba02c649d185f21c67d4cf8a56d098980"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"windows-core",
|
"windows-implement",
|
||||||
"windows-targets 0.52.6",
|
"windows-interface",
|
||||||
|
"windows-link",
|
||||||
|
"windows-result",
|
||||||
|
"windows-strings",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "windows-core"
|
name = "windows-implement"
|
||||||
version = "0.52.0"
|
version = "0.60.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9"
|
checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"windows-targets 0.52.6",
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"syn",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "windows-interface"
|
||||||
|
version = "0.59.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"syn",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -3863,6 +3864,24 @@ version = "0.1.1"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38"
|
checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "windows-result"
|
||||||
|
version = "0.3.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "c64fd11a4fd95df68efcfee5f44a294fe71b8bc6a91993e2791938abcc712252"
|
||||||
|
dependencies = [
|
||||||
|
"windows-link",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "windows-strings"
|
||||||
|
version = "0.4.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "7a2ba9642430ee452d5a7aa78d72907ebe8cfda358e8cb7918a2050581322f97"
|
||||||
|
dependencies = [
|
||||||
|
"windows-link",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "windows-sys"
|
name = "windows-sys"
|
||||||
version = "0.48.0"
|
version = "0.48.0"
|
||||||
@@ -4013,9 +4032,18 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "winnow"
|
name = "winnow"
|
||||||
version = "0.7.4"
|
version = "0.6.26"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "0e97b544156e9bebe1a0ffbc03484fc1ffe3100cbce3ffb17eac35f7cdd7ab36"
|
checksum = "1e90edd2ac1aa278a5c4599b1d89cf03074b610800f866d4026dc199d7929a28"
|
||||||
|
dependencies = [
|
||||||
|
"memchr",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "winnow"
|
||||||
|
version = "0.7.6"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "63d3fcd9bba44b03821e7d699eeee959f3126dcc4aa8e4ae18ec617c2a5cea10"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"memchr",
|
"memchr",
|
||||||
]
|
]
|
||||||
|
@@ -2,7 +2,7 @@
|
|||||||
secret_key = "/NtVGizglEoyoxBLzsRDWTy4oAG1qDw4J4O+CWJSv+fypD7W9sam8hUY4j90EZsbZk8wEradS5zBoWtWKi3k8w=="
|
secret_key = "/NtVGizglEoyoxBLzsRDWTy4oAG1qDw4J4O+CWJSv+fypD7W9sam8hUY4j90EZsbZk8wEradS5zBoWtWKi3k8w=="
|
||||||
rss_key = "rss-key-for-ci"
|
rss_key = "rss-key-for-ci"
|
||||||
limits = { file = "10 MiB", data-form = "10 MiB"}
|
limits = { file = "10 MiB", data-form = "10 MiB"}
|
||||||
smtp_pw = "8kIjlLH79Ky6D3j"
|
smtp_pw = "my-smtp-password"
|
||||||
usage_log_path = "./usage.txt"
|
usage_log_path = "./usage.txt"
|
||||||
openweathermap_key = "c8dab8f91b5b815d76e9879cbaecd8d5"
|
openweathermap_key = "openweather-key"
|
||||||
wordpress_key = "pw-to-allow-sending-notifications"
|
wordpress_key = "pw-to-allow-sending-notifications"
|
||||||
|
94
doc/nextcloud-notes.md
Normal file
94
doc/nextcloud-notes.md
Normal file
@@ -0,0 +1,94 @@
|
|||||||
|
# Nextcloud integration
|
||||||
|
|
||||||
|
- Based on [this plugin](https://github.com/nextcloud/user_external)
|
||||||
|
- Install that plugin via web
|
||||||
|
- Connect to server, enter nextcloud-docker-image: `docker exec -it nextcloud-aio-nextcloud bash`
|
||||||
|
- Adapt `/var/www/html/custom_apps/user_external/lib/BasicAuth.php` to switch from BasicAuth to RowtAuth:
|
||||||
|
```php
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Copyright (c) 2019 Lutz Freitag <lutz.freitag@gottliebtfreitag.de>
|
||||||
|
* This file is licensed under the Affero General Public License version 3 or
|
||||||
|
* later.
|
||||||
|
* See the COPYING-README file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace OCA\UserExternal;
|
||||||
|
|
||||||
|
class BasicAuth extends Base {
|
||||||
|
private $authUrl;
|
||||||
|
|
||||||
|
public function __construct($authUrl) {
|
||||||
|
parent::__construct($authUrl);
|
||||||
|
$this->authUrl = $authUrl;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if the password is correct without logging in the user
|
||||||
|
*
|
||||||
|
* @param string $uid The username
|
||||||
|
* @param string $password The password
|
||||||
|
*
|
||||||
|
* @return true/false
|
||||||
|
*/
|
||||||
|
public function checkPassword($uid, $password) {
|
||||||
|
// Prepare POST data with credentials
|
||||||
|
$postData = http_build_query([
|
||||||
|
'name' => $uid,
|
||||||
|
'password' => $password
|
||||||
|
]);
|
||||||
|
|
||||||
|
// Create context with POST method
|
||||||
|
$context = stream_context_create([
|
||||||
|
'http' => [
|
||||||
|
'method' => 'POST',
|
||||||
|
'header' => 'Content-Type: application/x-www-form-urlencoded',
|
||||||
|
'content' => $postData,
|
||||||
|
'follow_location' => 0
|
||||||
|
]
|
||||||
|
]);
|
||||||
|
|
||||||
|
// Get the content of the response
|
||||||
|
$content = @file_get_contents($this->authUrl, false, $context);
|
||||||
|
|
||||||
|
if ($content === false) {
|
||||||
|
\OC::$server->getLogger()->error(
|
||||||
|
'ERROR: Failed to get content from Auth Url: '.$this->authUrl,
|
||||||
|
['app' => 'user_external']
|
||||||
|
);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if the content is "SUCC"
|
||||||
|
if (trim($content) === "SUCC") {
|
||||||
|
$this->storeUser($uid);
|
||||||
|
return $uid;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
- In `/var/www/html/config/config.php` add this:
|
||||||
|
```
|
||||||
|
'user_backends' =>
|
||||||
|
array (
|
||||||
|
0 =>
|
||||||
|
array (
|
||||||
|
'class' => '\\OCA\\UserExternal\\BasicAuth',
|
||||||
|
'arguments' =>
|
||||||
|
array (
|
||||||
|
0 => 'https://app.rudernlinz.at/nxauth',
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
```
|
||||||
|
- In `/var/www/html/config/config.php` add this `'skeletondirectory' => '',` to disable default folders for new users
|
||||||
|
- To automatically add users to a group (e.g. `vorstand`), use the `Auto Groups` plugin
|
||||||
|
- Shared folders are not shared with new members due to [this bug](https://github.com/nextcloud/server/issues/25062#issuecomment-766445043)
|
||||||
|
- Find DB config: `docker exec nextcloud-aio-database env | grep POSTGRES`
|
||||||
|
- Workaround: Connect to docker-db: `docker exec -it nextcloud-aio-database bash`
|
||||||
|
- Connect to db: `psql -U nextcloud -d nextcloud_database`
|
||||||
|
- (with `\l` you see all dbs)
|
||||||
|
- Connect to nextcloud db: `\c nextcloud_database`
|
||||||
|
- Do query from issue: `UPDATE oc_share SET accepted = 1 WHERE share_type = 1;`
|
@@ -120,18 +120,69 @@ test.describe("cox can edit trips", () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
test("call off trip", async () => {
|
test("call off trip", async () => {
|
||||||
|
// Someone registers...
|
||||||
|
await sharedPage.goto("/auth/logout");
|
||||||
|
await sharedPage.goto("/auth");
|
||||||
|
await sharedPage.getByPlaceholder("Name").click();
|
||||||
|
await sharedPage.getByPlaceholder("Name").fill("rower");
|
||||||
|
await sharedPage.getByPlaceholder("Name").press("Tab");
|
||||||
|
await sharedPage.getByPlaceholder("Passwort").fill("rower");
|
||||||
|
await sharedPage.getByPlaceholder("Passwort").press("Enter");
|
||||||
|
|
||||||
await sharedPage.goto("/");
|
await sharedPage.goto("/");
|
||||||
|
await sharedPage.getByRole('link', { name: 'Mitrudern' }).nth(1).click();
|
||||||
|
|
||||||
|
|
||||||
|
// Login as cox again
|
||||||
|
await sharedPage.goto("/auth/logout");
|
||||||
|
await sharedPage.goto("/auth");
|
||||||
|
await sharedPage.getByPlaceholder("Name").click();
|
||||||
|
await sharedPage.getByPlaceholder("Name").fill("cox");
|
||||||
|
await sharedPage.getByPlaceholder("Name").press("Tab");
|
||||||
|
await sharedPage.getByPlaceholder("Passwort").fill("cox");
|
||||||
|
await sharedPage.getByPlaceholder("Passwort").press("Enter");
|
||||||
|
|
||||||
|
await sharedPage.goto("/");
|
||||||
|
|
||||||
|
|
||||||
|
// ... now I can cancel trip
|
||||||
await sharedPage.getByRole("link", { name: "Details" }).nth(1).click();
|
await sharedPage.getByRole("link", { name: "Details" }).nth(1).click();
|
||||||
await expect(sharedPage.locator("#sidebar")).toContainText(
|
await sharedPage.getByRole("button", { name: "Ausfahrt absagen" }).click();
|
||||||
"Freie Plätze: 3",
|
|
||||||
);
|
|
||||||
await sharedPage.getByRole("spinbutton").click();
|
|
||||||
await sharedPage.getByRole("spinbutton").fill("0");
|
|
||||||
await sharedPage.getByRole("button", { name: "Speichern" }).click();
|
|
||||||
await expect(sharedPage.locator("body")).toContainText(
|
await expect(sharedPage.locator("body")).toContainText(
|
||||||
"Ausfahrt erfolgreich aktualisiert.",
|
"Ausfahrt erfolgreich aktualisiert.",
|
||||||
);
|
);
|
||||||
await expect(sharedPage.locator("body")).toContainText("(Absage cox)");
|
await expect(sharedPage.locator("body")).toContainText("(Absage cox)");
|
||||||
|
|
||||||
|
|
||||||
|
// Done with the test -> cancel the cancellation of the trip, otherwise the afterAll function below fails
|
||||||
|
await sharedPage.getByRole("link", { name: "Details" }).nth(1).click();
|
||||||
|
await sharedPage.getByRole("spinbutton").click();
|
||||||
|
await sharedPage.getByRole("spinbutton").fill("3");
|
||||||
|
await sharedPage.getByRole("button", { name: "Speichern" }).click();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// deregistering
|
||||||
|
await sharedPage.goto("/auth/logout");
|
||||||
|
await sharedPage.goto("/auth");
|
||||||
|
await sharedPage.getByPlaceholder("Name").click();
|
||||||
|
await sharedPage.getByPlaceholder("Name").fill("rower");
|
||||||
|
await sharedPage.getByPlaceholder("Name").press("Tab");
|
||||||
|
await sharedPage.getByPlaceholder("Passwort").fill("rower");
|
||||||
|
await sharedPage.getByPlaceholder("Passwort").press("Enter");
|
||||||
|
|
||||||
|
await sharedPage.goto("/");
|
||||||
|
await sharedPage.getByRole('link', { name: 'Abmelden' }).click();
|
||||||
|
|
||||||
|
|
||||||
|
// now cox can delete trip again in afterAll
|
||||||
|
await sharedPage.goto("/auth/logout");
|
||||||
|
await sharedPage.goto("/auth");
|
||||||
|
await sharedPage.getByPlaceholder("Name").click();
|
||||||
|
await sharedPage.getByPlaceholder("Name").fill("cox");
|
||||||
|
await sharedPage.getByPlaceholder("Name").press("Tab");
|
||||||
|
await sharedPage.getByPlaceholder("Passwort").fill("cox");
|
||||||
|
await sharedPage.getByPlaceholder("Passwort").press("Enter");
|
||||||
});
|
});
|
||||||
|
|
||||||
test.afterAll(async () => {
|
test.afterAll(async () => {
|
||||||
|
@@ -1,8 +1,8 @@
|
|||||||
use std::io::Write;
|
use std::io::Write;
|
||||||
|
|
||||||
use chrono::NaiveDate;
|
use chrono::{Duration, NaiveDate, NaiveTime};
|
||||||
use ics::{
|
use ics::{
|
||||||
properties::{DtStart, Summary},
|
properties::{DtEnd, DtStart, Summary},
|
||||||
ICalendar,
|
ICalendar,
|
||||||
};
|
};
|
||||||
use serde::Serialize;
|
use serde::Serialize;
|
||||||
@@ -11,7 +11,6 @@ use sqlx::{FromRow, Row, SqlitePool};
|
|||||||
use super::{
|
use super::{
|
||||||
log::Log,
|
log::Log,
|
||||||
notification::Notification,
|
notification::Notification,
|
||||||
role::Role,
|
|
||||||
tripdetails::TripDetails,
|
tripdetails::TripDetails,
|
||||||
triptype::TripType,
|
triptype::TripType,
|
||||||
user::{EventUser, User},
|
user::{EventUser, User},
|
||||||
@@ -34,11 +33,13 @@ pub struct Event {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Serialize, Debug)]
|
#[derive(Serialize, Debug)]
|
||||||
pub struct EventWithUserAndTriptype {
|
pub struct EventWithDetails {
|
||||||
#[serde(flatten)]
|
#[serde(flatten)]
|
||||||
pub event: Event,
|
pub event: Event,
|
||||||
trip_type: Option<TripType>,
|
trip_type: Option<TripType>,
|
||||||
|
tripdetails: TripDetails,
|
||||||
cox_needed: bool,
|
cox_needed: bool,
|
||||||
|
cancelled: bool,
|
||||||
cox: Vec<Registration>,
|
cox: Vec<Registration>,
|
||||||
rower: Vec<Registration>,
|
rower: Vec<Registration>,
|
||||||
}
|
}
|
||||||
@@ -116,6 +117,12 @@ pub struct EventUpdate<'a> {
|
|||||||
pub trip_type_id: Option<i64>,
|
pub trip_type_id: Option<i64>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl EventUpdate<'_> {
|
||||||
|
fn cancelled(&self) -> bool {
|
||||||
|
self.max_people == -1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl Event {
|
impl Event {
|
||||||
pub async fn find_by_id(db: &SqlitePool, id: i64) -> Option<Self> {
|
pub async fn find_by_id(db: &SqlitePool, id: i64) -> Option<Self> {
|
||||||
sqlx::query_as!(
|
sqlx::query_as!(
|
||||||
@@ -134,16 +141,13 @@ WHERE planned_event.id like ?
|
|||||||
.ok()
|
.ok()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn get_pinned_for_day(
|
pub async fn get_pinned_for_day(db: &SqlitePool, day: NaiveDate) -> Vec<EventWithDetails> {
|
||||||
db: &SqlitePool,
|
|
||||||
day: NaiveDate,
|
|
||||||
) -> Vec<EventWithUserAndTriptype> {
|
|
||||||
let mut events = Self::get_for_day(db, day).await;
|
let mut events = Self::get_for_day(db, day).await;
|
||||||
events.retain(|e| e.event.always_show);
|
events.retain(|e| e.event.always_show);
|
||||||
events
|
events
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn get_for_day(db: &SqlitePool, day: NaiveDate) -> Vec<EventWithUserAndTriptype> {
|
pub async fn get_for_day(db: &SqlitePool, day: NaiveDate) -> Vec<EventWithDetails> {
|
||||||
let day = format!("{day}");
|
let day = format!("{day}");
|
||||||
let events = sqlx::query_as!(
|
let events = sqlx::query_as!(
|
||||||
Event,
|
Event,
|
||||||
@@ -164,10 +168,15 @@ WHERE day=?",
|
|||||||
if let Some(trip_type_id) = event.trip_type_id {
|
if let Some(trip_type_id) = event.trip_type_id {
|
||||||
trip_type = TripType::find_by_id(db, trip_type_id).await;
|
trip_type = TripType::find_by_id(db, trip_type_id).await;
|
||||||
}
|
}
|
||||||
ret.push(EventWithUserAndTriptype {
|
let tripdetails = TripDetails::find_by_id(db, event.trip_details_id)
|
||||||
|
.await
|
||||||
|
.expect("db constraints");
|
||||||
|
ret.push(EventWithDetails {
|
||||||
cox_needed: event.planned_amount_cox > cox.len() as i64,
|
cox_needed: event.planned_amount_cox > cox.len() as i64,
|
||||||
cox,
|
cox,
|
||||||
rower: Registration::all_rower(db, event.trip_details_id).await,
|
rower: Registration::all_rower(db, event.trip_details_id).await,
|
||||||
|
cancelled: tripdetails.cancelled(),
|
||||||
|
tripdetails,
|
||||||
event,
|
event,
|
||||||
trip_type,
|
trip_type,
|
||||||
});
|
});
|
||||||
@@ -191,7 +200,8 @@ INNER JOIN trip_details ON planned_event.trip_details_id = trip_details.id",
|
|||||||
let mut ret = Vec::new();
|
let mut ret = Vec::new();
|
||||||
let events = Self::all(db).await;
|
let events = Self::all(db).await;
|
||||||
for event in events {
|
for event in events {
|
||||||
if event.is_rower_registered(db, user).await {
|
if event.is_rower_registered(db, user).await || event.is_cox_registered(db, user).await
|
||||||
|
{
|
||||||
ret.push(event);
|
ret.push(event);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -215,6 +225,21 @@ INNER JOIN trip_details ON planned_event.trip_details_id = trip_details.id",
|
|||||||
is_rower.amount > 0
|
is_rower.amount > 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub async fn is_cox_registered(&self, db: &SqlitePool, user: &User) -> bool {
|
||||||
|
let is_rower = sqlx::query!(
|
||||||
|
"SELECT count(*) as amount
|
||||||
|
FROM trip
|
||||||
|
WHERE planned_event_id = ?
|
||||||
|
AND cox_id = ?",
|
||||||
|
self.id,
|
||||||
|
user.id
|
||||||
|
)
|
||||||
|
.fetch_one(db)
|
||||||
|
.await
|
||||||
|
.unwrap(); //Okay, bc planned_event can only be created with proper DB backing
|
||||||
|
is_rower.amount > 0
|
||||||
|
}
|
||||||
|
|
||||||
pub async fn find_by_trip_details(db: &SqlitePool, tripdetails_id: i64) -> Option<Self> {
|
pub async fn find_by_trip_details(db: &SqlitePool, tripdetails_id: i64) -> Option<Self> {
|
||||||
sqlx::query_as!(
|
sqlx::query_as!(
|
||||||
Self,
|
Self,
|
||||||
@@ -297,7 +322,7 @@ WHERE trip_details.id=?
|
|||||||
.unwrap(); //Okay, as planned_event can only be created with proper DB backing
|
.unwrap(); //Okay, as planned_event can only be created with proper DB backing
|
||||||
|
|
||||||
let tripdetails = self.trip_details(db).await;
|
let tripdetails = self.trip_details(db).await;
|
||||||
let was_already_cancelled = tripdetails.max_people == 0;
|
let was_already_cancelled = tripdetails.cancelled();
|
||||||
|
|
||||||
sqlx::query!(
|
sqlx::query!(
|
||||||
"UPDATE trip_details SET max_people = ?, notes = ?, always_show = ?, is_locked = ?, trip_type_id = ? WHERE id = ?",
|
"UPDATE trip_details SET max_people = ?, notes = ?, always_show = ?, is_locked = ?, trip_type_id = ? WHERE id = ?",
|
||||||
@@ -322,7 +347,7 @@ WHERE trip_details.id=?
|
|||||||
.await;
|
.await;
|
||||||
}
|
}
|
||||||
|
|
||||||
if update.max_people == 0 && !was_already_cancelled {
|
if update.cancelled() && !was_already_cancelled {
|
||||||
let coxes = Registration::all_cox(db, self.id).await;
|
let coxes = Registration::all_cox(db, self.id).await;
|
||||||
for user in coxes {
|
for user in coxes {
|
||||||
if let Some(user) = User::find_by_name(db, &user.name).await {
|
if let Some(user) = User::find_by_name(db, &user.name).await {
|
||||||
@@ -371,7 +396,7 @@ WHERE trip_details.id=?
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if update.max_people > 0 && was_already_cancelled {
|
if !update.cancelled() && was_already_cancelled {
|
||||||
Notification::delete_by_action(
|
Notification::delete_by_action(
|
||||||
db,
|
db,
|
||||||
&format!("remove_user_trip_with_trip_details_id:{}", tripdetails.id),
|
&format!("remove_user_trip_with_trip_details_id:{}", tripdetails.id),
|
||||||
@@ -409,7 +434,7 @@ WHERE trip_details.id=?
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn is_cancelled(&self) -> bool {
|
pub fn is_cancelled(&self) -> bool {
|
||||||
self.max_people == 0
|
self.max_people == -1
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn get_ics_feed(db: &SqlitePool) -> String {
|
pub async fn get_ics_feed(db: &SqlitePool) -> String {
|
||||||
@@ -425,12 +450,32 @@ WHERE trip_details.id=?
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) async fn get_vevent(self, db: &SqlitePool) -> ics::Event {
|
pub(crate) async fn get_vevent(self, db: &SqlitePool) -> ics::Event {
|
||||||
let mut vevent = ics::Event::new(format!("{}@ruad.at", self.id), "19900101T180000");
|
let mut vevent = ics::Event::new(format!("event-{}@ruad.at", self.id), "19900101T180000");
|
||||||
|
let time_str = self.planned_starting_time.replace(':', "");
|
||||||
|
let formatted_time = if time_str.len() == 3 {
|
||||||
|
format!("0{}", time_str)
|
||||||
|
} else {
|
||||||
|
time_str.clone() // TODO: remove again
|
||||||
|
};
|
||||||
vevent.push(DtStart::new(format!(
|
vevent.push(DtStart::new(format!(
|
||||||
"{}T{}00",
|
"{}T{}00",
|
||||||
self.day.replace('-', ""),
|
self.day.replace('-', ""),
|
||||||
self.planned_starting_time.replace(':', "")
|
formatted_time
|
||||||
)));
|
)));
|
||||||
|
|
||||||
|
let original_time = NaiveTime::parse_from_str(&self.planned_starting_time, "%H:%M")
|
||||||
|
.expect("Failed to parse time");
|
||||||
|
let later_time = original_time + Duration::hours(3);
|
||||||
|
if later_time > original_time {
|
||||||
|
// Check if no day-overflow
|
||||||
|
let time_three_hours_later = later_time.format("%H%M").to_string();
|
||||||
|
vevent.push(DtEnd::new(format!(
|
||||||
|
"{}T{}00",
|
||||||
|
self.day.replace('-', ""),
|
||||||
|
time_three_hours_later
|
||||||
|
)));
|
||||||
|
}
|
||||||
|
|
||||||
let tripdetails = self.trip_details(db).await;
|
let tripdetails = self.trip_details(db).await;
|
||||||
let mut name = String::new();
|
let mut name = String::new();
|
||||||
if self.is_cancelled() {
|
if self.is_cancelled() {
|
||||||
@@ -513,6 +558,6 @@ mod test {
|
|||||||
|
|
||||||
let today = Local::now().date_naive().format("%Y%m%d").to_string();
|
let today = Local::now().date_naive().format("%Y%m%d").to_string();
|
||||||
let actual = Event::get_ics_feed(&pool).await;
|
let actual = Event::get_ics_feed(&pool).await;
|
||||||
assert_eq!(format!("BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:ics-rs\r\nBEGIN:VEVENT\r\nUID:1@ruad.at\r\nDTSTAMP:19900101T180000\r\nDTSTART:{today}T100000\r\nSUMMARY:test-planned-event \r\nEND:VEVENT\r\nEND:VCALENDAR\r\n"), actual);
|
assert_eq!(format!("BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:ics-rs\r\nBEGIN:VEVENT\r\nUID:event-1@ruad.at\r\nDTSTAMP:19900101T180000\r\nDTSTART:{today}T100000\r\nDTEND:{today}T130000\r\nSUMMARY:test-planned-event \r\nEND:VEVENT\r\nEND:VCALENDAR\r\n"), actual);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -6,8 +6,8 @@ use waterlevel::WaterlevelDay;
|
|||||||
use crate::AMOUNT_DAYS_TO_SHOW_TRIPS_AHEAD;
|
use crate::AMOUNT_DAYS_TO_SHOW_TRIPS_AHEAD;
|
||||||
|
|
||||||
use self::{
|
use self::{
|
||||||
event::{Event, EventWithUserAndTriptype},
|
event::{Event, EventWithDetails},
|
||||||
trip::{Trip, TripWithUserAndType},
|
trip::{Trip, TripWithDetails},
|
||||||
waterlevel::Waterlevel,
|
waterlevel::Waterlevel,
|
||||||
weather::Weather,
|
weather::Weather,
|
||||||
};
|
};
|
||||||
@@ -28,8 +28,8 @@ pub mod weather;
|
|||||||
#[derive(Serialize, Debug)]
|
#[derive(Serialize, Debug)]
|
||||||
pub struct Day {
|
pub struct Day {
|
||||||
day: NaiveDate,
|
day: NaiveDate,
|
||||||
events: Vec<EventWithUserAndTriptype>,
|
events: Vec<EventWithDetails>,
|
||||||
trips: Vec<TripWithUserAndType>,
|
trips: Vec<TripWithDetails>,
|
||||||
is_pinned: bool,
|
is_pinned: bool,
|
||||||
regular_sees_this_day: bool,
|
regular_sees_this_day: bool,
|
||||||
max_waterlevel: Option<WaterlevelDay>,
|
max_waterlevel: Option<WaterlevelDay>,
|
||||||
|
@@ -284,7 +284,7 @@ mod test {
|
|||||||
let cancel_update = EventUpdate {
|
let cancel_update = EventUpdate {
|
||||||
name: &event.name,
|
name: &event.name,
|
||||||
planned_amount_cox: event.planned_amount_cox as i32,
|
planned_amount_cox: event.planned_amount_cox as i32,
|
||||||
max_people: 0,
|
max_people: -1,
|
||||||
notes: event.notes.as_deref(),
|
notes: event.notes.as_deref(),
|
||||||
always_show: event.always_show,
|
always_show: event.always_show,
|
||||||
is_locked: event.is_locked,
|
is_locked: event.is_locked,
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
use chrono::{Local, NaiveDate};
|
use chrono::{Duration, Local, NaiveDate, NaiveTime};
|
||||||
use ics::properties::{DtStart, Summary};
|
use ics::properties::{DtEnd, DtStart, Summary};
|
||||||
use serde::Serialize;
|
use serde::Serialize;
|
||||||
use sqlx::SqlitePool;
|
use sqlx::SqlitePool;
|
||||||
|
|
||||||
@@ -30,11 +30,12 @@ pub struct Trip {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Serialize, Debug)]
|
#[derive(Serialize, Debug)]
|
||||||
pub struct TripWithUserAndType {
|
pub struct TripWithDetails {
|
||||||
#[serde(flatten)]
|
#[serde(flatten)]
|
||||||
pub trip: Trip,
|
pub trip: Trip,
|
||||||
pub rower: Vec<Registration>,
|
pub rower: Vec<Registration>,
|
||||||
trip_type: Option<TripType>,
|
trip_type: Option<TripType>,
|
||||||
|
cancelled: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct TripUpdate<'a> {
|
pub struct TripUpdate<'a> {
|
||||||
@@ -46,7 +47,13 @@ pub struct TripUpdate<'a> {
|
|||||||
pub is_locked: bool,
|
pub is_locked: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl TripWithUserAndType {
|
impl<'a> TripUpdate<'a> {
|
||||||
|
fn cancelled(&self) -> bool {
|
||||||
|
self.max_people == -1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl TripWithDetails {
|
||||||
pub async fn from(db: &SqlitePool, trip: Trip) -> Self {
|
pub async fn from(db: &SqlitePool, trip: Trip) -> Self {
|
||||||
let mut trip_type = None;
|
let mut trip_type = None;
|
||||||
if let Some(trip_type_id) = trip.trip_type_id {
|
if let Some(trip_type_id) = trip.trip_type_id {
|
||||||
@@ -54,8 +61,9 @@ impl TripWithUserAndType {
|
|||||||
}
|
}
|
||||||
Self {
|
Self {
|
||||||
rower: Registration::all_rower(db, trip.trip_details_id.unwrap()).await,
|
rower: Registration::all_rower(db, trip.trip_details_id.unwrap()).await,
|
||||||
trip,
|
|
||||||
trip_type,
|
trip_type,
|
||||||
|
cancelled: trip.is_cancelled(),
|
||||||
|
trip,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -128,12 +136,33 @@ WHERE trip_details.id=?
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) async fn get_vevent(self, user: &User) -> ics::Event {
|
pub(crate) async fn get_vevent(self, user: &User) -> ics::Event {
|
||||||
let mut vevent = ics::Event::new(format!("{}@ruad.at", self.id), "19900101T180000");
|
let mut vevent = ics::Event::new(format!("trip-{}@ruad.at", self.id), "19900101T180000");
|
||||||
|
let time_str = self.planned_starting_time.replace(':', "");
|
||||||
|
let formatted_time = if time_str.len() == 3 {
|
||||||
|
format!("0{}", time_str)
|
||||||
|
} else {
|
||||||
|
time_str
|
||||||
|
};
|
||||||
|
|
||||||
vevent.push(DtStart::new(format!(
|
vevent.push(DtStart::new(format!(
|
||||||
"{}T{}00",
|
"{}T{}00",
|
||||||
self.day.replace('-', ""),
|
self.day.replace('-', ""),
|
||||||
self.planned_starting_time.replace(':', "")
|
formatted_time
|
||||||
)));
|
)));
|
||||||
|
|
||||||
|
let original_time = NaiveTime::parse_from_str(&self.planned_starting_time, "%H:%M")
|
||||||
|
.expect("Failed to parse time");
|
||||||
|
let later_time = original_time + Duration::hours(3);
|
||||||
|
if later_time > original_time {
|
||||||
|
// Check if no day-overflow
|
||||||
|
let time_three_hours_later = later_time.format("%H%M").to_string();
|
||||||
|
vevent.push(DtEnd::new(format!(
|
||||||
|
"{}T{}00",
|
||||||
|
self.day.replace('-', ""),
|
||||||
|
time_three_hours_later
|
||||||
|
)));
|
||||||
|
}
|
||||||
|
|
||||||
let mut name = String::new();
|
let mut name = String::new();
|
||||||
if self.is_cancelled() {
|
if self.is_cancelled() {
|
||||||
name.push_str("ABGESAGT");
|
name.push_str("ABGESAGT");
|
||||||
@@ -220,7 +249,7 @@ WHERE trip.id=?
|
|||||||
return Err(CoxHelpError::DetailsLocked);
|
return Err(CoxHelpError::DetailsLocked);
|
||||||
}
|
}
|
||||||
|
|
||||||
if event.max_people == 0 {
|
if event.is_cancelled() {
|
||||||
return Err(CoxHelpError::CanceledEvent);
|
return Err(CoxHelpError::CanceledEvent);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -237,12 +266,12 @@ WHERE trip.id=?
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn get_for_today(db: &SqlitePool) -> Vec<TripWithUserAndType> {
|
pub async fn get_for_today(db: &SqlitePool) -> Vec<TripWithDetails> {
|
||||||
let today = Local::now().date_naive();
|
let today = Local::now().date_naive();
|
||||||
Self::get_for_day(db, today).await
|
Self::get_for_day(db, today).await
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn get_for_day(db: &SqlitePool, day: NaiveDate) -> Vec<TripWithUserAndType> {
|
pub async fn get_for_day(db: &SqlitePool, day: NaiveDate) -> Vec<TripWithDetails> {
|
||||||
let day = format!("{day}");
|
let day = format!("{day}");
|
||||||
let trips = sqlx::query_as!(
|
let trips = sqlx::query_as!(
|
||||||
Trip,
|
Trip,
|
||||||
@@ -261,7 +290,7 @@ WHERE day=?
|
|||||||
|
|
||||||
let mut ret = Vec::new();
|
let mut ret = Vec::new();
|
||||||
for trip in trips {
|
for trip in trips {
|
||||||
ret.push(TripWithUserAndType::from(db, trip).await);
|
ret.push(TripWithDetails::from(db, trip).await);
|
||||||
}
|
}
|
||||||
ret
|
ret
|
||||||
}
|
}
|
||||||
@@ -284,9 +313,9 @@ WHERE day=?
|
|||||||
};
|
};
|
||||||
|
|
||||||
let tripdetails = TripDetails::find_by_id(db, trip_details_id).await.unwrap();
|
let tripdetails = TripDetails::find_by_id(db, trip_details_id).await.unwrap();
|
||||||
let was_already_cancelled = tripdetails.max_people == 0;
|
let was_already_cancelled = tripdetails.cancelled();
|
||||||
|
|
||||||
let is_locked = if update.max_people == 0 {
|
let is_locked = if update.cancelled() {
|
||||||
false
|
false
|
||||||
} else {
|
} else {
|
||||||
update.is_locked
|
update.is_locked
|
||||||
@@ -304,10 +333,8 @@ WHERE day=?
|
|||||||
.await
|
.await
|
||||||
.unwrap(); //Okay, as trip_details can only be created with proper DB backing
|
.unwrap(); //Okay, as trip_details can only be created with proper DB backing
|
||||||
|
|
||||||
if update.max_people == 0 && !was_already_cancelled {
|
if update.cancelled() && !was_already_cancelled {
|
||||||
let rowers = TripWithUserAndType::from(db, update.trip.clone())
|
let rowers = TripWithDetails::from(db, update.trip.clone()).await.rower;
|
||||||
.await
|
|
||||||
.rower;
|
|
||||||
for user in rowers {
|
for user in rowers {
|
||||||
if let Some(user) = User::find_by_name(db, &user.name).await {
|
if let Some(user) = User::find_by_name(db, &user.name).await {
|
||||||
let notes = match update.notes {
|
let notes = match update.notes {
|
||||||
@@ -343,7 +370,7 @@ WHERE day=?
|
|||||||
.await;
|
.await;
|
||||||
}
|
}
|
||||||
|
|
||||||
if update.max_people > 0 && was_already_cancelled {
|
if !update.cancelled() && was_already_cancelled {
|
||||||
Notification::delete_by_action(
|
Notification::delete_by_action(
|
||||||
db,
|
db,
|
||||||
&format!("remove_user_trip_with_trip_details_id:{}", trip_details_id),
|
&format!("remove_user_trip_with_trip_details_id:{}", trip_details_id),
|
||||||
@@ -431,14 +458,14 @@ WHERE day=?
|
|||||||
pub(crate) async fn get_pinned_for_day(
|
pub(crate) async fn get_pinned_for_day(
|
||||||
db: &sqlx::Pool<sqlx::Sqlite>,
|
db: &sqlx::Pool<sqlx::Sqlite>,
|
||||||
day: NaiveDate,
|
day: NaiveDate,
|
||||||
) -> Vec<TripWithUserAndType> {
|
) -> Vec<TripWithDetails> {
|
||||||
let mut trips = Self::get_for_day(db, day).await;
|
let mut trips = Self::get_for_day(db, day).await;
|
||||||
trips.retain(|e| e.trip.always_show);
|
trips.retain(|e| e.trip.always_show);
|
||||||
trips
|
trips
|
||||||
}
|
}
|
||||||
|
|
||||||
fn is_cancelled(&self) -> bool {
|
fn is_cancelled(&self) -> bool {
|
||||||
self.max_people == 0
|
self.max_people == -1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -6,7 +6,7 @@ use sqlx::{FromRow, SqlitePool};
|
|||||||
|
|
||||||
use super::{
|
use super::{
|
||||||
notification::Notification,
|
notification::Notification,
|
||||||
trip::{Trip, TripWithUserAndType},
|
trip::{Trip, TripWithDetails},
|
||||||
triptype::TripType,
|
triptype::TripType,
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -95,7 +95,7 @@ WHERE day = ? AND planned_starting_time = ?
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn cancelled(&self) -> bool {
|
pub fn cancelled(&self) -> bool {
|
||||||
self.max_people == 0
|
self.max_people == -1
|
||||||
}
|
}
|
||||||
|
|
||||||
/// This function is called when a person registers to a trip or when the cox changes the
|
/// This function is called when a person registers to a trip or when the cox changes the
|
||||||
@@ -138,7 +138,7 @@ WHERE day = ? AND planned_starting_time = ?
|
|||||||
// This trip_details belongs to a planned_event, no need to do anything
|
// This trip_details belongs to a planned_event, no need to do anything
|
||||||
continue;
|
continue;
|
||||||
};
|
};
|
||||||
let pot_coxes = TripWithUserAndType::from(db, trip.clone()).await;
|
let pot_coxes = TripWithDetails::from(db, trip.clone()).await;
|
||||||
let pot_coxes = pot_coxes.rower;
|
let pot_coxes = pot_coxes.rower;
|
||||||
for user in pot_coxes {
|
for user in pot_coxes {
|
||||||
let cox = User::find_by_id(db, trip.cox_id as i32).await.unwrap();
|
let cox = User::find_by_id(db, trip.cox_id as i32).await.unwrap();
|
||||||
@@ -196,7 +196,7 @@ WHERE day = ? AND planned_starting_time = ?
|
|||||||
.fetch_one(db)
|
.fetch_one(db)
|
||||||
.await
|
.await
|
||||||
.unwrap(); //TODO: fixme
|
.unwrap(); //TODO: fixme
|
||||||
let amount_currently_registered = i64::from(amount_currently_registered.count);
|
let amount_currently_registered = amount_currently_registered.count;
|
||||||
|
|
||||||
amount_currently_registered >= self.max_people
|
amount_currently_registered >= self.max_people
|
||||||
}
|
}
|
||||||
|
@@ -3,7 +3,7 @@ use sqlx::{FromRow, SqlitePool};
|
|||||||
|
|
||||||
use super::{
|
use super::{
|
||||||
notification::Notification,
|
notification::Notification,
|
||||||
trip::{Trip, TripWithUserAndType},
|
trip::{Trip, TripWithDetails},
|
||||||
tripdetails::TripDetails,
|
tripdetails::TripDetails,
|
||||||
user::{SteeringUser, User},
|
user::{SteeringUser, User},
|
||||||
};
|
};
|
||||||
@@ -158,7 +158,7 @@ impl UserTrip {
|
|||||||
.unwrap()
|
.unwrap()
|
||||||
.cancelled()
|
.cancelled()
|
||||||
{
|
{
|
||||||
let trip = TripWithUserAndType::from(db, trip.clone()).await;
|
let trip = TripWithDetails::from(db, trip.clone()).await;
|
||||||
if trip.rower.len() == 1 {
|
if trip.rower.len() == 1 {
|
||||||
trip_to_delete = Some(trip.trip);
|
trip_to_delete = Some(trip.trip);
|
||||||
}
|
}
|
||||||
|
@@ -71,7 +71,6 @@ async fn steering(db: &State<SqlitePool>, user: User, flash: Option<FlashMessage
|
|||||||
fn unauthorized_error(req: &Request) -> Redirect {
|
fn unauthorized_error(req: &Request) -> Redirect {
|
||||||
// Save the URL the user tried to access, to be able to go there once logged in
|
// Save the URL the user tried to access, to be able to go there once logged in
|
||||||
let mut redirect_cookie = Cookie::new("redirect_url", format!("{}", req.uri()));
|
let mut redirect_cookie = Cookie::new("redirect_url", format!("{}", req.uri()));
|
||||||
println!("{}", req.uri());
|
|
||||||
redirect_cookie.set_expires(OffsetDateTime::now_utc() + Duration::hours(1));
|
redirect_cookie.set_expires(OffsetDateTime::now_utc() + Duration::hours(1));
|
||||||
req.cookies().add_private(redirect_cookie);
|
req.cookies().add_private(redirect_cookie);
|
||||||
|
|
||||||
|
@@ -20,10 +20,10 @@
|
|||||||
<li>
|
<li>
|
||||||
<a class="break-all underline" href="/cal"><strong>Alle Events</strong></a>
|
<a class="break-all underline" href="/cal"><strong>Alle Events</strong></a>
|
||||||
<br />
|
<br />
|
||||||
<small>Beachte, dass dieser Kalender keine Ausfahrten enthält, die von einzelnen Steuerpersonen augeschrieben werden. Dieser Kalender auf der Vereinswebsite verwendet werden, wo zB keine persönlichen Daten (Namen etc.) veröffentlicht werden soll.</small>
|
<small>Beachte, dass dieser Kalender keine Ausfahrten enthält, die von einzelnen Steuerpersonen augeschrieben werden. Dieser Kalender kann zB auf der Vereinswebsite verwendet werden, wo keine persönlichen Daten (Namen etc.) veröffentlicht werden sollen.</small>
|
||||||
</li>
|
</li>
|
||||||
</ol>
|
</ol>
|
||||||
Du kannst die Kalender einfach in deinen Kalender als "externen Kalender" synchronisieren. Die genauen Schritte hängen von deiner verwendeten Software ab.
|
Du kannst die Kalender einfach in deinen Kalender als <q>externen Kalender</q> synchronisieren. Die genauen Schritte hängen von deiner verwendeten Software ab.
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@@ -51,7 +51,7 @@
|
|||||||
{% if event.always_show and not day.regular_sees_this_day %}
|
{% if event.always_show and not day.regular_sees_this_day %}
|
||||||
<span title="Du siehst diese Ausfahrt schon, obwohl sie mehr als {{ amount_days_to_show_trips_ahead }} Tage in der Zukunft liegt. Du Magier!">🔮</span>
|
<span title="Du siehst diese Ausfahrt schon, obwohl sie mehr als {{ amount_days_to_show_trips_ahead }} Tage in der Zukunft liegt. Du Magier!">🔮</span>
|
||||||
{% endif -%}
|
{% endif -%}
|
||||||
{%- if event.max_people == 0 %}
|
{%- if event.cancelled %}
|
||||||
<strong class="text-[#f43f5e]">⚠ Absage
|
<strong class="text-[#f43f5e]">⚠ Absage
|
||||||
{{ event.planned_starting_time }}
|
{{ event.planned_starting_time }}
|
||||||
Uhr
|
Uhr
|
||||||
@@ -129,7 +129,7 @@
|
|||||||
<div id="event{{ event.trip_details_id }}">
|
<div id="event{{ event.trip_details_id }}">
|
||||||
{# --- START List Coxes --- #}
|
{# --- START List Coxes --- #}
|
||||||
{% if event.planned_amount_cox > 0 %}
|
{% if event.planned_amount_cox > 0 %}
|
||||||
{% if event.max_people == 0 %}
|
{% if event.cancelled %}
|
||||||
{{ macros::box(participants=event.cox, empty_seats="", header='Absage', bg='[#f43f5e]') }}
|
{{ macros::box(participants=event.cox, empty_seats="", header='Absage', bg='[#f43f5e]') }}
|
||||||
{% else %}
|
{% else %}
|
||||||
{% if amount_cox_missing > 0 %}
|
{% if amount_cox_missing > 0 %}
|
||||||
@@ -142,9 +142,9 @@
|
|||||||
{# --- END List Coxes --- #}
|
{# --- END List Coxes --- #}
|
||||||
{# --- START List Rowers --- #}
|
{# --- START List Rowers --- #}
|
||||||
{% set amount_cur_rower = event.rower | length %}
|
{% set amount_cur_rower = event.rower | length %}
|
||||||
{% if event.max_people == 0 %}
|
{% if event.cancelled %}
|
||||||
{{ macros::box(header='Absage', bg='[#f43f5e]', participants=event.rower, trip_details_id=event.trip_details_id, allow_removing="manage_events" in loggedin_user.roles) }}
|
{{ macros::box(header='Absage', bg='[#f43f5e]', participants=event.rower, trip_details_id=event.trip_details_id, allow_removing="manage_events" in loggedin_user.roles) }}
|
||||||
{% else %}
|
{% elif event.max_people > 0 %}
|
||||||
{{ macros::box(participants=event.rower, empty_seats=event.max_people - amount_cur_rower, bg='primary-100', color='black', trip_details_id=event.trip_details_id, allow_removing="manage_events" in loggedin_user.roles) }}
|
{{ macros::box(participants=event.rower, empty_seats=event.max_people - amount_cur_rower, bg='primary-100', color='black', trip_details_id=event.trip_details_id, allow_removing="manage_events" in loggedin_user.roles) }}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{# --- END List Rowers --- #}
|
{# --- END List Rowers --- #}
|
||||||
@@ -167,7 +167,11 @@
|
|||||||
<input type="hidden" name="_method" value="put" />
|
<input type="hidden" name="_method" value="put" />
|
||||||
<input type="hidden" name="id" value="{{ event.id }}" />
|
<input type="hidden" name="id" value="{{ event.id }}" />
|
||||||
{{ macros::input(label='Titel', name='name', type='input', value=event.name) }}
|
{{ macros::input(label='Titel', name='name', type='input', value=event.name) }}
|
||||||
{{ macros::input(label='Anzahl Ruderer', name='max_people', type='number', required=true, value=event.max_people, min='1') }}
|
{% if event.cancelled %}
|
||||||
|
<input type="hidden" name="max_people" value="-1" />
|
||||||
|
{% else %}
|
||||||
|
{{ macros::input(label='Anzahl Ruderer', name='max_people', type='number', required=true, value=event.max_people, min='1') }}
|
||||||
|
{% endif %}
|
||||||
{{ macros::input(label='Anzahl Steuerleute', name='planned_amount_cox', type='number', value=event.planned_amount_cox, required=true, min='0') }}
|
{{ macros::input(label='Anzahl Steuerleute', name='planned_amount_cox', type='number', value=event.planned_amount_cox, required=true, min='0') }}
|
||||||
{{ macros::checkbox(label='Immer anzeigen', name='always_show', id=event.id,checked=event.always_show, help="Grundsätzlich sehen Rudernde Ausfahrten 10 Tage im vorhinein. Wenn du diese Option aktivierst, ist diese Ausfahrt sofort allen ersichtlich.") }}
|
{{ macros::checkbox(label='Immer anzeigen', name='always_show', id=event.id,checked=event.always_show, help="Grundsätzlich sehen Rudernde Ausfahrten 10 Tage im vorhinein. Wenn du diese Option aktivierst, ist diese Ausfahrt sofort allen ersichtlich.") }}
|
||||||
{{ macros::checkbox(label='Gesperrt', name='is_locked', id=event.id,checked=event.is_locked, help="Wenn diese Option aktiviert ist, kann sich keiner mehr an- und abmelden. Sinnvoll, wenn zB bereits die Bootseinteilung vorgenommen wurde") }}
|
{{ macros::checkbox(label='Gesperrt', name='is_locked', id=event.id,checked=event.is_locked, help="Wenn diese Option aktiviert ist, kann sich keiner mehr an- und abmelden. Sinnvoll, wenn zB bereits die Bootseinteilung vorgenommen wurde") }}
|
||||||
@@ -187,7 +191,7 @@
|
|||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
{% else %}
|
{% else %}
|
||||||
{% if event.max_people == 0 %}
|
{% if event.cancelled %}
|
||||||
Wenn du deine Absage absagen (:^)) willst, einfach entsprechende Anzahl an Ruderer oben eintragen.
|
Wenn du deine Absage absagen (:^)) willst, einfach entsprechende Anzahl an Ruderer oben eintragen.
|
||||||
{% else %}
|
{% else %}
|
||||||
<div class="bg-gray-100 dark:bg-primary-900 p-3 mt-4 rounded-md">
|
<div class="bg-gray-100 dark:bg-primary-900 p-3 mt-4 rounded-md">
|
||||||
@@ -196,9 +200,8 @@
|
|||||||
<input type="hidden" name="_method" value="put" />
|
<input type="hidden" name="_method" value="put" />
|
||||||
<input type="hidden" name="id" value="{{ event.id }}" />
|
<input type="hidden" name="id" value="{{ event.id }}" />
|
||||||
{{ macros::input(label='Grund der Absage', name='notes', type='input', value='') }}
|
{{ macros::input(label='Grund der Absage', name='notes', type='input', value='') }}
|
||||||
{{ macros::input(label='', name='max_people', type='hidden', value=0) }}
|
{{ macros::input(label='', name='max_people', type='hidden', value=-1) }}
|
||||||
{{ macros::input(label='', name='name', type='hidden', value=event.name) }}
|
{{ macros::input(label='', name='name', type='hidden', value=event.name) }}
|
||||||
{{ macros::input(label='', name='max_people', type='hidden', value=event.max_people) }}
|
|
||||||
{{ macros::input(label='', name='planned_amount_cox', type='hidden', value=event.planned_amount_cox) }}
|
{{ macros::input(label='', name='planned_amount_cox', type='hidden', value=event.planned_amount_cox) }}
|
||||||
{{ macros::input(label='', name='always_show', type='hidden', value=event.always_show) }}
|
{{ macros::input(label='', name='always_show', type='hidden', value=event.always_show) }}
|
||||||
{{ macros::input(label='', name='is_locked', type='hidden', value=event.is_locked) }}
|
{{ macros::input(label='', name='is_locked', type='hidden', value=event.is_locked) }}
|
||||||
@@ -228,7 +231,7 @@
|
|||||||
{% if trip.always_show and not day.regular_sees_this_day %}
|
{% if trip.always_show and not day.regular_sees_this_day %}
|
||||||
<span title="Du siehst diese Ausfahrt schon, obwohl sie mehr als {{ amount_days_to_show_trips_ahead }} Tage in der Zukunft liegt. Du Magier!">🔮</span>
|
<span title="Du siehst diese Ausfahrt schon, obwohl sie mehr als {{ amount_days_to_show_trips_ahead }} Tage in der Zukunft liegt. Du Magier!">🔮</span>
|
||||||
{% endif -%}
|
{% endif -%}
|
||||||
{% if trip.max_people == 0 %}
|
{% if trip.cancelled %}
|
||||||
<strong class="text-[#f43f5e]">⚠
|
<strong class="text-[#f43f5e]">⚠
|
||||||
{{ trip.planned_starting_time }}
|
{{ trip.planned_starting_time }}
|
||||||
Uhr</strong>
|
Uhr</strong>
|
||||||
@@ -250,7 +253,7 @@
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
<br />
|
<br />
|
||||||
<a href="#" data-sidebar="true" data-trigger="sidebar" data-header="<strong>
|
<a href="#" data-sidebar="true" data-trigger="sidebar" data-header="<strong>
|
||||||
{% if trip.max_people == 0 %}⚠{% endif %}
|
{% if trip.cancelled %}⚠{% endif %}
|
||||||
{{ trip.planned_starting_time }} Uhr</strong> ({{ trip.cox_name }})
|
{{ trip.planned_starting_time }} Uhr</strong> ({{ trip.cox_name }})
|
||||||
{% if trip.trip_type %}<small class='block'>{{ trip.trip_type.desc }}</small>{% endif %}
|
{% if trip.trip_type %}<small class='block'>{{ trip.trip_type.desc }}</small>{% endif %}
|
||||||
{% if trip.notes %}<small class='block'>{{ trip.notes }}</small>{% endif %}
|
{% if trip.notes %}<small class='block'>{{ trip.notes }}</small>{% endif %}
|
||||||
@@ -279,7 +282,7 @@
|
|||||||
{# --- START Sidebar Content --- #}
|
{# --- START Sidebar Content --- #}
|
||||||
<div class="hidden">
|
<div class="hidden">
|
||||||
<div id="trip{{ trip.trip_details_id }}">
|
<div id="trip{{ trip.trip_details_id }}">
|
||||||
{% if trip.max_people == 0 %}
|
{% if trip.cancelled %}
|
||||||
{# --- border-[#f43f5e] bg-[#f43f5e] --- #}
|
{# --- border-[#f43f5e] bg-[#f43f5e] --- #}
|
||||||
{{ macros::box(participants=trip.rower,bg='[#f43f5e]',header='Absage', trip_details_id=trip.trip_details_id, allow_removing=loggedin_user.id == trip.cox_id) }}
|
{{ macros::box(participants=trip.rower,bg='[#f43f5e]',header='Absage', trip_details_id=trip.trip_details_id, allow_removing=loggedin_user.id == trip.cox_id) }}
|
||||||
{% else %}
|
{% else %}
|
||||||
@@ -319,13 +322,13 @@
|
|||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
{% else %}
|
{% else %}
|
||||||
{% if trip.max_people == 0 %}
|
{% if trip.cancelled %}
|
||||||
Wenn du deine Absage absagen (:^)) willst, einfach entsprechende Anzahl an Ruderer oben eintragen.
|
Wenn du deine Absage absagen (:^)) willst, einfach entsprechende Anzahl an Ruderer oben eintragen.
|
||||||
{% else %}
|
{% else %}
|
||||||
<div class="bg-gray-100 dark:bg-primary-900 p-3 mt-4 rounded-md">
|
<div class="bg-gray-100 dark:bg-primary-900 p-3 mt-4 rounded-md">
|
||||||
<h3 class="text-primary-950 dark:text-white font-bold uppercase tracking-wide mb-2">Ausfahrt absagen</h3>
|
<h3 class="text-primary-950 dark:text-white font-bold uppercase tracking-wide mb-2">Ausfahrt absagen</h3>
|
||||||
<form action="/cox/trip/{{ trip.id }}" method="post" class="grid">
|
<form action="/cox/trip/{{ trip.id }}" method="post" class="grid">
|
||||||
{{ macros::input(label='', name='max_people', type='hidden', value=0) }}
|
{{ macros::input(label='', name='max_people', type='hidden', value=-1) }}
|
||||||
{{ macros::input(label='Grund der Absage', name='notes', type='input', value='') }}
|
{{ macros::input(label='Grund der Absage', name='notes', type='input', value='') }}
|
||||||
{{ macros::input(label='', name='is_locked', type='hidden', value=trip.is_locked) }}
|
{{ macros::input(label='', name='is_locked', type='hidden', value=trip.is_locked) }}
|
||||||
{{ macros::input(label='', name='trip_type', type='hidden', value=trip.trip_type_id) }}
|
{{ macros::input(label='', name='trip_type', type='hidden', value=trip.trip_type_id) }}
|
||||||
|
@@ -9,7 +9,8 @@
|
|||||||
{% if notifications %}
|
{% if notifications %}
|
||||||
{% if loggedin_user.amount_unread_notifications > 10 %}
|
{% if loggedin_user.amount_unread_notifications > 10 %}
|
||||||
<div class="text-primary-950 dark:text-white bg-gray-200 dark:bg-primary-950 bg-opacity-80 text-center pb-3 px-3">
|
<div class="text-primary-950 dark:text-white bg-gray-200 dark:bg-primary-950 bg-opacity-80 text-center pb-3 px-3">
|
||||||
Du hast viele ungelesene Benachrichtigungen. Um deine Oberfläche übersichtlich zu halten und wichtige Updates nicht zu verpassen, nimm dir bitte einen Moment Zeit sie zu überprüfen und als gelesen zu markieren (✓).
|
Du hast viele ungelesene Benachrichtigungen. Um deine Oberfläche übersichtlich zu halten und wichtige Updates nicht zu verpassen, nimm dir bitte in Zukunft einen kurzen Moment Zeit sie zu überprüfen und als gelesen zu markieren (✓).<br /><a href="/notification/read/all" class="underline">Du kannst hier ausnahmsweise alle als gelesen markieren.</a>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<div class="divide-y">
|
<div class="divide-y">
|
||||||
|
Reference in New Issue
Block a user