Redesign page + Webhook notifications #43
42 changed files with 850 additions and 299 deletions
2
.mailmap
2
.mailmap
|
|
@ -1,3 +1,5 @@
|
|||
Bennet Bleßmann <ben@fs-infmat.uni-kiel.de>
|
||||
Bennet Bleßmann <ben@fs-infmat.uni-kiel.de> <bennet.blessmann+github@googlemail.com>
|
||||
Bennet Bleßmann <ben@fs-infmat.uni-kiel.de> <bb-github@t-online.de>
|
||||
Lukas Drescher <ldr@fs-informatik.uni-kiel.de>
|
||||
Lukas Drescher <ldr@fs-informatik.uni-kiel.de> JustAnotherJavaProgrammer <29919508+JustAnotherJavaProgrammer@users.noreply.github.com>
|
||||
|
|
|
|||
409
Cargo.lock
generated
409
Cargo.lock
generated
|
|
@ -8,7 +8,7 @@ version = "0.5.0"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "57a7559404a7f3573127aab53c08ce37a6c6a315c374a31070f3c91cd1b4a7fe"
|
||||
dependencies = [
|
||||
"bitflags",
|
||||
"bitflags 1.3.2",
|
||||
"bytes",
|
||||
"futures-core",
|
||||
"futures-sink",
|
||||
|
|
@ -30,7 +30,7 @@ dependencies = [
|
|||
"actix-utils",
|
||||
"actix-web",
|
||||
"askama_escape",
|
||||
"bitflags",
|
||||
"bitflags 1.3.2",
|
||||
"bytes",
|
||||
"derive_more",
|
||||
"futures-core",
|
||||
|
|
@ -44,17 +44,17 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "actix-http"
|
||||
version = "3.3.0"
|
||||
version = "3.4.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0070905b2c4a98d184c4e81025253cb192aa8a73827553f38e9410801ceb35bb"
|
||||
checksum = "a92ef85799cba03f76e4f7c10f533e66d87c9a7e7055f3391f09000ad8351bc9"
|
||||
dependencies = [
|
||||
"actix-codec",
|
||||
"actix-rt",
|
||||
"actix-service",
|
||||
"actix-utils",
|
||||
"ahash",
|
||||
"ahash 0.8.6",
|
||||
"base64 0.21.0",
|
||||
"bitflags",
|
||||
"bitflags 2.4.1",
|
||||
"brotli",
|
||||
"bytes",
|
||||
"bytestring",
|
||||
|
|
@ -88,7 +88,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||
checksum = "465a6172cf69b960917811022d8f29bc0b7fa1398bc4f78b3c466673db1213b6"
|
||||
dependencies = [
|
||||
"quote",
|
||||
"syn",
|
||||
"syn 1.0.107",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
|
@ -178,6 +178,28 @@ dependencies = [
|
|||
"tracing",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "actix-tls"
|
||||
version = "3.1.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "72616e7fbec0aa99c6f3164677fa48ff5a60036d0799c98cab894a44f3e0efc3"
|
||||
dependencies = [
|
||||
"actix-rt",
|
||||
"actix-service",
|
||||
"actix-utils",
|
||||
"futures-core",
|
||||
"http",
|
||||
"impl-more",
|
||||
"pin-project-lite",
|
||||
"rustls 0.21.10",
|
||||
"rustls-webpki",
|
||||
"tokio",
|
||||
"tokio-rustls",
|
||||
"tokio-util",
|
||||
"tracing",
|
||||
"webpki-roots",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "actix-utils"
|
||||
version = "3.0.1"
|
||||
|
|
@ -203,7 +225,7 @@ dependencies = [
|
|||
"actix-service",
|
||||
"actix-utils",
|
||||
"actix-web-codegen",
|
||||
"ahash",
|
||||
"ahash 0.7.6",
|
||||
"bytes",
|
||||
"bytestring",
|
||||
"cfg-if",
|
||||
|
|
@ -238,7 +260,7 @@ dependencies = [
|
|||
"actix-router",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
"syn 1.0.107",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
|
@ -293,6 +315,19 @@ dependencies = [
|
|||
"version_check",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "ahash"
|
||||
version = "0.8.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "91429305e9f0a25f6205c5b8e0d2db09e0708a7a6df0f42212bb56c32c8ac97a"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"getrandom",
|
||||
"once_cell",
|
||||
"version_check",
|
||||
"zerocopy",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "aho-corasick"
|
||||
version = "0.7.20"
|
||||
|
|
@ -362,7 +397,7 @@ checksum = "726535892e8eae7e70657b4c8ea93d26b8553afb1ce617caee529ef96d7dee6c"
|
|||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
"syn 1.0.107",
|
||||
"synstructure",
|
||||
]
|
||||
|
||||
|
|
@ -374,7 +409,7 @@ checksum = "2777730b2039ac0f95f093556e61b6d26cebed5393ca6f152717777cec3a42ed"
|
|||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
"syn 1.0.107",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
|
@ -385,7 +420,7 @@ checksum = "eff18d764974428cf3a9328e23fc5c986f5fbed46e6cd4cdf42544df5d297ec1"
|
|||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
"syn 1.0.107",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
|
@ -405,6 +440,40 @@ version = "1.1.0"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
|
||||
|
||||
[[package]]
|
||||
name = "awc"
|
||||
version = "3.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7fa3c705a9c7917ac0f41c0757a0a747b43bbc29b0b364b081bd7c5fc67fb223"
|
||||
dependencies = [
|
||||
"actix-codec",
|
||||
"actix-http",
|
||||
"actix-rt",
|
||||
"actix-service",
|
||||
"actix-tls",
|
||||
"actix-utils",
|
||||
"base64 0.21.0",
|
||||
"bytes",
|
||||
"cfg-if",
|
||||
"cookie",
|
||||
"derive_more",
|
||||
"futures-core",
|
||||
"futures-util",
|
||||
"h2",
|
||||
"http",
|
||||
"itoa",
|
||||
"log",
|
||||
"mime",
|
||||
"percent-encoding",
|
||||
"pin-project-lite",
|
||||
"rand",
|
||||
"rustls 0.20.8",
|
||||
"serde",
|
||||
"serde_json",
|
||||
"serde_urlencoded",
|
||||
"tokio",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "base64"
|
||||
version = "0.13.1"
|
||||
|
|
@ -425,7 +494,7 @@ checksum = "a4a4ddaa51a5bc52a6948f74c06d20aaaddb71924eab79b8c97a8c556e942d6a"
|
|||
|
||||
[[package]]
|
||||
name = "better_toml_datetime"
|
||||
version = "0.3.0"
|
||||
version = "0.4.0"
|
||||
dependencies = [
|
||||
"serde",
|
||||
"thiserror",
|
||||
|
|
@ -438,6 +507,12 @@ version = "1.3.2"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
|
||||
|
||||
[[package]]
|
||||
name = "bitflags"
|
||||
version = "2.4.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07"
|
||||
|
||||
[[package]]
|
||||
name = "block-buffer"
|
||||
version = "0.10.3"
|
||||
|
|
@ -629,7 +704,7 @@ version = "4.1.4"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f13b9c79b5d1dd500d20ef541215a6423c75829ef43117e1b4d17fd8af0b5d76"
|
||||
dependencies = [
|
||||
"bitflags",
|
||||
"bitflags 1.3.2",
|
||||
"clap_derive",
|
||||
"clap_lex",
|
||||
"is-terminal",
|
||||
|
|
@ -648,7 +723,7 @@ dependencies = [
|
|||
"proc-macro-error",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
"syn 1.0.107",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
|
@ -772,7 +847,7 @@ dependencies = [
|
|||
"proc-macro2",
|
||||
"quote",
|
||||
"scratch",
|
||||
"syn",
|
||||
"syn 1.0.107",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
|
@ -789,7 +864,7 @@ checksum = "357f40d1f06a24b60ae1fe122542c1fb05d28d32acb2aed064e84bc2ad1e252e"
|
|||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
"syn 1.0.107",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
|
@ -822,7 +897,7 @@ dependencies = [
|
|||
"proc-macro2",
|
||||
"quote",
|
||||
"rustc_version",
|
||||
"syn",
|
||||
"syn 1.0.107",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
|
@ -833,9 +908,9 @@ checksum = "850878694b7933ca4c9569d30a34b55031b9b139ee1fc7b94a527c4ef960d690"
|
|||
|
||||
[[package]]
|
||||
name = "digest"
|
||||
version = "0.10.6"
|
||||
version = "0.10.7"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f"
|
||||
checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292"
|
||||
dependencies = [
|
||||
"block-buffer",
|
||||
"crypto-common",
|
||||
|
|
@ -850,7 +925,7 @@ checksum = "3bf95dc3f046b9da4f2d51833c0d3547d8564ef6910f5c1ed130306a75b92886"
|
|||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
"syn 1.0.107",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
|
@ -897,6 +972,12 @@ dependencies = [
|
|||
"termcolor",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "equivalent"
|
||||
version = "1.0.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
|
||||
|
||||
[[package]]
|
||||
name = "errno"
|
||||
version = "0.2.8"
|
||||
|
|
@ -1008,7 +1089,7 @@ checksum = "bdfb8ce053d86b91919aad980c220b1fb8401a9394410e1c289ed7e66b61835d"
|
|||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
"syn 1.0.107",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
|
@ -1078,7 +1159,7 @@ version = "0.15.0"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2994bee4a3a6a51eb90c218523be382fd7ea09b16380b9312e9dbe955ff7c7d1"
|
||||
dependencies = [
|
||||
"bitflags",
|
||||
"bitflags 1.3.2",
|
||||
"libc",
|
||||
"libgit2-sys",
|
||||
"log",
|
||||
|
|
@ -1087,9 +1168,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "h2"
|
||||
version = "0.3.15"
|
||||
version = "0.3.22"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5f9f29bc9dda355256b2916cf526ab02ce0aeaaaf2bad60d65ef3f12f11dd0f4"
|
||||
checksum = "4d6250322ef6e60f93f9a2162799302cd6f68f79f6e5d85c8c16f14d1d958178"
|
||||
dependencies = [
|
||||
"bytes",
|
||||
"fnv",
|
||||
|
|
@ -1097,7 +1178,7 @@ dependencies = [
|
|||
"futures-sink",
|
||||
"futures-util",
|
||||
"http",
|
||||
"indexmap",
|
||||
"indexmap 2.1.0",
|
||||
"slab",
|
||||
"tokio",
|
||||
"tokio-util",
|
||||
|
|
@ -1125,6 +1206,12 @@ version = "0.12.3"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
|
||||
|
||||
[[package]]
|
||||
name = "hashbrown"
|
||||
version = "0.14.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604"
|
||||
|
||||
[[package]]
|
||||
name = "heck"
|
||||
version = "0.3.3"
|
||||
|
|
@ -1268,6 +1355,12 @@ dependencies = [
|
|||
"unicode-normalization",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "impl-more"
|
||||
version = "0.1.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "206ca75c9c03ba3d4ace2460e57b189f39f43de612c2f85836e65c929701bb2d"
|
||||
|
||||
[[package]]
|
||||
name = "indexmap"
|
||||
version = "1.9.2"
|
||||
|
|
@ -1275,7 +1368,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||
checksum = "1885e79c1fc4b10f0e172c475f458b7f7b93061064d98c3293e98c5ba0c8b399"
|
||||
dependencies = [
|
||||
"autocfg",
|
||||
"hashbrown",
|
||||
"hashbrown 0.12.3",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "indexmap"
|
||||
version = "2.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f"
|
||||
dependencies = [
|
||||
"equivalent",
|
||||
"hashbrown 0.14.3",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
|
@ -1303,7 +1406,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||
checksum = "e7d6c6f8c91b4b9ed43484ad1a938e393caf35960fce7f82a040497207bd8e9e"
|
||||
dependencies = [
|
||||
"libc",
|
||||
"windows-sys",
|
||||
"windows-sys 0.42.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
|
@ -1315,7 +1418,7 @@ dependencies = [
|
|||
"hermit-abi 0.2.6",
|
||||
"io-lifetimes",
|
||||
"rustix",
|
||||
"windows-sys",
|
||||
"windows-sys 0.42.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
|
@ -1335,12 +1438,14 @@ checksum = "fad582f4b9e86b6caa621cabeb0963332d92eea04729ab12892c2533951e6440"
|
|||
|
||||
[[package]]
|
||||
name = "jobboerse"
|
||||
version = "0.3.0"
|
||||
version = "0.4.0"
|
||||
dependencies = [
|
||||
"actix-files",
|
||||
"actix-multipart",
|
||||
"actix-session",
|
||||
"actix-tls",
|
||||
"actix-web",
|
||||
"awc",
|
||||
"better_toml_datetime",
|
||||
"cargo-bundle-licenses",
|
||||
"chrono",
|
||||
|
|
@ -1420,8 +1525,8 @@ dependencies = [
|
|||
"log",
|
||||
"nom",
|
||||
"percent-encoding",
|
||||
"ring",
|
||||
"rustls",
|
||||
"ring 0.16.20",
|
||||
"rustls 0.20.8",
|
||||
"rustls-native-certs",
|
||||
"thiserror",
|
||||
"tokio",
|
||||
|
|
@ -1592,12 +1697,12 @@ dependencies = [
|
|||
"libc",
|
||||
"log",
|
||||
"wasi",
|
||||
"windows-sys",
|
||||
"windows-sys 0.42.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "multipart_helper"
|
||||
version = "0.3.0"
|
||||
version = "0.4.0"
|
||||
dependencies = [
|
||||
"actix-multipart",
|
||||
"futures-util",
|
||||
|
|
@ -1718,7 +1823,7 @@ dependencies = [
|
|||
"libc",
|
||||
"redox_syscall",
|
||||
"smallvec",
|
||||
"windows-sys",
|
||||
"windows-sys 0.42.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
|
@ -1772,7 +1877,7 @@ dependencies = [
|
|||
"pest_meta",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
"syn 1.0.107",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
|
@ -1879,7 +1984,7 @@ dependencies = [
|
|||
"proc-macro-error-attr",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
"syn 1.0.107",
|
||||
"version_check",
|
||||
]
|
||||
|
||||
|
|
@ -1896,9 +2001,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "proc-macro2"
|
||||
version = "1.0.50"
|
||||
version = "1.0.71"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6ef7d57beacfaf2d8aee5937dab7b7f28de3cb8b1828479bb5de2a7106f2bae2"
|
||||
checksum = "75cb1540fadbd5b8fbccc4dddad2734eba435053f725621c070711a14bb5f4b8"
|
||||
dependencies = [
|
||||
"unicode-ident",
|
||||
]
|
||||
|
|
@ -1911,9 +2016,9 @@ checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0"
|
|||
|
||||
[[package]]
|
||||
name = "quote"
|
||||
version = "1.0.23"
|
||||
version = "1.0.33"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8856d8364d252a14d474036ea1358d63c9e6965c8e5c1885c18f73d70bff9c7b"
|
||||
checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
]
|
||||
|
|
@ -1960,7 +2065,7 @@ version = "0.2.16"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a"
|
||||
dependencies = [
|
||||
"bitflags",
|
||||
"bitflags 1.3.2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
|
@ -1998,12 +2103,26 @@ dependencies = [
|
|||
"cc",
|
||||
"libc",
|
||||
"once_cell",
|
||||
"spin",
|
||||
"untrusted",
|
||||
"spin 0.5.2",
|
||||
"untrusted 0.7.1",
|
||||
"web-sys",
|
||||
"winapi",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "ring"
|
||||
version = "0.17.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9babe80d5c16becf6594aa32ad2be8fe08498e7ae60b77de8df700e67f191d7e"
|
||||
dependencies = [
|
||||
"cc",
|
||||
"getrandom",
|
||||
"libc",
|
||||
"spin 0.9.8",
|
||||
"untrusted 0.9.0",
|
||||
"windows-sys 0.48.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rustc_version"
|
||||
version = "0.4.0"
|
||||
|
|
@ -2028,12 +2147,12 @@ version = "0.36.7"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d4fdebc4b395b7fbb9ab11e462e20ed9051e7b16e42d24042c776eca0ac81b03"
|
||||
dependencies = [
|
||||
"bitflags",
|
||||
"bitflags 1.3.2",
|
||||
"errno",
|
||||
"io-lifetimes",
|
||||
"libc",
|
||||
"linux-raw-sys",
|
||||
"windows-sys",
|
||||
"windows-sys 0.42.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
|
@ -2043,11 +2162,23 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||
checksum = "fff78fc74d175294f4e83b28343315ffcfb114b156f0185e9741cb5570f50e2f"
|
||||
dependencies = [
|
||||
"log",
|
||||
"ring",
|
||||
"ring 0.16.20",
|
||||
"sct",
|
||||
"webpki",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rustls"
|
||||
version = "0.21.10"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f9d5a6813c0759e4609cd494e8e725babae6a2ca7b62a5536a13daaec6fcb7ba"
|
||||
dependencies = [
|
||||
"log",
|
||||
"ring 0.17.3",
|
||||
"rustls-webpki",
|
||||
"sct",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rustls-native-certs"
|
||||
version = "0.6.2"
|
||||
|
|
@ -2069,6 +2200,16 @@ dependencies = [
|
|||
"base64 0.21.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rustls-webpki"
|
||||
version = "0.101.7"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765"
|
||||
dependencies = [
|
||||
"ring 0.17.3",
|
||||
"untrusted 0.9.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "ryu"
|
||||
version = "1.0.12"
|
||||
|
|
@ -2090,7 +2231,7 @@ version = "0.1.21"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "713cfb06c7059f3588fb8044c0fad1d09e3c01d225e25b9220dbfdcf16dbb1b3"
|
||||
dependencies = [
|
||||
"windows-sys",
|
||||
"windows-sys 0.42.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
|
@ -2111,8 +2252,8 @@ version = "0.7.0"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4"
|
||||
dependencies = [
|
||||
"ring",
|
||||
"untrusted",
|
||||
"ring 0.16.20",
|
||||
"untrusted 0.7.1",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
|
@ -2121,7 +2262,7 @@ version = "2.8.1"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7c4437699b6d34972de58652c68b98cb5b53a4199ab126db8e20ec8ded29a721"
|
||||
dependencies = [
|
||||
"bitflags",
|
||||
"bitflags 1.3.2",
|
||||
"core-foundation",
|
||||
"core-foundation-sys",
|
||||
"libc",
|
||||
|
|
@ -2164,7 +2305,7 @@ checksum = "af487d118eecd09402d70a5d72551860e788df87b464af30e5ea6a38c75c541e"
|
|||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
"syn 1.0.107",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
|
@ -2205,7 +2346,7 @@ version = "0.8.26"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "578a7433b776b56a35785ed5ce9a7e777ac0598aac5a6dd1b4b18a307c7fc71b"
|
||||
dependencies = [
|
||||
"indexmap",
|
||||
"indexmap 1.9.2",
|
||||
"ryu",
|
||||
"serde",
|
||||
"yaml-rust",
|
||||
|
|
@ -2297,6 +2438,12 @@ version = "0.5.2"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d"
|
||||
|
||||
[[package]]
|
||||
name = "spin"
|
||||
version = "0.9.8"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67"
|
||||
|
||||
[[package]]
|
||||
name = "strsim"
|
||||
version = "0.10.0"
|
||||
|
|
@ -2321,14 +2468,14 @@ dependencies = [
|
|||
"heck 0.3.3",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
"syn 1.0.107",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "subtle"
|
||||
version = "2.4.1"
|
||||
version = "2.5.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601"
|
||||
checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc"
|
||||
|
||||
[[package]]
|
||||
name = "syn"
|
||||
|
|
@ -2341,6 +2488,17 @@ dependencies = [
|
|||
"unicode-ident",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "syn"
|
||||
version = "2.0.42"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5b7d0a2c048d661a1a59fcd7355baa232f7ed34e0ee4df2eef3c1c1c0d3852d8"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"unicode-ident",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "synstructure"
|
||||
version = "0.12.6"
|
||||
|
|
@ -2349,7 +2507,7 @@ checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f"
|
|||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
"syn 1.0.107",
|
||||
"unicode-xid",
|
||||
]
|
||||
|
||||
|
|
@ -2393,7 +2551,7 @@ checksum = "1fb327af4685e4d03fa8cbcf1716380da910eeb2bb8be417e7f9fd3fb164f36f"
|
|||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
"syn 1.0.107",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
|
@ -2454,7 +2612,7 @@ dependencies = [
|
|||
"signal-hook-registry",
|
||||
"socket2",
|
||||
"tokio-macros",
|
||||
"windows-sys",
|
||||
"windows-sys 0.42.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
|
@ -2465,7 +2623,7 @@ checksum = "d266c00fde287f55d3f1c3e96c500c362a2b8c695076ec180f27918820bc6df8"
|
|||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
"syn 1.0.107",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
|
@ -2474,7 +2632,7 @@ version = "0.23.4"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c43ee83903113e03984cb9e5cebe6c04a5116269e900e3ddba8f068a62adda59"
|
||||
dependencies = [
|
||||
"rustls",
|
||||
"rustls 0.20.8",
|
||||
"tokio",
|
||||
"webpki",
|
||||
]
|
||||
|
|
@ -2540,7 +2698,7 @@ version = "0.19.0"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "233d8716cdc5d20ec88a18a839edaf545edc71efa4a5ff700ef4a102c26cd8fa"
|
||||
dependencies = [
|
||||
"indexmap",
|
||||
"indexmap 1.9.2",
|
||||
"nom8",
|
||||
"serde",
|
||||
"serde_spanned",
|
||||
|
|
@ -2630,9 +2788,9 @@ checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c"
|
|||
|
||||
[[package]]
|
||||
name = "universal-hash"
|
||||
version = "0.5.0"
|
||||
version = "0.5.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7d3160b73c9a19f7e2939a2fdad446c57c1bbbbf4d919d3213ff1267a580d8b5"
|
||||
checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea"
|
||||
dependencies = [
|
||||
"crypto-common",
|
||||
"subtle",
|
||||
|
|
@ -2644,6 +2802,12 @@ version = "0.7.1"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a"
|
||||
|
||||
[[package]]
|
||||
name = "untrusted"
|
||||
version = "0.9.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1"
|
||||
|
||||
[[package]]
|
||||
name = "url"
|
||||
version = "2.3.1"
|
||||
|
|
@ -2706,7 +2870,7 @@ dependencies = [
|
|||
"once_cell",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
"syn 1.0.107",
|
||||
"wasm-bindgen-shared",
|
||||
]
|
||||
|
||||
|
|
@ -2728,7 +2892,7 @@ checksum = "07bc0c051dc5f23e307b13285f9d75df86bfdf816c5721e573dec1f9b8aa193c"
|
|||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
"syn 1.0.107",
|
||||
"wasm-bindgen-backend",
|
||||
"wasm-bindgen-shared",
|
||||
]
|
||||
|
|
@ -2755,8 +2919,17 @@ version = "0.22.0"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f095d78192e208183081cc07bc5515ef55216397af48b873e5edcd72637fa1bd"
|
||||
dependencies = [
|
||||
"ring",
|
||||
"untrusted",
|
||||
"ring 0.16.20",
|
||||
"untrusted 0.7.1",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "webpki-roots"
|
||||
version = "0.22.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b6c71e40d7d2c34a5106301fb632274ca37242cd0c9d3e64dbece371a40a2d87"
|
||||
dependencies = [
|
||||
"webpki",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
|
@ -2796,13 +2969,37 @@ version = "0.42.0"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7"
|
||||
dependencies = [
|
||||
"windows_aarch64_gnullvm",
|
||||
"windows_aarch64_msvc",
|
||||
"windows_i686_gnu",
|
||||
"windows_i686_msvc",
|
||||
"windows_x86_64_gnu",
|
||||
"windows_x86_64_gnullvm",
|
||||
"windows_x86_64_msvc",
|
||||
"windows_aarch64_gnullvm 0.42.1",
|
||||
"windows_aarch64_msvc 0.42.1",
|
||||
"windows_i686_gnu 0.42.1",
|
||||
"windows_i686_msvc 0.42.1",
|
||||
"windows_x86_64_gnu 0.42.1",
|
||||
"windows_x86_64_gnullvm 0.42.1",
|
||||
"windows_x86_64_msvc 0.42.1",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-sys"
|
||||
version = "0.48.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9"
|
||||
dependencies = [
|
||||
"windows-targets",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-targets"
|
||||
version = "0.48.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c"
|
||||
dependencies = [
|
||||
"windows_aarch64_gnullvm 0.48.5",
|
||||
"windows_aarch64_msvc 0.48.5",
|
||||
"windows_i686_gnu 0.48.5",
|
||||
"windows_i686_msvc 0.48.5",
|
||||
"windows_x86_64_gnu 0.48.5",
|
||||
"windows_x86_64_gnullvm 0.48.5",
|
||||
"windows_x86_64_msvc 0.48.5",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
|
@ -2811,42 +3008,84 @@ version = "0.42.1"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8c9864e83243fdec7fc9c5444389dcbbfd258f745e7853198f365e3c4968a608"
|
||||
|
||||
[[package]]
|
||||
name = "windows_aarch64_gnullvm"
|
||||
version = "0.48.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8"
|
||||
|
||||
[[package]]
|
||||
name = "windows_aarch64_msvc"
|
||||
version = "0.42.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "4c8b1b673ffc16c47a9ff48570a9d85e25d265735c503681332589af6253c6c7"
|
||||
|
||||
[[package]]
|
||||
name = "windows_aarch64_msvc"
|
||||
version = "0.48.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc"
|
||||
|
||||
[[package]]
|
||||
name = "windows_i686_gnu"
|
||||
version = "0.42.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "de3887528ad530ba7bdbb1faa8275ec7a1155a45ffa57c37993960277145d640"
|
||||
|
||||
[[package]]
|
||||
name = "windows_i686_gnu"
|
||||
version = "0.48.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e"
|
||||
|
||||
[[package]]
|
||||
name = "windows_i686_msvc"
|
||||
version = "0.42.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bf4d1122317eddd6ff351aa852118a2418ad4214e6613a50e0191f7004372605"
|
||||
|
||||
[[package]]
|
||||
name = "windows_i686_msvc"
|
||||
version = "0.48.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406"
|
||||
|
||||
[[package]]
|
||||
name = "windows_x86_64_gnu"
|
||||
version = "0.42.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c1040f221285e17ebccbc2591ffdc2d44ee1f9186324dd3e84e99ac68d699c45"
|
||||
|
||||
[[package]]
|
||||
name = "windows_x86_64_gnu"
|
||||
version = "0.48.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e"
|
||||
|
||||
[[package]]
|
||||
name = "windows_x86_64_gnullvm"
|
||||
version = "0.42.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "628bfdf232daa22b0d64fdb62b09fcc36bb01f05a3939e20ab73aaf9470d0463"
|
||||
|
||||
[[package]]
|
||||
name = "windows_x86_64_gnullvm"
|
||||
version = "0.48.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc"
|
||||
|
||||
[[package]]
|
||||
name = "windows_x86_64_msvc"
|
||||
version = "0.42.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "447660ad36a13288b1db4d4248e857b510e8c3a225c822ba4fb748c0aafecffd"
|
||||
|
||||
[[package]]
|
||||
name = "windows_x86_64_msvc"
|
||||
version = "0.48.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538"
|
||||
|
||||
[[package]]
|
||||
name = "x509-parser"
|
||||
version = "0.14.0"
|
||||
|
|
@ -2874,6 +3113,26 @@ dependencies = [
|
|||
"linked-hash-map",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "zerocopy"
|
||||
version = "0.7.32"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be"
|
||||
dependencies = [
|
||||
"zerocopy-derive",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "zerocopy-derive"
|
||||
version = "0.7.32"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.42",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "zstd"
|
||||
version = "0.12.2+zstd.1.5.2"
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
members = [".", "packages/*"]
|
||||
|
||||
[workspace.package]
|
||||
version = "0.3.0"
|
||||
version = "0.4.0"
|
||||
edition = "2021"
|
||||
rust-version = "1.64"
|
||||
license = "MIT OR Apache-2.0"
|
||||
|
|
@ -15,7 +15,9 @@ readme = "README.md"
|
|||
actix-files = "0.6.2"
|
||||
actix-web = "4.3.0"
|
||||
actix-session = { version = "0.7.2", features = ["cookie-session"] }
|
||||
actix-tls = "3.1.1"
|
||||
actix-multipart = "0.5.0"
|
||||
|
ldr marked this conversation as resolved
Outdated
|
||||
awc ={ version = "3.2.0", features = ["rustls"] }
|
||||
better_toml_datetime = { path = "packages/better_toml_datetime" }
|
||||
cargo-bundle-licenses = { version = "1.0.1", default-features = false }
|
||||
chrono = { version = "0.4.23", default-features = false, features = ["std","clock"] }
|
||||
|
|
|
|||
22
Changelog.md
22
Changelog.md
|
|
@ -7,6 +7,28 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||
|
||||
## [Unreleased]
|
||||
|
||||
### Added
|
||||
|
||||
- basic (Discord) webhook support (send message when an offer is made public)
|
||||
- `webhook_url` option in the config file to specify a complete webhook url
|
||||
|
||||
### Fix
|
||||
|
||||
- spelling mistakes in e-mail notifications
|
||||
- spelling mistakes on the website
|
||||
|
||||
### Change
|
||||
|
||||
- rephrase e-mail notifications
|
||||
- rephrase texts on the website
|
||||
- translate all text to German
|
||||
- update the FAQ
|
||||
- change the design of the website
|
||||
|
||||
### Removed
|
||||
|
||||
- reference to `./scripts/adjust_thirdparty.sh` in `README.md` as it no longer exists
|
||||
|
||||
## [0.3.0]
|
||||
|
||||
### Fix
|
||||
|
|
|
|||
|
|
@ -13,9 +13,6 @@ The minimum required rust-toolchain version as of writing is `1.58` see the `rus
|
|||
A stable toolchain is recommended.
|
||||
It is recommended to use cargo for building as such make sure the `cargo` component of the toolchain is installed.
|
||||
|
||||
It may be necessary to run `./scripts/adjust_thirdparty.sh` to adjust some absolute paths in the `THIRDPARTY.toml`,
|
||||
though this should only be required to run tests.
|
||||
|
||||
For a release build you can run `cargo build --release` this should build all dependencies and place the final binary in
|
||||
the `./target/release/` folder.
|
||||
|
||||
|
|
@ -63,6 +60,7 @@ The expected fields are defined by the `ProgramConfig` struct in `./src/server_c
|
|||
| `banner` | false | no banner |
|
||||
| `login_provider` | true | N/A |
|
||||
| `email` | false | no email |
|
||||
| `webhook_url` | false | no webhook |
|
||||
|
||||
Note: when email is not configured, no confirmation e-mails will be sent, but confirmation is still required!
|
||||
|
||||
|
|
|
|||
|
|
@ -22,7 +22,9 @@ dev_mode = []
|
|||
actix-files = { workspace = true }
|
||||
actix-web = { workspace = true }
|
||||
actix-session = { workspace = true, features = ["cookie-session"] }
|
||||
actix-tls = { workspace = true }
|
||||
actix-multipart = { workspace = true }
|
||||
awc = { workspace = true }
|
||||
better_toml_datetime = { workspace = true }
|
||||
cargo-bundle-licenses = { workspace = true, default-features = false }
|
||||
chrono = { workspace = true, default-features = false, features = ["std","clock"] }
|
||||
|
|
|
|||
BIN
packages/jobboerse/THIRDPARTY.toml
(Stored with Git LFS)
BIN
packages/jobboerse/THIRDPARTY.toml
(Stored with Git LFS)
Binary file not shown.
|
|
@ -1,5 +1,6 @@
|
|||
url_base_path = "jobbörse"
|
||||
banner = "Hinweis: Die Jobbörse wird aktuall noch evaluiert und befindet sich noch nicht im produktiven Betrieb!"
|
||||
webhook_url="https://discord.com/api/webhooks/1188255966655946854/UgX-gtkThowrhk4kFdzVc46V5YfAUc_In5U6Ez5YvZhMKKJWCFLjdtBlTJ0nL--kt3GI?wait=true"
|
||||
|
||||
[login_provider]
|
||||
type = 'Development'
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ use handlebars::Handlebars;
|
|||
use lettre::message::header::{Header, HeaderName, HeaderValue, UserAgent};
|
||||
use lettre::message::{Mailbox, SinglePart};
|
||||
use lettre::{Address, AsyncTransport};
|
||||
use log::{warn, debug};
|
||||
use log::{debug, warn};
|
||||
use serde_json::json;
|
||||
use url::Url;
|
||||
|
||||
|
|
|
|||
|
|
@ -30,6 +30,7 @@ mod route;
|
|||
mod server_config;
|
||||
mod template;
|
||||
mod util;
|
||||
mod webhook;
|
||||
|
||||
// internal imports
|
||||
use crate::job_offers::JobOffers;
|
||||
|
|
|
|||
|
|
@ -9,6 +9,7 @@ use crate::job_offers::view::JobOfferViewData;
|
|||
use crate::route::job_offer::error::ConfirmationResponseError;
|
||||
use crate::route::job_offer::error::ConfirmationResponseError::SuccessRenderError;
|
||||
use crate::route::HTML_CONTENT;
|
||||
use crate::webhook::{send_new_offer_message, NewOfferWebhookData};
|
||||
use crate::{get, template, JobOffers, ServerConfig};
|
||||
|
||||
#[derive(Serialize)]
|
||||
|
|
@ -101,6 +102,20 @@ pub(crate) async fn confirm_joboffer_post(
|
|||
Ok(()) => {
|
||||
job_offer.try_clean().await?;
|
||||
|
||||
match &config.config.webhook_url {
|
||||
Some(webhook_url) if job_offer.is_published() => {
|
||||
let data = NewOfferWebhookData {
|
||||
title: job_offer.title.to_owned(),
|
||||
company: job_offer.offering_party.to_owned(),
|
||||
link: job_offer.highlight_link(&req)?,
|
||||
};
|
||||
send_new_offer_message(&hb, webhook_url.to_owned(), &data)
|
||||
.await
|
||||
.ok();
|
||||
}
|
||||
_ => {}
|
||||
};
|
||||
|
||||
let data = json!({
|
||||
"base": crate::route::base(&req, &config, "Job Offer Confirmation Successful")?,
|
||||
"user": user,
|
||||
|
|
|
|||
|
|
@ -153,8 +153,7 @@ pub(crate) async fn edit_joboffer_post(
|
|||
|
||||
if let Some(tmp_file) = file {
|
||||
// TODO error handling
|
||||
let _todo =
|
||||
tmp_file.persist(job_offer_folder.join(&offer.attachment_location));
|
||||
let _todo = tmp_file.persist(job_offer_folder.join(&offer.attachment_location));
|
||||
}
|
||||
|
||||
Some(offer)
|
||||
|
|
|
|||
|
|
@ -5,6 +5,7 @@ use handlebars::Handlebars;
|
|||
use crate::email::PublishNoticeEmailData;
|
||||
use crate::route::job_offer::error::StateChangeResponseError;
|
||||
use crate::route::JOBOFFER_OVERVIEW_ROUTE;
|
||||
use crate::webhook::NewOfferWebhookData;
|
||||
use crate::{auth, JobOffers, ServerConfig};
|
||||
|
||||
pub(crate) const JOBOFFER_PUBLISH_ROUTE: &str = "review_offer";
|
||||
|
|
@ -41,6 +42,16 @@ pub(crate) async fn review_joboffer(
|
|||
)
|
||||
.await?;
|
||||
}
|
||||
if let Some(webhook_url) = &config.config.webhook_url {
|
||||
let data = NewOfferWebhookData {
|
||||
title: entry.title.to_owned(),
|
||||
company: entry.offering_party.to_owned(),
|
||||
link: entry.highlight_link(&req)?,
|
||||
};
|
||||
crate::webhook::send_new_offer_message(&hb, webhook_url.to_owned(), &data)
|
||||
|
ldr marked this conversation as resolved
ben
commented
Not aborting because the webhook failed is what I would expect, but it might be good to log the error instead of just ignoring it. Not aborting because the webhook failed is what I would expect, but it might be good to log the error instead of just ignoring it.
ldr
commented
This is now being logged directly inside the function. This is now being logged directly inside the function.
|
||||
.await
|
||||
.ok();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -37,6 +37,8 @@ pub(crate) struct ProgramConfig {
|
|||
pub(crate) login_provider: LoginProviderConfig,
|
||||
#[serde(skip_serializing_if = "Option::is_none", default)]
|
||||
pub(crate) email: Option<EmailConfig>,
|
||||
#[serde(default)]
|
||||
|
ldr marked this conversation as resolved
Outdated
ben
commented
Add a Also if the Add a `#[serde(default)]` attribute for the added field so that it will default to `None` if the field is absent, instead of failing to deserialize the config.
```diff
+ #[serde(default)]
pub(crate) webhook_url: Option<String>,
```
Also if the `webhook_url` need to be a valid url `url::Url` might be better than `String` so that the validity is checked at deserialization time.
|
||||
pub(crate) webhook_url: Option<Url>,
|
||||
}
|
||||
|
||||
#[derive(Serialize, Deserialize, Debug)]
|
||||
|
|
|
|||
|
|
@ -14,3 +14,5 @@ pub(crate) const LICENCES: &str = "licenses";
|
|||
pub const EMAIL_CONFIRMATION_PLAIN: &str = "email/confirmation_plaintext";
|
||||
pub const EMAIL_PUBLISH_NOTICE_PLAIN: &str = "email/publish_notice_plaintext";
|
||||
pub const EMAIL_REVIEWER_NOTICE: &str = "email/reviewer_notice_plaintext";
|
||||
|
||||
pub const WEBHOOK_NEW_OFFER_MESSAGE: &str = "webhook/newoffer";
|
||||
|
|
|
|||
|
|
@ -59,8 +59,8 @@ pub fn chrono_datetime_to_toml_datetime<Tz: chrono::TimeZone>(
|
|||
}
|
||||
|
||||
pub fn toml_date_to_chrono_date(date: &toml::value::Date) -> chrono::DateTime<FixedOffset> {
|
||||
let local_date =
|
||||
NaiveDate::from_ymd_opt(date.year.into(), date.month.into(), date.day.into()).expect("toml should contain valid date");
|
||||
let local_date = NaiveDate::from_ymd_opt(date.year.into(), date.month.into(), date.day.into())
|
||||
.expect("toml should contain valid date");
|
||||
let offset = chrono_tz::Europe::Berlin
|
||||
.offset_from_local_date(&local_date)
|
||||
.map(|offset| offset.fix())
|
||||
|
|
@ -91,13 +91,15 @@ pub fn toml_datetime_to_chrono_datetime(
|
|||
toml_date.year.into(),
|
||||
toml_date.month.into(),
|
||||
toml_date.day.into(),
|
||||
).expect("toml should contain valid date")
|
||||
)
|
||||
.expect("toml should contain valid date")
|
||||
.and_hms_nano_opt(
|
||||
toml_time.hour.into(),
|
||||
toml_time.minute.into(),
|
||||
toml_time.second.into(),
|
||||
toml_time.nanosecond,
|
||||
).expect("toml should contain valid time");
|
||||
)
|
||||
.expect("toml should contain valid time");
|
||||
|
||||
let offset: FixedOffset = datetime
|
||||
.offset
|
||||
|
|
|
|||
68
packages/jobboerse/src/webhook.rs
Normal file
68
packages/jobboerse/src/webhook.rs
Normal file
|
|
@ -0,0 +1,68 @@
|
|||
use std::sync::Arc;
|
||||
|
||||
use actix_tls::connect::rustls_0_20::reexports::ClientConfig;
|
||||
use awc::{Client, Connector};
|
||||
use handlebars::{Handlebars, RenderError};
|
||||
use log::{debug, error, warn};
|
||||
use serde_json::json;
|
||||
use url::Url;
|
||||
|
||||
use crate::template;
|
||||
|
||||
#[derive(serde::Serialize)]
|
||||
pub(crate) struct NewOfferWebhookData {
|
||||
pub(crate) title: String,
|
||||
pub(crate) company: String,
|
||||
pub(crate) link: Url,
|
||||
}
|
||||
|
||||
pub(crate) async fn send_new_offer_message(
|
||||
hb: &Handlebars<'_>,
|
||||
webhook_url: Url,
|
||||
data: &NewOfferWebhookData,
|
||||
) -> Result<bool, RenderError> {
|
||||
let message_text = hb
|
||||
.render(template::WEBHOOK_NEW_OFFER_MESSAGE, data)
|
||||
.map_err(|err| {
|
||||
warn!(
|
||||
"Rendering webhook message failed with the following error: {}",
|
||||
err
|
||||
);
|
||||
err
|
||||
})?;
|
||||
|
||||
let msg = json!({
|
||||
"content": message_text,
|
||||
// We don't accidentally want to mention anybody
|
||||
"allowed_mentions": {
|
||||
"parse": []
|
||||
}
|
||||
});
|
||||
|
||||
debug!("Sending webhook request to {}", webhook_url);
|
||||
let tls_config = ClientConfig::builder()
|
||||
.with_safe_defaults()
|
||||
.with_root_certificates(actix_tls::connect::rustls::webpki_roots_cert_store())
|
||||
.with_no_client_auth();
|
||||
let arc = Arc::new(tls_config);
|
||||
let connector = Connector::new().rustls(arc);
|
||||
let client = Client::builder().connector(connector).finish();
|
||||
let request_result = client.post(webhook_url.as_str()).send_json(&msg).await;
|
||||
let success = match request_result {
|
||||
Ok(response) => {
|
||||
debug!(
|
||||
"Webhook request succeeded with status: {}",
|
||||
response.status(),
|
||||
// make response mutable when uncommenting this
|
||||
// String::from_utf8(response.body().await.unwrap().to_vec()).unwrap()
|
||||
);
|
||||
true
|
||||
}
|
||||
Err(err) => {
|
||||
warn!("Webhook request failed with error: {}", err);
|
||||
false
|
||||
}
|
||||
};
|
||||
|
||||
Ok(success)
|
||||
}
|
||||
|
|
@ -1,17 +1,76 @@
|
|||
:root {
|
||||
--header-footer-color: AliceBlue;
|
||||
--filter-bar-color: Aquamarine;
|
||||
font-family: "FreeSans", sans-serif;
|
||||
--green: #87d38b;
|
||||
--blue: #8ab9e7;
|
||||
--yellow: #e9a12f;
|
||||
--light-green: #c3e9c5;
|
||||
--dark-green: #27682a;
|
||||
--light-blue: #cce0f5;
|
||||
--dark-blue: #1c5287;
|
||||
--light-yellow: #f7deb6;
|
||||
--dark-yellow: #a66d11;
|
||||
--default-padding: calc((5 / 16) * 1rem)
|
||||
}
|
||||
|
||||
.header, .footer, .header-banner {
|
||||
.header, .header-inner, .header-banner {
|
||||
display: flex;
|
||||
background: var(--header-footer-color);
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
box-sizing: border-box;
|
||||
width: 100%;
|
||||
padding: 5px;
|
||||
box-shadow: 0px 0px 10px 0px gray;
|
||||
}
|
||||
|
||||
.header-inner, .header-banner {
|
||||
background: var(--light-green);
|
||||
padding: var(--default-padding);
|
||||
}
|
||||
|
||||
.header, .header-inner {
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.header::after {
|
||||
content: "";
|
||||
background-color: var(--light-green);
|
||||
clip-path: polygon(100% 0%, 0% 0%, 0% 100%);
|
||||
width: 100%;
|
||||
height: min(5vh, 2.5rem);
|
||||
}
|
||||
|
||||
.header h1 {
|
||||
padding: var(--default-padding);
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
a {
|
||||
color: var(--dark-blue);
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-size: 2rem;
|
||||
}
|
||||
|
||||
h2 {
|
||||
font-size: 1.5rem;
|
||||
}
|
||||
|
||||
h3 {
|
||||
font-size: 1.17rem;
|
||||
}
|
||||
|
||||
.menu {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
flex-wrap: wrap;
|
||||
justify-content: space-evenly;
|
||||
align-items: baseline;
|
||||
gap: var(--default-padding);
|
||||
align-self: stretch;
|
||||
}
|
||||
|
||||
.menu a {
|
||||
color: black;
|
||||
}
|
||||
|
||||
.header-banner {
|
||||
|
|
@ -24,17 +83,44 @@
|
|||
left: 0;
|
||||
}
|
||||
|
||||
.footer {
|
||||
position: sticky;
|
||||
bottom: 0;
|
||||
left:0;
|
||||
.header-top {
|
||||
align-self: stretch;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
}
|
||||
|
||||
.header-element, .footer-element {
|
||||
margin: 5px;
|
||||
.header-top::after {
|
||||
content: "";
|
||||
}
|
||||
|
||||
.header-top img {
|
||||
max-height: 2.5rem;
|
||||
max-width: 10rem;
|
||||
}
|
||||
|
||||
.header-element, .menu-item {
|
||||
padding: var(--default-padding);
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.header-element {
|
||||
color: black;
|
||||
}
|
||||
|
||||
.menu-item {
|
||||
background-color: #80808000;
|
||||
transition: background-color 0.25s ease-in-out;
|
||||
-webkit-transition: background-color 0.25s ease-in-out;
|
||||
-moz-transition: background-color 0.25s ease-in-out;
|
||||
-ms-transition: background-color 0.25s ease-in-out;
|
||||
-o-transition: background-color 0.25s ease-in-out;
|
||||
}
|
||||
|
||||
.menu-item:hover {
|
||||
background-color: #80808080;
|
||||
}
|
||||
|
||||
.inline {
|
||||
display: inline-block;
|
||||
}
|
||||
|
|
@ -47,13 +133,19 @@ body {
|
|||
}
|
||||
|
||||
body main {
|
||||
margin: 10px;
|
||||
margin: calc(2 * var(--default-padding));
|
||||
}
|
||||
|
||||
.header-main {
|
||||
flex-grow: 1;
|
||||
}
|
||||
|
||||
/* Gradient background, but only on the overview page (and when choosing expired entries to delete) */
|
||||
.header-main:has(.joboffer-index) {
|
||||
background: linear-gradient(45deg, var(--blue) 0%, var(--yellow) 100%);
|
||||
background-size: cover;
|
||||
}
|
||||
|
||||
.centered {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
|
|
@ -74,16 +166,17 @@ body main {
|
|||
|
||||
.login-form {
|
||||
display: grid;
|
||||
grid-gap: 5px;
|
||||
grid-template: [retry-msg] "m m"
|
||||
[username] "ul ui"
|
||||
[password] "pl pi"
|
||||
[submit] "sb empty";
|
||||
padding: 5px;
|
||||
grid-gap: var(--default-padding);
|
||||
grid-template: [retry-msg] "m m"[username] "ul ui"[password] "pl pi"[submit] "sb empty";
|
||||
padding: var(--default-padding);
|
||||
border-style: solid;
|
||||
border-color: gray;
|
||||
border-radius: 20px;
|
||||
border-width: 2px;
|
||||
border-color: var(--blue);
|
||||
border-width: var(--default-padding);
|
||||
border-radius: var(--default-padding);
|
||||
-webkit-border-radius: var(--default-padding);
|
||||
-moz-border-radius: var(--default-padding);
|
||||
-ms-border-radius: var(--default-padding);
|
||||
-o-border-radius: var(--default-padding);
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -127,7 +220,7 @@ body main {
|
|||
[advanced] "ao ao"
|
||||
[submit] "sb sb"
|
||||
[footnote] "fn fn";
|
||||
padding: 5px;
|
||||
padding: var(--default-padding);
|
||||
}
|
||||
|
||||
.advanced-options {
|
||||
|
|
@ -211,39 +304,53 @@ body main {
|
|||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
justify-content: center;
|
||||
grid-gap: 5px;
|
||||
grid-gap: var(--default-padding);
|
||||
}
|
||||
|
||||
.joboffer-index-entry {
|
||||
width: 25em;
|
||||
margin: 5px;
|
||||
padding: 5px;
|
||||
width: 25rem;
|
||||
margin: var(--default-padding);
|
||||
padding: var(--default-padding);
|
||||
border-style: solid;
|
||||
border-color: gray;
|
||||
border-radius: 20px;
|
||||
border-width: 2px;
|
||||
border-color: var(--green);
|
||||
border-width: var(--default-padding);
|
||||
border-radius: var(--default-padding);
|
||||
-webkit-border-radius: var(--default-padding);
|
||||
-moz-border-radius: var(--default-padding);
|
||||
-ms-border-radius: var(--default-padding);
|
||||
-o-border-radius: var(--default-padding);
|
||||
background-color: white;
|
||||
}
|
||||
|
||||
.joboffer-index-entry.AwaitingReview, .joboffer-index-entry.UnPublished {
|
||||
background: pink;
|
||||
background: var(--light-yellow);
|
||||
border-style: dashed;
|
||||
border-color: var(--yellow);
|
||||
}
|
||||
|
||||
.joboffer-index-entry:target {
|
||||
background: LemonChiffon;
|
||||
background: var(--light-green);
|
||||
border-color: var(--dark-green);
|
||||
}
|
||||
|
||||
.column, .submission-preview {
|
||||
flex-direction:column
|
||||
flex-direction: column;
|
||||
gap: var(--default-padding);
|
||||
}
|
||||
|
||||
.link-button {
|
||||
margin: 5px;
|
||||
margin: var(--default-padding);
|
||||
border: solid;
|
||||
border-radius: 10px;
|
||||
border-color: black;
|
||||
color: black;
|
||||
padding: 5px;
|
||||
color: white;
|
||||
padding: var(--default-padding);
|
||||
text-decoration: none;
|
||||
background-color: var(--dark-blue);
|
||||
border-color: var(--blue);
|
||||
border-radius: var(--default-padding);
|
||||
-webkit-border-radius: var(--default-padding);
|
||||
-moz-border-radius: var(--default-padding);
|
||||
-ms-border-radius: var(--default-padding);
|
||||
-o-border-radius: var(--default-padding);
|
||||
}
|
||||
|
||||
.expired, .unconfirmed, .unreviewed {
|
||||
|
|
@ -265,7 +372,12 @@ body main {
|
|||
.modal-confirm-box {
|
||||
display: inline-block;
|
||||
border-style: solid;
|
||||
border-radius: 5px;
|
||||
border-color: var(--dark-blue);
|
||||
border-radius: var(--default-padding);
|
||||
-webkit-border-radius: var(--default-padding);
|
||||
-moz-border-radius: var(--default-padding);
|
||||
-ms-border-radius: var(--default-padding);
|
||||
-o-border-radius: var(--default-padding);
|
||||
}
|
||||
|
||||
input.modal-open-check:not(:checked)+.modal-confirm-box {
|
||||
|
|
@ -273,15 +385,23 @@ input.modal-open-check:not(:checked) + .modal-confirm-box {
|
|||
}
|
||||
|
||||
.modal-confirm-box>.modal-open-button.confirm {
|
||||
background-color: lightgreen;
|
||||
border-radius: 5px;
|
||||
padding: 5px;
|
||||
background-color: var(--green);
|
||||
padding: var(--default-padding);
|
||||
border-radius: var(--default-padding);
|
||||
-webkit-border-radius: var(--default-padding);
|
||||
-moz-border-radius: var(--default-padding);
|
||||
-ms-border-radius: var(--default-padding);
|
||||
-o-border-radius: var(--default-padding);
|
||||
}
|
||||
|
||||
.modal-confirm-box>.modal-open-button.retract {
|
||||
background-color: tomato;
|
||||
border-radius: 5px;
|
||||
padding: 5px;
|
||||
background-color: var(--yellow);
|
||||
padding: var(--default-padding);
|
||||
border-radius: var(--default-padding);
|
||||
-webkit-border-radius: var(--default-padding);
|
||||
-moz-border-radius: var(--default-padding);
|
||||
-ms-border-radius: var(--default-padding);
|
||||
-o-border-radius: var(--default-padding);
|
||||
}
|
||||
|
||||
input.modal-open-check:checked+.modal-confirm-box>.modal-open-button {
|
||||
|
|
@ -291,6 +411,7 @@ input.modal-open-check:checked + .modal-confirm-box > .modal-open-button {
|
|||
input.modal-open-check:not(:checked)+.modal-confirm-box>.modal-cancel-button {
|
||||
display: none;
|
||||
}
|
||||
|
||||
input.modal-open-check:not(:checked)+.modal-confirm-box>.modal-submit-button {
|
||||
visibility: hidden;
|
||||
}
|
||||
|
|
@ -310,6 +431,7 @@ input.modal-open-check:not(:checked) + .modal-confirm-box > .modal-submit-button
|
|||
.hideable-toggle:checked~label.hideable-label::after {
|
||||
content: "Show";
|
||||
}
|
||||
|
||||
.hideable-toggle:not(:checked)~label.hideable-label::after {
|
||||
content: "Hide";
|
||||
}
|
||||
|
|
@ -323,26 +445,27 @@ input.modal-open-check:not(:checked) + .modal-confirm-box > .modal-submit-button
|
|||
display: flex;
|
||||
align-items: center;
|
||||
position: sticky;
|
||||
background: var(--filter-bar-color);
|
||||
top: 120px;
|
||||
top: 8rem;
|
||||
box-sizing: border-box;
|
||||
left: 0;
|
||||
margin-bottom: 5px;
|
||||
padding: 5px;
|
||||
width: 100%;
|
||||
box-shadow: 0px 0px 10px 0px gray;
|
||||
background: white;
|
||||
margin-bottom: var(--default-padding);
|
||||
padding: var(--default-padding);
|
||||
border: var(--default-padding) solid var(--blue);
|
||||
width: fit-content;
|
||||
}
|
||||
|
||||
.joboffer-filters>.filter-label[for="awaiting-review"] {
|
||||
margin-left: var(--default-padding);
|
||||
border: solid;
|
||||
padding: 5px;
|
||||
border-color: gray;
|
||||
padding: var(--default-padding);
|
||||
border-color: var(--yellow);
|
||||
border-radius: 20px;
|
||||
border-width: 2px;
|
||||
border-width: var(--default-padding);
|
||||
}
|
||||
|
||||
#awaiting-review:checked~.joboffer-filters>.filter-label[for="awaiting-review"] {
|
||||
background: cyan;
|
||||
background: var(--light-yellow);
|
||||
}
|
||||
|
||||
#awaiting-review:checked~.joboffer-index>.joboffer-index-entry:not(.AwaitingReview) {
|
||||
|
|
|
|||
|
|
@ -6,9 +6,9 @@
|
|||
<div class="message">Username or Password incorrect!</div>
|
||||
{{/if}}
|
||||
|
||||
<label class="username-label" for="login-username">Username</label> <input id="login-username" class="username-input" type="text" name="username" autocomplete="username" required>
|
||||
<label class="password-label" for="login-password">Password</label> <input id="login-password" class="password-input" type="password" name="password" autocomplete="current-password" required><br />
|
||||
<button class="submit-button" type="submit">Login</button>
|
||||
<label class="username-label" for="login-username">Benutzername</label> <input id="login-username" class="username-input" type="text" name="username" autocomplete="username" required>
|
||||
<label class="password-label" for="login-password">Passwort</label> <input id="login-password" class="password-input" type="password" name="password" autocomplete="current-password" required><br />
|
||||
<button class="submit-button" type="submit">Anmelden</button>
|
||||
</form>
|
||||
</div>
|
||||
{{/base}}
|
||||
|
|
|
|||
|
|
@ -14,6 +14,5 @@
|
|||
{{> @partial-block }}
|
||||
</main>
|
||||
</div>
|
||||
{{> footer}}
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
<input id="{{> kind}}-{{> id}}" class="hidden modal-open-check" type="checkbox" name="pre-{{> kind}}" required>
|
||||
<div class="modal-confirm-box">
|
||||
<label for="{{> kind}}-{{> id}}" class="modal-open-button {{> kind}}">{{> action}}</label>
|
||||
<label for="{{> kind}}-{{> id}}" class="modal-cancel-button {{> kind}}">Cancel</label>
|
||||
<button type="submit" class="modal-submit-button">Confirm {{> action}}</button>
|
||||
<label for="{{> kind}}-{{> id}}" class="modal-cancel-button {{> kind}}">Abbrechen</label>
|
||||
<button type="submit" class="modal-submit-button">{{> action}} bestätigen</button>
|
||||
</div>
|
||||
</form>
|
||||
|
|
|
|||
|
|
@ -1,15 +1,18 @@
|
|||
Moin,
|
||||
Guten Tag,
|
||||
|
||||
Es wurde eine Stellenausschreibung mit dieser E-Mail Address als Kontakt-Address in unserer Jobbörse eingereicht.
|
||||
es wurde eine Stellenausschreibung mit dieser E-Mail Addresse als Kontakt-Addresse auf unserer Jobbörse eingereicht.
|
||||
|
||||
Bitte überprüfen Sie die Stellenausschreibung unter dem folgenden Link.
|
||||
Bitte überprüfen Sie die Stellenausschreibung unter folgendem Link:
|
||||
|
||||
{{{confirmation_link}}}
|
||||
|
||||
Dort können sie die Stellenausschreibung bestätigen oder zurückziehen.
|
||||
Sie können Ihre Stellenausschreibung dort bestätigen oder zurückziehen.
|
||||
|
||||
Nach der Bestätigung kann der Link genutzt werden um die Stellenausschreibung vor Ablauf der Gültigkeit zu löschen.
|
||||
Außerdem kann der Link nach der Bestätigung genutzt werden, um die Stellenausschreibung vor Ablauf ihrer Gültigkeit zu löschen.
|
||||
|
||||
Freundliche Grüße
|
||||
Mit freundlichen Grüßen
|
||||
Das Team der gemeinsamen Jobbörse der Fachschaften Informatik und Mathematik der CAU Kiel
|
||||
|
||||
Das Team der FS-InfMath Jobbörse
|
||||
---
|
||||
|
||||
Diese Nachricht wurde automatisch erstellt.
|
||||
|
|
|
|||
|
|
@ -1,9 +1,12 @@
|
|||
Moin,
|
||||
Guten Tag,
|
||||
|
||||
Es wurde eine Stellenausschreibung mit dieser E-Mail Address als Kontakt-Address in unserer Jobbörse veröffentlicht.
|
||||
es wurde eine Stellenausschreibung mit dieser E-Mail Addresse als Kontakt-Addresse auf unserer Jobbörse veröffentlicht.
|
||||
|
||||
{{{highlight_link}}}
|
||||
|
||||
Freundliche Grüße
|
||||
Mit freundlichen Grüßen
|
||||
Das Team der gemeinsamen Jobbörse der Fachschaften Informatik und Mathematik der CAU Kiel
|
||||
|
||||
Das Team der FS-InfMath Jobbörse
|
||||
---
|
||||
|
||||
Diese Nachricht wurde automatisch erstellt.
|
||||
|
|
|
|||
|
|
@ -1,3 +1,3 @@
|
|||
Automatischer Hinweis: Eine neue Stellenausschreibung wurde zur Jobbörse eingereicht!
|
||||
Automatischer Hinweis: Auf der Jobbörse wurde eine neue Stellenanzeige eingereicht!
|
||||
|
||||
{{{highlight_link}}}
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
{{#if msg}}
|
||||
{{msg}}
|
||||
{{else}}
|
||||
Es scheint ein un-kategorisiertes Problem mit ihrer Anfrage zu bestehen.
|
||||
Es scheint ein nicht kategorisiertes Problem mit Ihrer Anfrage zu bestehen.
|
||||
{{/if}}
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
<div class="centered">
|
||||
<div>
|
||||
Die Aktion konnte nicht durchgeführt werden.<br />
|
||||
Authentifizierung notwendig, bitte loggen sie sich ein.
|
||||
Authentifizierung notwendig, bitte loggen Sie sich ein.
|
||||
</div>
|
||||
</div>
|
||||
{{/base}}
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
{{#> base}}
|
||||
<div class="centered">
|
||||
<div>
|
||||
Die von ihnen Angeforderte Resource scheint nicht zu existieren!
|
||||
Die von Ihnen angeforderte Ressource scheint nicht zu existieren!
|
||||
</div>
|
||||
</div>
|
||||
{{/base}}
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
<div>
|
||||
Die Aktion konnte nicht durchgeführt werden.<br />
|
||||
Es wurden zu viele Anfragen in zu kurzer Zeit gestellt.<br />
|
||||
Bitte warten etwas bevor sie weitere Anfragen stellen.
|
||||
Bitte warten Sie etwas, bevor Sie weitere Anfragen stellen.
|
||||
</div>
|
||||
</div>
|
||||
{{/base}}
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
{{#> base}}
|
||||
<div class="centered">
|
||||
<div>
|
||||
Ein interner Fehler ist bei der bearbeitung ihrer Anfrage aufgetreten, bitte versuchen sie es erneut!<br />
|
||||
Sollte der Fehler weiterhin bestehen, wenden sie sich bitte an einen Administrator!
|
||||
Bei der Bearbeitung Ihrer Anfrage ist ein Fehler aufgetreten, bitte versuchen Sie es erneut!<br />
|
||||
Sollte der Fehler weiterhin bestehen, wenden Sie sich bitte an einen Administrator!
|
||||
</div>
|
||||
</div>
|
||||
{{/base}}
|
||||
|
|
|
|||
|
|
@ -1,26 +0,0 @@
|
|||
<footer class="footer">
|
||||
<nav class="footer-inner">
|
||||
{{#each base.links as |link|}}
|
||||
{{#unless @first}}<span>|</span>{{/unless}}<a class="footer-element" href="{{link.url}}"><h3 class="inline">{{link.title}}</h3></a>
|
||||
{{/each}}
|
||||
<span>|</span><a class="footer-element" href="{{base.routes.licenses}}"><h3 class="inline">Third-party Licenses</h3></a>
|
||||
<span>|</span><a class="footer-element" href="{{base.routes.joboffer_create}}"><h3 class="inline">Stellenanzeige Einreichen</h3></a>
|
||||
{{#if user}}
|
||||
<span>|</span><a class="footer-element" href="{{base.routes.joboffers_delete_expired}}" title="Delete all expired Job Offers"><h3 class="inline">Delete Expired</h3></a>
|
||||
<span>|</span><label class="footer-element" for="submit-sync" tabindex="0">
|
||||
<h3 class="inline" title="Reload Joboffer Metadata from Disk">Re-Sync</h3>
|
||||
<form class="hidden" method="post" action="{{base.routes.sync}}">
|
||||
<input type="submit" id="submit-sync" class="hidden">
|
||||
</form>
|
||||
</label>
|
||||
<span>|</span><label class="footer-element" for="submit-logout" tabindex="0">
|
||||
<h3 class="inline">Logout</h3>
|
||||
<form class="hidden" method="post" action="{{base.routes.logout}}">
|
||||
<input type="submit" id="submit-logout" class="hidden">
|
||||
</form>
|
||||
</label
|
||||
{{else}}
|
||||
<span>|</span><a class="footer-element" href="{{base.routes.login}}"><h3 class="inline">Reviewer Login</h3></a>
|
||||
{{/if}}
|
||||
</nav>
|
||||
</footer>
|
||||
|
|
@ -11,6 +11,15 @@
|
|||
{{/if}}
|
||||
<header class="header">
|
||||
<nav class="header-inner">
|
||||
<a class="header-element" href="{{base.routes.joboffer_overview}}"><h1>Jobbörse</h1></a>
|
||||
<div class="header-top">
|
||||
<a class="header-element" href="https://www.fs-infmath.uni-kiel.de/wiki/Hauptseite">
|
||||
<img src="https://www.fs-infmath.uni-kiel.de/w/images/9/9f/Logo_gro%C3%9F_bunt_kiel.svg">
|
||||
</a>
|
||||
<a class="header-element" href="{{base.routes.index}}">
|
||||
<h1>Jobbörse</h1>
|
||||
</a>
|
||||
</div>
|
||||
{{> menu}}
|
||||
</nav>
|
||||
<div class="header-bottom"></div>
|
||||
</header>
|
||||
|
|
|
|||
|
|
@ -6,21 +6,22 @@
|
|||
|
||||
{{#unless job_offer.confirmed}}
|
||||
{{#if email }}
|
||||
Eine E-Mail mit einem Bestätigungslink wurde an die angegebene Kontakt-Adresse versand. <br />
|
||||
Eine E-Mail mit einem Bestätigungslink wurde an die angegebene Kontakt-Adresse gesendet.<br />
|
||||
{{else}}
|
||||
Die Stellenausschreibung muss noch bestätigt werden, aber der Versand von Bestätigungsmails ist derzeit nicht möglich.<br />
|
||||
Wir entschuldigen uns für etwaige Unannehmlichkeiten, die dadurch entstehen.
|
||||
{{/if}}
|
||||
|
||||
{{# if job_offer.reviewed }}
|
||||
Da ein Review bereits erfolgt ist, wird die Stellenausschreibung mit erfolgter Bestätigung veröffentlicht.<br />
|
||||
{{else}}
|
||||
Die Stellenausschreibung wurde zum Review eingereiht. <br />
|
||||
Sobald Review und Bestätigung erfolgt sind wird die Stellenausschreibung veröffentlicht. <br />
|
||||
Die Stellenausschreibung wurde zum Review eingereicht.<br />
|
||||
Sobald Review und Bestätigung erfolgt sind, wird die Stellenausschreibung veröffentlicht.<br />
|
||||
{{/if}}
|
||||
{{else}}
|
||||
{{#unless job_offer.reviewed}}
|
||||
Die Stellenausschreibung wurde zum Review eingereiht. <br />
|
||||
Sobald ein Review erfolgt ist wird die Stellenausschreibung veröffentlicht. <br />
|
||||
Die Stellenausschreibung wurde zum Review eingereicht.<br />
|
||||
Sobald ein Review erfolgt ist, wird die Stellenausschreibung veröffentlicht.<br />
|
||||
{{else}}
|
||||
Die Stellenausschreibung wurde veröffentlicht!
|
||||
{{/unless}}
|
||||
|
|
|
|||
|
|
@ -1,19 +1,19 @@
|
|||
{{#> base}}
|
||||
<div class="centered">
|
||||
<form class="submission-form" method="post" enctype="multipart/form-data">
|
||||
<label class="offer-title-title" for="offer-title">Title</label>
|
||||
<label class="offer-title-title" for="offer-title">Titel der Anzeige</label>
|
||||
<input class="offer-title-field" id="offer-title" type="text" name="title" autocomplete="on" autofocus placeholder="z.B. HiWi-Gesucht" required><br />
|
||||
|
||||
<label class="submitter-title" for="offer-offering-party">Anbieter</label>
|
||||
<label class="submitter-title" for="offer-offering-party">Anbieter/Unternehmen</label>
|
||||
<input class="submitter-field" id="offer-offering-party" type="text" name="offering_party" autocomplete="organization" placeholder="z.B. Weihnachtsmann & Co.KG. oder Institut für Informatik der CAU Kiel" required><br />
|
||||
|
||||
<label class="contact-title" for="contact-data">Kontakt E-Mail Address<sup>1</sup></label>
|
||||
<label class="contact-title" for="contact-data">Kontakt-E-Mail-Addresse<sup>1</sup></label>
|
||||
<input class="contact-field" id="contact-data" type="email" autocomplete="email" name="offer-contact" placeholder="max.mustermann@example.com" required>
|
||||
|
||||
<label class="publish-contact-title" for="publish-contact-data">Kontakt Adresse Öffentlich</label>
|
||||
<label class="publish-contact-title" for="publish-contact-data">E-Mail-Adresse veröffentlichen</label>
|
||||
<input class="publish-contact-checkbox" id="publish-contact-data" type="checkbox" name="offer-contact-visible" value="visible"><br />
|
||||
|
||||
<label class="expiry-title" for="offer-expiry">Gültig bis (Wenn nicht angegeben, 6 Monate nach Einsendung)</label>
|
||||
<label class="expiry-title" for="offer-expiry">Gültig bis (wenn nicht angegeben, 6 Monate nach Einsendung)</label>
|
||||
<input class="expiry-select" id="offer-expiry" type="date" name="offer_expiry" min="{{base.date}}"><br />
|
||||
|
||||
<fieldset class="attachment-area">
|
||||
|
|
@ -23,7 +23,7 @@
|
|||
<hr />
|
||||
{{/unless}}
|
||||
<div>
|
||||
<input type="text" autocomplete="on" name="file_title[]" placeholder="Title"/>
|
||||
<input type="text" autocomplete="on" name="file_title[]" placeholder="Anzeigename"/>
|
||||
<input type="file" accept=".pdf" name="file[]"/>
|
||||
<div/>
|
||||
{{/each}}
|
||||
|
|
@ -36,7 +36,7 @@
|
|||
<hr />
|
||||
{{/unless}}
|
||||
<div>
|
||||
<input type="text" autocomplete="on" name="link_title[]" placeholder="Online-Stellenausschreibung" />
|
||||
<input type="text" autocomplete="on" name="link_title[]" placeholder="z.B. Online-Stellenausschreibung" />
|
||||
<input type="url" autocomplete="url" name="link_url[]" pattern="https://.+" placeholder="{{@root.base.routes.index}}" />
|
||||
<div/>
|
||||
{{/each}}
|
||||
|
|
@ -47,20 +47,20 @@
|
|||
</div>
|
||||
|
||||
<div class="footnotes">
|
||||
1: Die Kontakt Address wird für eine Bestätigungsmail und eventuelle Rückfragen benötigt, sie kann optional auch öffentlich als Teil des Stellenausschreibungseintrags angezeigt werden.<br />
|
||||
2: Link URLs müssen mit "https://" beginnen
|
||||
1: Die Kontakt-Addresse wird für eine Bestätigungsmail und eventuelle Rückfragen benötigt, sie kann optional auch öffentlich als Teil der Stellenausschreibung angezeigt werden.<br />
|
||||
2: Link-URLs müssen mit "https://" beginnen
|
||||
</div>
|
||||
|
||||
{{#if user }}
|
||||
<fieldset class="advanced-options">
|
||||
<legend>Erweiterte Optionen für Reviewer</legend>
|
||||
<label class="backdate-title" for="offer-backdate">Eingegangen (Optionale Rückdatierung)</label>
|
||||
<label class="backdate-title" for="offer-backdate">Eingangsdatum (optionale Rückdatierung)</label>
|
||||
<input class="backdate-select" id="offer-backdate" type="datetime-local" name="backdate"><br />
|
||||
|
||||
<label class="review-title" for="approval"checked>Als bereits ge-reviwed markieren</label>
|
||||
<label class="review-title" for="approval"checked>Als bereits ge-reviewed markieren</label>
|
||||
<input id="approval" class="review-checkbox" type="checkbox" name="pre_approved" value="approved" checked><br />
|
||||
|
||||
<label class="review-title" for="confirmation">Überspringe die Bestätigung für diese Stellenausschreibung</label>
|
||||
<label class="review-title" for="confirmation">Bestätigungsmail für diese Anzeige überspringen</label>
|
||||
<input id="confirmation" class="confirmation-checkbox" type="checkbox" name="skip_confirmation" value="skip" checked><br />
|
||||
|
||||
<label class="infinite-title" for="permanent">Permanente Stellenausschreibung</label>
|
||||
|
|
@ -68,7 +68,7 @@
|
|||
</fieldset>
|
||||
{{/if}}
|
||||
|
||||
<button class="submit-button" type="submit">Submit</button>
|
||||
<button class="submit-button" type="submit">Stellenausschreibung einreichen</button>
|
||||
</form>
|
||||
</div>
|
||||
{{/base}}
|
||||
|
|
|
|||
|
|
@ -7,13 +7,13 @@
|
|||
{{> job_offer/overview-entry job_offer=job_offer base=../base user=../user}}
|
||||
</label>
|
||||
{{else}}
|
||||
There are no expired job offers to delete!
|
||||
Es gibt keine zu löschenden Stellenanzeigen!
|
||||
{{/each}}
|
||||
</div>
|
||||
{{#if expired_job_offers }}
|
||||
<input type="hidden" name="only_expired" value="true">
|
||||
<hr />
|
||||
<button type="submit">Delete selected Job Offers</button>
|
||||
<button type="submit">Ausgewählte Stellenanzeigen löschen</button>
|
||||
{{/if}}
|
||||
</form>
|
||||
{{/base}}
|
||||
|
|
|
|||
|
|
@ -3,19 +3,19 @@
|
|||
<form class="submission-form" method="post" enctype="multipart/form-data">
|
||||
<input type="hidden" name="hash" value="{{job_offer.hash}}" />
|
||||
|
||||
<label class="offer-title-title" for="offer-title">Title</label>
|
||||
<label class="offer-title-title" for="offer-title">Titel der Anzeige</label>
|
||||
<input class="offer-title-field" id="offer-title" type="text" name="title" autocomplete="on" autofocus value="{{job_offer.title}}" required><br />
|
||||
|
||||
<label class="submitter-title" for="offer-offering-party">Anbieter</label>
|
||||
<label class="submitter-title" for="offer-offering-party">Anbieter/Unternehmen</label>
|
||||
<input class="submitter-field" id="offer-offering-party" type="text" name="offering_party" autocomplete="organization" value="{{job_offer.offering_party}}" required><br />
|
||||
|
||||
<label class="contact-title" for="contact-data">Kontakt E-Mail Address<sup>1</sup></label>
|
||||
<label class="contact-title" for="contact-data">Kontakt-E-Mail-Addresse<sup>1</sup></label>
|
||||
<input class="contact-field" id="contact-data" type="email" autocomplete="email" name="offer-contact" value="{{job_offer.contact_data}}" required>
|
||||
|
||||
<label class="publish-contact-title" for="publish-contact-data">Kontakt Adresse Öffentlich</label>
|
||||
<label class="publish-contact-title" for="publish-contact-data">E-Mail-Adresse öffentlich</label>
|
||||
<input class="publish-contact-checkbox" id="publish-contact-data" type="checkbox" name="offer-contact-visible" value="visible" {{#if job_offer.public_contact_data}}checked="checked"{{/if}}><br />
|
||||
|
||||
<label class="expiry-title" for="offer-expiry">Gültig bis (Wenn nicht angegeben, 6 Monate nach Einsendung)</label>
|
||||
<label class="expiry-title" for="offer-expiry">Gültig bis (wenn nicht angegeben, 6 Monate nach Einsendung)</label>
|
||||
<input class="expiry-select" id="offer-expiry" type="date" name="offer_expiry" {{#if job_offer.expiry_date }}value="{{job_offer.expiry_date}}"{{/if}}><br />
|
||||
|
||||
<fieldset class="attachment-area">
|
||||
|
|
@ -27,9 +27,9 @@
|
|||
{{/unless}}
|
||||
<input type="text" autocomplete="on" name="file_title_edit[]" value="{{attachment.title}}" />
|
||||
<input type="text" name="file_name_edit[]" value="{{attachment.file_name}}" />
|
||||
| <a href="{{attachment.attachment_location}}" target="_blank">View Attachment</a>
|
||||
| <label for="delete-{{@index}}">Delete Attachment</label> <input id="delete-{{@index}}" type="checkbox" name="delete_attachment[]" value="{{@index}}" />
|
||||
| <label for="replace-{{@index}}">Replace Attachment</label> <input id="replace-{{@index}}" type="file" accept=".pdf" name="file_replace[]" title="Replace Attachment" />
|
||||
| <a href="{{attachment.attachment_location}}" target="_blank">Anhang öffnen</a>
|
||||
| <label for="delete-{{@index}}">Anhang löschen</label> <input id="delete-{{@index}}" type="checkbox" name="delete_attachment[]" value="{{@index}}" />
|
||||
| <label for="replace-{{@index}}">Anhang ersetzen</label> <input id="replace-{{@index}}" type="file" accept=".pdf" name="file_replace[]" title="Anhang ersetzen" />
|
||||
<div/>
|
||||
{{/each}}
|
||||
{{#each form.remaining_attachments }}
|
||||
|
|
@ -41,7 +41,7 @@
|
|||
{{/if}}
|
||||
{{/unless}}
|
||||
<div>
|
||||
<input type="text" autocomplete="on" name="file_title[]" placeholder="Title"/>
|
||||
<input type="text" autocomplete="on" name="file_title[]" placeholder="Anzeigename"/>
|
||||
<input type="file" accept=".pdf" name="file[]"/>
|
||||
<div/>
|
||||
{{/each}}
|
||||
|
|
@ -65,14 +65,14 @@
|
|||
</div>
|
||||
|
||||
<div class="footnotes">
|
||||
1: Die Kontakt Address wird für eine Bestätigungsmail und eventuelle Rückfragen benötigt, sie kann optional auch öffentlich als Teil des Stellenausschreibungseintrags angezeigt werden.<br />
|
||||
2: Link URLs müssen mit "https://" beginnen
|
||||
1: Die Kontakt-Addresse wird für eine Bestätigungsmail und eventuelle Rückfragen benötigt, sie kann optional auch öffentlich als Teil der Stellenausschreibung angezeigt werden.<br />
|
||||
2: Link-URLs müssen mit "https://" beginnen
|
||||
</div>
|
||||
|
||||
{{#if user }}
|
||||
<fieldset class="advanced-options">
|
||||
<legend>Erweiterte Optionen für Reviewer</legend>
|
||||
<label class="backdate-title" for="offer-backdate">Eingegangen (Optionales Umdatieren)</label>
|
||||
<label class="backdate-title" for="offer-backdate">Eingangsdatum (optionales Umdatieren)</label>
|
||||
<input class="backdate-select" id="offer-backdate" type="datetime-local" name="backdate"><br />
|
||||
|
||||
<label class="infinite-title" for="permanent">Permanente Stellenausschreibung</label>
|
||||
|
|
@ -80,7 +80,7 @@
|
|||
</fieldset>
|
||||
{{/if}}
|
||||
|
||||
<button class="submit-button" type="submit">Submit</button>
|
||||
<button class="submit-button" type="submit">Stellenausschreibung aktualisieren</button>
|
||||
</form>
|
||||
</div>
|
||||
{{/base}}
|
||||
|
|
|
|||
|
|
@ -1,19 +1,22 @@
|
|||
{{#> base}}
|
||||
|
||||
<h1>FAQ</h1>
|
||||
<div>
|
||||
<h2>Was ist zu beachten?</h2>
|
||||
<p>Die Jobbörse wird durch einen Teil der freiwilligen aktiven Mitglieder der Fachschaften betreut,
|
||||
dies kann vor allem außerhalb der Vorlesungszeit und im Prüfungszeitraum zu längeren bearbeitungszeiten bei E-mail-Einreichungen und Reviews führen.</p>
|
||||
dies kann vor allem außerhalb der Vorlesungszeit und während der Prüfungszeiträume zu längeren Bearbeitungszeiten bei E-Mail-Einreichungen und Reviews führen.</p>
|
||||
|
||||
<p>Die Aktuellen Semester- und Prüfungszeiträume sollten sich <a href="https://www.uni-kiel.de/gf-praesidium/de/termine/semesterzeiten">hier</a> finden.</p>
|
||||
<p>Die Aktuellen Semester- und Prüfungszeiträume sollten Sie <a href="https://www.uni-kiel.de/gf-praesidium/de/termine/semesterzeiten">hier</a> finden.</p>
|
||||
|
||||
<p class="italic-text">Bei technischen Problemen oder wenn Sie das Formular nicht nutzen können bzw. dürfen, senden Sie bitte eine E-Mail an <a href="{{mail}}">{{mail}}</a>. Wir helfen Ihnen gerne!</p>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<h2>Laufzeit</h2>
|
||||
<p>Einreichungen werden automatisch entfernt sobald das jeweilige Ablaufdatum verstrichen ist</p>
|
||||
<p>Einreichungen werden automatisch entfernt, sobald das jeweilige Ablaufdatum verstrichen ist</p>
|
||||
<p>Einreichungen ohne explizit angegebenes Ablaufdatum haben ein implizites Ablaufdatum 6 Monate (180 Tage) nach Einreichung.</p>
|
||||
{{#if mail}}
|
||||
<p>Um eine Einreichung früher zu entfernen informieren sie uns bitte per E-Mail unter <a href="{{mail}}">{{mail}}</a></p>
|
||||
<p>Um eine Einreichung früher zu entfernen, informieren Sie uns bitte per E-Mail unter <a href="{{mail}}">{{mail}}</a>.</p>
|
||||
{{/if}}
|
||||
</div>
|
||||
|
||||
|
|
@ -25,19 +28,19 @@
|
|||
<div>
|
||||
<h2>Wie kann eine Einreichung erfolgen?</h2>
|
||||
<p>Der bevorzugte Weg für Einreichungen ist das <a href="{{base.routes.joboffer_create}}">Web-Formular</a>.<p/>
|
||||
<p>Eine zügige bearbeitung von Einreichungen per E-Mail kann nicht garantiert werden,
|
||||
insbesondere außerhalb des Vorlesungszeitraums und im Prüfungszeitraum.</p>
|
||||
<p>Eine zügige Bearbeitung von Einreichungen per E-Mail kann nicht garantiert werden,
|
||||
insbesondere außerhalb des Vorlesungszeitraums und während der Prüfungszeiträume.</p>
|
||||
</div>
|
||||
|
||||
{{#if mail}}
|
||||
<div>
|
||||
<h2>Ich habe keine Bestätigungsmail erhalten!</h2>
|
||||
Die Bestätigungsmail werden automatisch und unverzüglich versand sobald das Web-Formular erfolgreich auf dem Server eingegangen ist und die Einreichung gespeichert wurde.<br />
|
||||
Daraufhin sollten sie zu einer ersten Vorschau der eingereichten Stellenausschreibung gebracht worden sein, mit entsprechendem Text darüber das eine Bestätigungsmail versand wurde.<br />
|
||||
Diese sollten innerhalb weniger Minuten bei ihnen eingehen, meist jedoch schneller.
|
||||
Die Bestätigungsmails werden automatisch und unverzüglich gesendet, sobald das Web-Formular erfolgreich auf dem Server eingegangen ist und die Einreichung gespeichert wurde.<br />
|
||||
Daraufhin sollten Sie zu einer ersten Vorschau der eingereichten Stellenausschreibung gebracht worden sein, mit entsprechendem Text darüber, dass eine Bestätigungsmail versandt wurde.<br />
|
||||
Diese sollten innerhalb weniger Minuten bei Ihnen eingehen, meist jedoch schneller.
|
||||
|
||||
Sollten sie nicht Zeitnah eine Bestätigungsmail erhalten,
|
||||
schauen sie bitte erst in ihren Spam/Junk-Ordner und wenden sie sich dann an <a href="{{mail}}">{{mail}}</a>.
|
||||
Sollten Sie nicht zeitnah eine Bestätigungsmail erhalten,
|
||||
schauen sie bitte erst in ihren Spam/Junk-Ordner und wenden Sie sich dann ggf. an <a href="{{mail}}">{{mail}}</a>.
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
|
|
@ -46,7 +49,21 @@
|
|||
Dies kann primär zwei Gründe haben:
|
||||
<ol>
|
||||
<li>Sie haben zwar den Link geöffnet, aber unter der Vorschau nicht auf bestätigen/veröffentlichen geklickt.</li>
|
||||
<li>Es ist unsererseits noch kein review der Einreichung erfolgt.</li>
|
||||
<li>Es ist unsererseits noch kein Review der Einreichung erfolgt.</li>
|
||||
</ol>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<h2>Werden die Stellenausschreibungen vor Ort ausgehangen?</h2>
|
||||
Nein, die Fachschaft verfügt aktuell nicht über ein analoges „Schwarzes Brett“
|
||||
und kann Stellenanzeigen somit auch nicht aushängen.
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<h2>Andere Job-Portale</h2>
|
||||
Falls Sie noch weitere Job-Portale suchen, auf denen Sie Ihre Stellenausschreibungen schalten können,
|
||||
finden Sie auch in unserem
|
||||
<a href="https://www.fs-infmath.uni-kiel.de/wiki/Frequently_Asked_Questions#Jobs" target"_blank">FAQ für Internationale Studierende</a>
|
||||
eine Liste von Job-Portalen.
|
||||
</div>
|
||||
{{/base}}
|
||||
|
|
|
|||
|
|
@ -22,7 +22,7 @@
|
|||
|
||||
{{# if job_offer.contact_data }}
|
||||
<br />
|
||||
Kontakt Adresse: <a href="mailto:{{job_offer.contact_data}}">{{job_offer.contact_data}}</a>
|
||||
Kontakt-Adresse: <a href="mailto:{{job_offer.contact_data}}">{{job_offer.contact_data}}</a>
|
||||
{{/if}}
|
||||
|
||||
{{#if job_offer.attachments }}
|
||||
|
|
@ -68,10 +68,10 @@
|
|||
{{#if job_offer.actions.highlight_link }}
|
||||
<div>ID: <a href="{{job_offer.actions.highlight_link}}" >{{job_offer.id}}</a></div>
|
||||
{{/if}}
|
||||
<div>Review Status: <span class="{{#unless job_offer.reviewed}}unreviewed{{/unless}}">{{job_offer.status.review_status}}</span></div>
|
||||
<div>Confirmation Status: <span class="{{#unless job_offer.confirmed}}unconfirmed{{/unless}}">{{job_offer.status.confirmation_status.type}}</span></div>
|
||||
<div>Review-Status: <span class="{{#unless job_offer.reviewed}}unreviewed{{/unless}}">{{job_offer.status.review_status}}</span></div>
|
||||
<div>Bestätigungsstatus: <span class="{{#unless job_offer.confirmed}}unconfirmed{{/unless}}">{{job_offer.status.confirmation_status.type}}</span></div>
|
||||
{{#if job_offer.actions.confirmation_link}}
|
||||
<div><a href="mailto:{{job_offer.contact_data}}?body=Confirmation%20Link:%20{{job_offer.actions.confirmation_link}}" >Manual Confirmation Mail</a></div>
|
||||
<div><a href="mailto:{{job_offer.contact_data}}?body=Confirmation%20Link:%20{{job_offer.actions.confirmation_link}}" >Manuelle Bestätigungsmail senden</a></div>
|
||||
{{/if}}
|
||||
{{/unless}}
|
||||
|
||||
|
|
@ -82,7 +82,7 @@
|
|||
{{#> confirm-modal}}
|
||||
{{#*inline "id"}}{{job_offer.id}}{{/inline}}
|
||||
{{#*inline "kind"}}unpublish{{/inline}}
|
||||
{{#*inline "action"}}{{#if job_offer.published}}Un-Publish{{else}}Retract Review{{/if}}{{/inline}}
|
||||
{{#*inline "action"}}{{#if job_offer.published}}Veröffentlichung zurückziehen{{else}}Review zurückziehen{{/if}}{{/inline}}
|
||||
{{#*inline "formaction"}}{{job_offer.actions.unpublish_url}}{{/inline}}
|
||||
{{/confirm-modal}}
|
||||
{{/if}}
|
||||
|
|
@ -91,7 +91,7 @@
|
|||
{{#> confirm-modal}}
|
||||
{{#*inline "id"}}{{job_offer.id}}{{/inline}}
|
||||
{{#*inline "kind"}}publish{{/inline}}
|
||||
{{#*inline "action"}}{{#if job_offer.confirmed}}Publish{{else}}Review{{/if}}{{/inline}}
|
||||
{{#*inline "action"}}{{#if job_offer.confirmed}}Veröffentlichen{{else}}Als gereviewed markieren{{/if}}{{/inline}}
|
||||
{{#*inline "formaction"}}{{job_offer.actions.publish_url}}{{/inline}}
|
||||
{{/confirm-modal}}
|
||||
{{/if}}
|
||||
|
|
@ -101,7 +101,7 @@
|
|||
{{#> confirm-modal}}
|
||||
{{#*inline "id"}}{{job_offer.id}}{{/inline}}
|
||||
{{#*inline "kind"}}delete{{/inline}}
|
||||
{{#*inline "action"}}Delete{{/inline}}
|
||||
{{#*inline "action"}}Löschen{{/inline}}
|
||||
{{#*inline "formaction"}}{{job_offer.actions.delete_url}}{{/inline}}
|
||||
{{/confirm-modal}}
|
||||
{{/if}}
|
||||
|
|
|
|||
|
|
@ -1,13 +1,13 @@
|
|||
{{#> base}}
|
||||
{{#if user}}
|
||||
<input id="awaiting-review" class="hidden" type="checkbox">
|
||||
<div class="joboffer-filters .shadow"><span class="bold-text">Filter:</span> <label class="filter-label" for="awaiting-review">Awaiting Review</label></div>
|
||||
<div class="joboffer-filters .shadow"><span class="bold-text">Filter:</span> <label class="filter-label" for="awaiting-review">Noch nicht gereviewed</label></div>
|
||||
{{/if}}
|
||||
<div class="joboffer-index">
|
||||
{{#each job_offers as |job_offer|}}
|
||||
{{> job_offer/overview-entry job_offer=job_offer base=../base user=../user}}
|
||||
{{else}}
|
||||
There are currently no published job offers!
|
||||
Aktuell gibt es keine veröffentlichten Stellenanzeigen!
|
||||
{{/each}}
|
||||
</div>
|
||||
{{/base}}
|
||||
|
|
|
|||
|
|
@ -3,9 +3,9 @@
|
|||
<div>
|
||||
Die Stellenausschreibung wurde erfolgreich bestätigt!<br />
|
||||
{{# if is_awaiting_review}}
|
||||
Sobald ein Review erfolgt ist wird die Stellenausschreibung veröffentlicht! <br />
|
||||
Sobald ein Review erfolgt ist, wird die Stellenausschreibung veröffentlicht!<br />
|
||||
{{else}}
|
||||
Da ein Review bereits erfolgt ist, wird sie damit ab sofort veröffentlicht! <br />
|
||||
Da ein Review bereits erfolgt ist, ist die Stellenausschreibung ab sofort in der Übersicht!<br />
|
||||
{{/if}}
|
||||
<br />
|
||||
<nav>
|
||||
|
|
|
|||
33
packages/jobboerse/templates/menu.hb
Normal file
33
packages/jobboerse/templates/menu.hb
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
<nav class="menu">
|
||||
{{#each base.links as |link|}}
|
||||
<a class="menu-item" href="{{link.url}}">
|
||||
<h3 class="inline">{{link.title}}</h3>
|
||||
</a>
|
||||
{{/each}}
|
||||
<a class="menu-item" href="{{base.routes.licenses}}">
|
||||
<h3 class="inline">Drittanbieter-Lizenzen</h3>
|
||||
</a>
|
||||
<a class="menu-item" href="{{base.routes.joboffer_create}}">
|
||||
<h3 class="inline">Stellenanzeige einreichen</h3>
|
||||
</a>
|
||||
{{#if user}}
|
||||
<a class="menu-item" href="{{base.routes.joboffers_delete_expired}}"
|
||||
title="Alle abgelaufenen Stellenanzeigen löschen">
|
||||
<h3 class="inline">Abgelaufene löschen</h3>
|
||||
</a>
|
||||
<label class="menu-item" for="submit-sync" tabindex="0">
|
||||
<h3 class="inline" title="Reload Joboffer Metadata from Disk">Re-Sync</h3>
|
||||
<form class="hidden" method="post" action="{{base.routes.sync}}">
|
||||
<input type="submit" id="submit-sync" class="hidden">
|
||||
</form>
|
||||
</label>
|
||||
<label class="menu-item" for="submit-logout" tabindex="0">
|
||||
<h3 class="inline">Abmelden</h3>
|
||||
<form class="hidden" method="post" action="{{base.routes.logout}}">
|
||||
<input type="submit" id="submit-logout" class="hidden">
|
||||
</form>
|
||||
</label {{else}} <a class="menu-item" href="{{base.routes.login}}">
|
||||
<h3 class="inline">Fachschaftler-Login</h3>
|
||||
</a>
|
||||
{{/if}}
|
||||
</nav>
|
||||
3
packages/jobboerse/templates/webhook/newoffer.hb
Normal file
3
packages/jobboerse/templates/webhook/newoffer.hb
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
Stellenausschreibung veröffentlicht:
|
||||
[**{{{title}}}**]({{{link}}})
|
||||
*{{{company}}}*
|
||||
Loading…
Add table
Add a link
Reference in a new issue
I try to use rustls for tls instead of openssl as it is annoying to get working on windows see the comment above the ldap3 dependency. Does awc support that as an alternative?
Also we now have two tls libraries in the dependencies which will bloat the binary and intermediate compile artefacts and we already had problems with the size when compiling on metabo as we only have ~2GB in /tmp.
Ok, I seem to have overlooked that comment. I have switched to rustls now.