From fd4bb06dc47c0d9bfa3c7f83a2770391c30a3910 Mon Sep 17 00:00:00 2001 From: Celeo Date: Thu, 24 Oct 2024 23:08:47 -0700 Subject: [PATCH] Switch to minijinja path loader --- Cargo.lock | 214 +++++++++++++++++- vzdv-site/Cargo.toml | 16 +- vzdv-site/build.rs | 6 + vzdv-site/src/endpoints/admin.rs | 89 ++------ vzdv-site/src/endpoints/airspace.rs | 41 +--- vzdv-site/src/endpoints/auth.rs | 13 +- vzdv-site/src/endpoints/controller.rs | 31 +-- vzdv-site/src/endpoints/events.rs | 31 +-- vzdv-site/src/endpoints/facility.rs | 71 +----- vzdv-site/src/endpoints/homepage.rs | 45 +--- vzdv-site/src/endpoints/mod.rs | 28 +-- vzdv-site/src/endpoints/user.rs | 21 +- vzdv-site/src/main.rs | 81 +++++-- vzdv-site/templates/404.jinja | 2 +- vzdv-site/templates/_error.jinja | 2 +- .../admin/activity_report_container.jinja | 2 +- vzdv-site/templates/admin/emails.jinja | 2 +- vzdv-site/templates/admin/feedback.jinja | 2 +- vzdv-site/templates/admin/logs.jinja | 2 +- .../templates/admin/off_roster_list.jinja | 2 +- vzdv-site/templates/admin/resources.jinja | 2 +- .../admin/visitor_applications.jinja | 2 +- vzdv-site/templates/airspace/airports.jinja | 2 +- vzdv-site/templates/airspace/flights.jinja | 2 +- .../templates/airspace/staffing_request.jinja | 2 +- vzdv-site/templates/airspace/weather.jinja | 2 +- vzdv-site/templates/auth/login_complete.jinja | 2 +- vzdv-site/templates/changelog.jinja | 2 +- .../templates/controller/controller.jinja | 2 +- vzdv-site/templates/events/event.jinja | 2 +- .../templates/events/upcoming_events.jinja | 4 +- vzdv-site/templates/facility/activity.jinja | 2 +- vzdv-site/templates/facility/resources.jinja | 2 +- vzdv-site/templates/facility/roster.jinja | 2 +- vzdv-site/templates/facility/staff.jinja | 2 +- .../facility/visitor_application.jinja | 2 +- vzdv-site/templates/feedback.jinja | 2 +- vzdv-site/templates/homepage/home.jinja | 2 +- vzdv-site/templates/privacy_policy.jinja | 2 +- vzdv-site/templates/user/discord.jinja | 2 +- vzdv-site/templates/user/training_notes.jinja | 2 +- 41 files changed, 389 insertions(+), 356 deletions(-) create mode 100644 vzdv-site/build.rs diff --git a/Cargo.lock b/Cargo.lock index 9c4f249..8f9bf74 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -771,6 +771,18 @@ dependencies = [ "log", ] +[[package]] +name = "filetime" +version = "0.2.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35c0522e981e68cbfa8c3f978441a5f34b30b96e146b33cd3359176b50fe8586" +dependencies = [ + "cfg-if", + "libc", + "libredox", + "windows-sys 0.59.0", +] + [[package]] name = "flate2" version = "1.0.30" @@ -829,6 +841,15 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "fsevent-sys" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76ee7a02da4d231650c7cea31349b889be2f45ddb3ef3032d2ec8185f6313fd2" +dependencies = [ + "libc", +] + [[package]] name = "futures" version = "0.3.30" @@ -1378,6 +1399,26 @@ dependencies = [ "hashbrown", ] +[[package]] +name = "inotify" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8069d3ec154eb856955c1c0fbffefbf5f3c40a104ec912d4797314c1801abff" +dependencies = [ + "bitflags 1.3.2", + "inotify-sys", + "libc", +] + +[[package]] +name = "inotify-sys" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e05c02b5e89bff3b946cedeca278abc628fe811e604f027c45a8aa3cf793d0eb" +dependencies = [ + "libc", +] + [[package]] name = "ipnet" version = "2.9.0" @@ -1434,6 +1475,26 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "kqueue" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7447f1ca1b7b563588a205fe93dea8df60fd981423a768bc1c0ded35ed147d0c" +dependencies = [ + "kqueue-sys", + "libc", +] + +[[package]] +name = "kqueue-sys" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed9625ffda8729b85e45cf04090035ac368927b8cebc34898e7c120f52e4838b" +dependencies = [ + "bitflags 1.3.2", + "libc", +] + [[package]] name = "lazy_static" version = "1.5.0" @@ -1480,6 +1541,17 @@ version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" +[[package]] +name = "libredox" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +dependencies = [ + "bitflags 2.6.0", + "libc", + "redox_syscall 0.5.3", +] + [[package]] name = "libsqlite3-sys" version = "0.30.1" @@ -1547,6 +1619,12 @@ version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +[[package]] +name = "memo-map" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38d1115007560874e373613744c6fba374c17688327a71c1476d1a5954cc857b" + [[package]] name = "mime" version = "0.3.17" @@ -1580,13 +1658,31 @@ dependencies = [ [[package]] name = "minijinja" -version = "2.1.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45f7e8e35b6c7b169bf40b0176d2c79291ab8ee53290b84e0668ab21d841aa9d" +checksum = "1028b628753a7e1a88fc59c9ba4b02ecc3bc0bd3c7af23df667bc28df9b3310e" dependencies = [ + "memo-map", + "self_cell", "serde", ] +[[package]] +name = "minijinja-autoreload" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "641ba8dc6cafd35a2f9f141f4593bdd01438cfad120ff679a91a9dce92510e38" +dependencies = [ + "minijinja", + "notify", +] + +[[package]] +name = "minijinja-embed" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c76b834769fa7cfc97332d7c6b4025f264a41dfca1b9c0959af25611a7892310" + [[package]] name = "minimal-lexical" version = "0.2.1" @@ -1602,6 +1698,18 @@ dependencies = [ "adler", ] +[[package]] +name = "mio" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" +dependencies = [ + "libc", + "log", + "wasi", + "windows-sys 0.48.0", +] + [[package]] name = "mio" version = "1.0.1" @@ -1658,6 +1766,23 @@ dependencies = [ "minimal-lexical", ] +[[package]] +name = "notify" +version = "5.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "729f63e1ca555a43fe3efa4f3efdf4801c479da85b432242a7b726f353c88486" +dependencies = [ + "bitflags 1.3.2", + "filetime", + "fsevent-sys", + "inotify", + "kqueue", + "libc", + "mio 0.8.11", + "walkdir", + "windows-sys 0.45.0", +] + [[package]] name = "num-bigint-dig" version = "0.8.4" @@ -2410,6 +2535,12 @@ dependencies = [ "libc", ] +[[package]] +name = "self_cell" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d369a96f978623eb3dc28807c4852d6cc617fed53da5d3c400feff1ef34a714a" + [[package]] name = "semver" version = "1.0.23" @@ -3026,7 +3157,7 @@ dependencies = [ "backtrace", "bytes", "libc", - "mio", + "mio 1.0.1", "parking_lot", "pin-project-lite", "signal-hook-registry", @@ -3652,6 +3783,8 @@ dependencies = [ "log", "mini-moka", "minijinja", + "minijinja-autoreload", + "minijinja-embed", "regex", "reqwest 0.12.5", "rev_buf_reader", @@ -3862,6 +3995,15 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", +] + [[package]] name = "windows-sys" version = "0.48.0" @@ -3880,6 +4022,30 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + [[package]] name = "windows-targets" version = "0.48.5" @@ -3911,6 +4077,12 @@ dependencies = [ "windows_x86_64_msvc 0.52.6", ] +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + [[package]] name = "windows_aarch64_gnullvm" version = "0.48.5" @@ -3923,6 +4095,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + [[package]] name = "windows_aarch64_msvc" version = "0.48.5" @@ -3935,6 +4113,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + [[package]] name = "windows_i686_gnu" version = "0.48.5" @@ -3953,6 +4137,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + [[package]] name = "windows_i686_msvc" version = "0.48.5" @@ -3965,6 +4155,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + [[package]] name = "windows_x86_64_gnu" version = "0.48.5" @@ -3977,6 +4173,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + [[package]] name = "windows_x86_64_gnullvm" version = "0.48.5" @@ -3989,6 +4191,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + [[package]] name = "windows_x86_64_msvc" version = "0.48.5" diff --git a/vzdv-site/Cargo.toml b/vzdv-site/Cargo.toml index 021abca..64390f7 100644 --- a/vzdv-site/Cargo.toml +++ b/vzdv-site/Cargo.toml @@ -15,17 +15,20 @@ publish = false vzdv = { path = "../vzdv" } anyhow = "1.0.86" -axum = { version = "0.7.4", features = ["multipart"]} +axum = { version = "0.7.4", features = ["multipart"] } axum-extra = "0.9.3" chrono = { version = "0.4.34", features = ["serde"] } chrono-tz = "0.9.0" clap = { version = "4.5.1", features = ["derive"] } itertools = "0.13.0" +geo = "0.28.0" lettre = "0.11.7" log = "0.4.20" mini-moka = { version = "0.10.3", features = ["sync"] } -minijinja = "2.0.3" -reqwest = { version = "0.12.5", default-features = false, features = []} +minijinja = { version = "2.0.3", features = ["loader"] } +minijinja-autoreload = "2.3.1" +minijinja-embed = "2.3.1" +reqwest = { version = "0.12.5", default-features = false, features = [] } rev_buf_reader = "0.3.0" serde = { version = "1.0.196", features = ["derive"] } serde_json = "1.0.113" @@ -40,5 +43,10 @@ tower-sessions = "0.12.0" tower-sessions-sqlx-store = { version = "0.13.0", features = ["sqlite"] } uuid = { version = "1.10.0", features = ["v4", "fast-rng"] } vatsim_utils = "0.5.0" -geo = "0.28.0" regex = "1.11.0" + +[build-dependencies] +minijinja-embed = "2.3.1" + +[features] +bundled = [] diff --git a/vzdv-site/build.rs b/vzdv-site/build.rs new file mode 100644 index 0000000..45b7f01 --- /dev/null +++ b/vzdv-site/build.rs @@ -0,0 +1,6 @@ +fn main() { + #[cfg(feature = "bundled")] + { + minijinja_embed::embed_templates!("templates"); + } +} diff --git a/vzdv-site/src/endpoints/admin.rs b/vzdv-site/src/endpoints/admin.rs index 98ba260..66993ff 100644 --- a/vzdv-site/src/endpoints/admin.rs +++ b/vzdv-site/src/endpoints/admin.rs @@ -16,7 +16,7 @@ use axum::{ }; use chrono::{DateTime, Months, Utc}; use log::{debug, error, info, warn}; -use minijinja::{context, Environment}; +use minijinja::context; use reqwest::StatusCode; use rev_buf_reader::RevBufReader; use serde::{Deserialize, Serialize}; @@ -44,7 +44,7 @@ async fn page_feedback( if let Some(redirect) = reject_if_not_in(&state, &user_info, PermissionsGroup::Admin).await { return Ok(redirect.into_response()); } - let template = state.templates.get_template("admin/feedback")?; + let template = state.templates.get_template("admin/feedback.jinja")?; let pending_feedback: Vec = sqlx::query_as(sql::GET_PENDING_FEEDBACK_FOR_REVIEW) .fetch_all(&state.db) @@ -258,7 +258,7 @@ async fn page_emails( let all_controllers: Vec = sqlx::query_as(sql::GET_ALL_CONTROLLERS) .fetch_all(&state.db) .await?; - let template = state.templates.get_template("admin/emails")?; + let template = state.templates.get_template("admin/emails.jinja")?; let flashed_messages = flashed_messages::drain_flashed_messages(session).await?; let email_templates = email::query_templates(&state.db).await?; let rendered = template.render(context! { @@ -442,7 +442,7 @@ async fn page_logs( logs.insert(name, buffer.join("
")); } - let template = state.templates.get_template("admin/logs")?; + let template = state.templates.get_template("admin/logs.jinja")?; let rendered = template.render(context! { user_info, logs, line_count })?; Ok(Html(rendered).into_response()) } @@ -482,7 +482,9 @@ async fn page_visitor_applications( }); let flashed_messages = flashed_messages::drain_flashed_messages(session).await?; - let template = state.templates.get_template("admin/visitor_applications")?; + let template = state + .templates + .get_template("admin/visitor_applications.jinja")?; let rendered = template.render(context! { user_info, flashed_messages, @@ -622,7 +624,7 @@ async fn page_resources( .await?; let categories = &state.config.database.resource_category_ordering; let flashed_messages = flashed_messages::drain_flashed_messages(session).await?; - let template = state.templates.get_template("admin/resources")?; + let template = state.templates.get_template("admin/resources.jinja")?; let rendered = template.render(context! { user_info, flashed_messages, resources, categories })?; Ok(Html(rendered).into_response()) @@ -751,7 +753,9 @@ async fn page_off_roster_list( .fetch_all(&state.db) .await?; let flashed_messages = flashed_messages::drain_flashed_messages(session).await?; - let template = state.templates.get_template("admin/off_roster_list")?; + let template = state + .templates + .get_template("admin/off_roster_list.jinja")?; let rendered = template.render(context! { user_info, controllers, @@ -773,7 +777,7 @@ async fn page_activity_report( } let template = state .templates - .get_template("admin/activity_report_container")?; + .get_template("admin/activity_report_container.jinja")?; let rendered = template.render(context! { user_info })?; Ok(Html(rendered).into_response()) } @@ -906,7 +910,9 @@ async fn page_activity_report_generate( let cid_name_map = get_controller_cids_and_names(&state.db) .await .map_err(|err| AppError::GenericFallback("getting cids and names from DB", err))?; - let template = state.templates.get_template("admin/activity_report")?; + let template = state + .templates + .get_template("admin/activity_report.jinja")?; let rendered = template.render(context! { user_info, controllers, @@ -922,70 +928,7 @@ async fn page_activity_report_generate( } /// This file's routes and templates. -pub fn router(templates: &mut Environment) -> Router> { - templates - .add_template( - "admin/feedback", - include_str!("../../templates/admin/feedback.jinja"), - ) - .unwrap(); - templates - .add_template( - "admin/emails", - include_str!("../../templates/admin/emails.jinja"), - ) - .unwrap(); - templates - .add_template( - "admin/logs", - include_str!("../../templates/admin/logs.jinja"), - ) - .unwrap(); - templates - .add_template( - "admin/visitor_applications", - include_str!("../../templates/admin/visitor_applications.jinja"), - ) - .unwrap(); - templates - .add_template( - "admin/resources", - include_str!("../../templates/admin/resources.jinja"), - ) - .unwrap(); - templates - .add_template( - "admin/off_roster_list", - include_str!("../../templates/admin/off_roster_list.jinja"), - ) - .unwrap(); - templates - .add_template( - "admin/activity_report_container", - include_str!("../../templates/admin/activity_report_container.jinja"), - ) - .unwrap(); - templates - .add_template( - "admin/activity_report", - include_str!("../../templates/admin/activity_report.jinja"), - ) - .unwrap(); - - templates.add_filter("nice_date", |date: String| { - chrono::DateTime::parse_from_rfc3339(&date) - .unwrap() - .format("%m/%d/%Y %H:%M:%S") - .to_string() - }); - templates.add_filter( - "rating_str", - |rating: i8| match ControllerRating::try_from(rating) { - Ok(r) => r.as_str(), - Err(_) => "OBS", - }, - ); - +pub fn router() -> Router> { Router::new() .route( "/admin/feedback", diff --git a/vzdv-site/src/endpoints/airspace.rs b/vzdv-site/src/endpoints/airspace.rs index 5786c26..63c00cc 100644 --- a/vzdv-site/src/endpoints/airspace.rs +++ b/vzdv-site/src/endpoints/airspace.rs @@ -13,11 +13,10 @@ use axum::{ }; use itertools::Itertools; use log::{info, warn}; -use minijinja::{context, Environment}; +use minijinja::context; use serde::Deserialize; use serde_json::json; use std::{collections::HashSet, sync::Arc, time::Instant}; -use thousands::Separable; use tower_sessions::Session; use vatsim_utils::live_api::Vatsim; use vzdv::{aviation::parse_metar, GENERAL_HTTP_CLIENT}; @@ -28,7 +27,7 @@ async fn page_airports( session: Session, ) -> Result, AppError> { let user_info: Option = session.get(SESSION_USER_INFO_KEY).await?; - let template = state.templates.get_template("airspace/airports")?; + let template = state.templates.get_template("airspace/airports.jinja")?; let airports = &state.config.airports.all; let rendered = template.render(context! { user_info, airports })?; Ok(Html(rendered)) @@ -66,7 +65,7 @@ async fn page_flights( }; let user_info: Option = session.get(SESSION_USER_INFO_KEY).await?; - let template = state.templates.get_template("airspace/flights")?; + let template = state.templates.get_template("airspace/flights.jinja")?; let rendered = template.render(context! { user_info, flights })?; state .cache @@ -118,7 +117,7 @@ async fn page_weather( .collect(); let user_info: Option = session.get(SESSION_USER_INFO_KEY).await?; - let template = state.templates.get_template("airspace/weather")?; + let template = state.templates.get_template("airspace/weather.jinja")?; let rendered = template.render(context! { user_info, weather })?; state .cache @@ -133,7 +132,9 @@ async fn page_staffing_request( ) -> Result, AppError> { let user_info: Option = session.get(SESSION_USER_INFO_KEY).await?; let flashed_messages = flashed_messages::drain_flashed_messages(session).await?; - let template = state.templates.get_template("airspace/staffing_request")?; + let template = state + .templates + .get_template("airspace/staffing_request.jinja")?; let rendered = template.render(context! { user_info, flashed_messages })?; Ok(Html(rendered)) } @@ -239,33 +240,7 @@ async fn page_staffing_request_post( } /// This file's routes and templates. -pub fn router(templates: &mut Environment) -> Router> { - templates - .add_template( - "airspace/airports", - include_str!("../../templates/airspace/airports.jinja"), - ) - .unwrap(); - templates - .add_template( - "airspace/flights", - include_str!("../../templates/airspace/flights.jinja"), - ) - .unwrap(); - templates - .add_template( - "airspace/staffing_request", - include_str!("../../templates/airspace/staffing_request.jinja"), - ) - .unwrap(); - templates - .add_template( - "airspace/weather", - include_str!("../../templates/airspace/weather.jinja"), - ) - .unwrap(); - templates.add_filter("format_number", |value: u16| value.separate_with_commas()); - +pub fn router() -> Router> { Router::new() .route("/airspace/airports", get(page_airports)) .route("/airspace/flights", get(page_flights)) diff --git a/vzdv-site/src/endpoints/auth.rs b/vzdv-site/src/endpoints/auth.rs index 50ce7e5..782f625 100644 --- a/vzdv-site/src/endpoints/auth.rs +++ b/vzdv-site/src/endpoints/auth.rs @@ -8,7 +8,7 @@ use axum::{ Router, }; use log::{debug, info}; -use minijinja::{context, Environment}; +use minijinja::context; use std::sync::Arc; use tower_sessions::Session; use vzdv::{ @@ -83,7 +83,7 @@ async fn page_auth_callback( .await?; info!("Completed log in for {}", session_user_info.data.cid); - let template = state.templates.get_template("admin/login_complete")?; + let template = state.templates.get_template("auth/login_complete.jinja")?; let rendered = template.render(context! { user_info => to_session })?; Ok(Html(rendered)) } @@ -96,14 +96,7 @@ async fn page_auth_logout(session: Session) -> Result { } /// This file's routes and templates. -pub fn router(templates: &mut Environment) -> Router> { - templates - .add_template( - "admin/login_complete", - include_str!("../../templates/auth/login_complete.jinja"), - ) - .unwrap(); - +pub fn router() -> Router> { Router::new() .route("/auth/log_in", get(page_auth_login)) .route("/auth/logout", get(page_auth_logout)) diff --git a/vzdv-site/src/endpoints/controller.rs b/vzdv-site/src/endpoints/controller.rs index 214dba1..29faaa4 100644 --- a/vzdv-site/src/endpoints/controller.rs +++ b/vzdv-site/src/endpoints/controller.rs @@ -16,7 +16,7 @@ use axum::{ use chrono::{DateTime, NaiveDateTime, Utc}; use itertools::Itertools; use log::{error, info, warn}; -use minijinja::{context, Environment}; +use minijinja::context; use reqwest::StatusCode; use serde::{Deserialize, Serialize}; use sqlx::{Pool, Sqlite}; @@ -187,7 +187,9 @@ async fn page_controller( settable_roles.sort(); let flashed_messages = flashed_messages::drain_flashed_messages(session).await?; - let template = state.templates.get_template("controller/controller")?; + let template = state + .templates + .get_template("controller/controller.jinja")?; let rendered: String = template.render(context! { user_info, controller, @@ -450,7 +452,9 @@ async fn snippet_get_training_records( .copied() .collect(); let instructors = get_multiple_controller_names(&instructor_cids).await; - let template = state.templates.get_template("controller/training_notes")?; + let template = state + .templates + .get_template("controller/training_notes.jinja")?; let rendered: String = template.render(context! { user_info, training_records, instructors })?; Ok(Html(rendered).into_response()) @@ -679,26 +683,7 @@ async fn post_remove_controller( Ok(Redirect::to(&format!("/controller/{cid}"))) } -pub fn router(templates: &mut Environment) -> Router> { - templates - .add_template( - "controller/controller", - include_str!("../../templates/controller/controller.jinja"), - ) - .unwrap(); - templates - .add_template( - "controller/training_notes", - include_str!("../../templates/controller/training_notes.jinja"), - ) - .unwrap(); - templates.add_function( - "includes", - |roles: Vec, role: String| -> Result { - Ok(roles.contains(&role)) - }, - ); - +pub fn router() -> Router> { Router::new() .route("/controller/:cid", get(page_controller)) .route("/controller/:cid/discord/unlink", post(api_unlink_discord)) diff --git a/vzdv-site/src/endpoints/events.rs b/vzdv-site/src/endpoints/events.rs index e7292ee..76c2a40 100644 --- a/vzdv-site/src/endpoints/events.rs +++ b/vzdv-site/src/endpoints/events.rs @@ -19,7 +19,7 @@ use axum::{ use axum_extra::extract::WithRejection; use chrono::Utc; use log::info; -use minijinja::{context, Environment}; +use minijinja::context; use serde::{Deserialize, Serialize}; use sqlx::{Pool, Sqlite}; use std::sync::Arc; @@ -58,7 +58,7 @@ async fn snippet_get_upcoming_events( let events = query_for_events(&state.db, show_all).await?; let template = state .templates - .get_template("events/upcoming_events_snippet")?; + .get_template("events/upcoming_events_snippet.jinja")?; let rendered = template.render(context! { user_info, events })?; Ok(Html(rendered)) } @@ -74,7 +74,9 @@ async fn get_upcoming_events( let show_all = is_user_member_of(&state, &user_info, PermissionsGroup::EventsTeam).await; let events = query_for_events(&state.db, show_all).await?; let is_event_staff = is_user_member_of(&state, &user_info, PermissionsGroup::EventsTeam).await; - let template = state.templates.get_template("events/upcoming_events")?; + let template = state + .templates + .get_template("events/upcoming_events.jinja")?; let flashed_messages = flashed_messages::drain_flashed_messages(session).await?; let rendered = template.render(context! { user_info, @@ -211,7 +213,7 @@ async fn page_event( ) }) .collect(); - let template = state.templates.get_template("events/event")?; + let template = state.templates.get_template("events/event.jinja")?; let self_register: Option = if let Some(user_info) = &user_info { sqlx::query_as(sql::GET_EVENT_REGISTRATION_FOR) .bind(id) @@ -707,26 +709,7 @@ async fn post_set_position( } /// This file's routes and templates. -pub fn router(template: &mut Environment) -> Router> { - template - .add_template( - "events/upcoming_events_snippet", - include_str!("../../templates/events/upcoming_events_snippet.jinja"), - ) - .unwrap(); - template - .add_template( - "events/upcoming_events", - include_str!("../../templates/events/upcoming_events.jinja"), - ) - .unwrap(); - template - .add_template( - "events/event", - include_str!("../../templates/events/event.jinja"), - ) - .unwrap(); - +pub fn router() -> Router> { Router::new() .route("/events/upcoming", get(snippet_get_upcoming_events)) .route( diff --git a/vzdv-site/src/endpoints/facility.rs b/vzdv-site/src/endpoints/facility.rs index 3b13d8b..a336115 100644 --- a/vzdv-site/src/endpoints/facility.rs +++ b/vzdv-site/src/endpoints/facility.rs @@ -13,7 +13,7 @@ use axum::{ use chrono::{DateTime, Months, Utc}; use itertools::Itertools; use log::warn; -use minijinja::{context, Environment}; +use minijinja::context; use serde::{Deserialize, Serialize}; use std::{ collections::{HashMap, HashSet}, @@ -204,7 +204,7 @@ async fn page_roster( .collect(); let flashed_messages = flashed_messages::drain_flashed_messages(session).await?; - let template = state.templates.get_template("facility/roster")?; + let template = state.templates.get_template("facility/roster.jinja")?; let rendered = template.render(context! { user_info, controllers => controllers_with_certs, @@ -239,7 +239,7 @@ async fn page_staff( .collect(); let user_info: Option = session.get(SESSION_USER_INFO_KEY).await?; - let template = state.templates.get_template("facility/staff")?; + let template = state.templates.get_template("facility/staff.jinja")?; let rendered = template.render(context! { user_info, staff })?; Ok(Html(rendered)) } @@ -357,7 +357,7 @@ async fn page_activity( } let user_info: Option = session.get(SESSION_USER_INFO_KEY).await?; - let template = state.templates.get_template("facility/activity")?; + let template = state.templates.get_template("facility/activity.jinja")?; let rendered = template.render(context! { user_info, activity_data })?; Ok(Html(rendered)) } @@ -391,7 +391,7 @@ async fn page_resources( .collect(); let user_info: Option = session.get(SESSION_USER_INFO_KEY).await?; - let template = state.templates.get_template("facility/resources")?; + let template = state.templates.get_template("facility/resources.jinja")?; let rendered = template.render(context! { user_info, resources, categories })?; Ok(Html(rendered)) } @@ -419,7 +419,7 @@ async fn page_visitor_application( let flashed_messages = flashed_messages::drain_flashed_messages(session).await?; let template = state .templates - .get_template("facility/visitor_application")?; + .get_template("facility/visitor_application.jinja")?; let rendered = template.render(context! { user_info, flashed_messages, controller, is_visiting })?; Ok(Html(rendered)) @@ -464,7 +464,7 @@ async fn page_visitor_application_form( let template = state .templates - .get_template("facility/visitor_application_form")?; + .get_template("facility/visitor_application_form.jinja")?; let rendered = template.render(context! { user_info, pending_request, controller_info, checklist })?; Ok(Html(rendered)) @@ -510,62 +510,7 @@ async fn page_visitor_application_form_submit( Ok(Redirect::to("/facility/visitor_application")) } -pub fn router(templates: &mut Environment) -> Router> { - templates - .add_template( - "facility/roster", - include_str!("../../templates/facility/roster.jinja"), - ) - .unwrap(); - templates - .add_template( - "facility/staff", - include_str!("../../templates/facility/staff.jinja"), - ) - .unwrap(); - templates - .add_template( - "facility/activity", - include_str!("../../templates/facility/activity.jinja"), - ) - .unwrap(); - templates - .add_template( - "facility/resources", - include_str!("../../templates/facility/resources.jinja"), - ) - .unwrap(); - templates - .add_template( - "facility/visitor_application", - include_str!("../../templates/facility/visitor_application.jinja"), - ) - .unwrap(); - templates - .add_template( - "facility/visitor_application_form", - include_str!("../../templates/facility/visitor_application_form.jinja"), - ) - .unwrap(); - templates.add_filter("minutes_to_hm", |total_minutes: u32| { - if total_minutes == 0 { - return String::new(); - } - let hours = total_minutes / 60; - let minutes = total_minutes % 60; - if hours > 0 || minutes > 0 { - format!("{hours}h{minutes}m") - } else { - String::new() - } - }); - templates.add_filter("simple_date", |date: String| { - chrono::DateTime::parse_from_rfc3339(&date) - .unwrap() - .format("%m/%d/%Y") - .to_string() - }); - +pub fn router() -> Router> { Router::new() .route("/facility/roster", get(page_roster)) .route("/facility/staff", get(page_staff)) diff --git a/vzdv-site/src/endpoints/homepage.rs b/vzdv-site/src/endpoints/homepage.rs index 49ea495..71143b9 100644 --- a/vzdv-site/src/endpoints/homepage.rs +++ b/vzdv-site/src/endpoints/homepage.rs @@ -8,7 +8,7 @@ use crate::{ use axum::{extract::State, response::Html, routing::get, Router}; use chrono::Utc; use log::warn; -use minijinja::{context, Environment}; +use minijinja::context; use serde::Serialize; use std::{sync::Arc, time::Instant}; use tower_sessions::Session; @@ -26,7 +26,7 @@ async fn page_home( session: Session, ) -> Result, AppError> { let user_info: Option = session.get(SESSION_USER_INFO_KEY).await?; - let template = state.templates.get_template("homepage/home")?; + let template = state.templates.get_template("homepage/home.jinja")?; let flashed_messages = flashed_messages::drain_flashed_messages(session).await?; let rendered = template.render(context! { user_info, flashed_messages })?; Ok(Html(rendered)) @@ -51,7 +51,7 @@ async fn snippet_online_controllers( .map_err(|error| AppError::GenericFallback("getting online controllers", error))?; let template = state .templates - .get_template("homepage/online_controllers")?; + .get_template("homepage/online_controllers.jinja")?; let rendered = template.render(context! { online })?; state .cache @@ -92,7 +92,7 @@ async fn snippet_weather(State(state): State>) -> Result>) -> Result>) -> Result }) .collect(); - let template = state.templates.get_template("homepage/cotm")?; + let template = state.templates.get_template("homepage/cotm.jinja")?; let rendered = template.render(context! { cotm })?; state .cache @@ -178,38 +178,7 @@ async fn snippet_cotm(State(state): State>) -> Result } /// This file's routes and templates. -pub fn router(templates: &mut Environment) -> Router> { - templates - .add_template( - "homepage/home", - include_str!("../../templates/homepage/home.jinja"), - ) - .unwrap(); - templates - .add_template( - "homepage/online_controllers", - include_str!("../../templates/homepage/online_controllers.jinja"), - ) - .unwrap(); - templates - .add_template( - "homepage/weather", - include_str!("../../templates/homepage/weather.jinja"), - ) - .unwrap(); - templates - .add_template( - "homepage/flights", - include_str!("../../templates/homepage/flights.jinja"), - ) - .unwrap(); - templates - .add_template( - "homepage/cotm", - include_str!("../../templates/homepage/cotm.jinja"), - ) - .unwrap(); - +pub fn router() -> Router> { Router::new() .route("/", get(page_home)) .route("/home/online/controllers", get(snippet_online_controllers)) diff --git a/vzdv-site/src/endpoints/mod.rs b/vzdv-site/src/endpoints/mod.rs index 9e1f65e..386ba0b 100644 --- a/vzdv-site/src/endpoints/mod.rs +++ b/vzdv-site/src/endpoints/mod.rs @@ -11,7 +11,7 @@ use axum::{ Form, Router, }; use log::{error, info}; -use minijinja::{context, Environment}; +use minijinja::context; use serde::Deserialize; use serde_json::json; use std::sync::Arc; @@ -35,7 +35,7 @@ pub mod user; /// /// Redirected to whenever the router cannot find a valid handler for the requested path. pub async fn page_404(State(state): State>) -> Result, AppError> { - let template = state.templates.get_template("404")?; + let template = state.templates.get_template("404.jinja")?; let rendered = template.render(context! { no_links => true })?; Ok(Html(rendered)) } @@ -62,7 +62,7 @@ async fn page_feedback_form( ) }) .collect(); - let template = state.templates.get_template("feedback")?; + let template = state.templates.get_template("feedback.jinja")?; let rendered = template.render(context! { user_info, flashed_messages, all_controllers })?; Ok(Html(rendered)) } @@ -152,7 +152,7 @@ async fn page_changelog( session: Session, ) -> Result, AppError> { let user_info: Option = session.get(SESSION_USER_INFO_KEY).await?; - let template = state.templates.get_template("changelog")?; + let template = state.templates.get_template("changelog.jinja")?; let rendered = template.render(context! { user_info })?; Ok(Html(rendered)) } @@ -163,29 +163,13 @@ async fn page_privacy_policy( session: Session, ) -> Result, AppError> { let user_info: Option = session.get(SESSION_USER_INFO_KEY).await?; - let template = state.templates.get_template("privacy_policy")?; + let template = state.templates.get_template("privacy_policy.jinja")?; let rendered = template.render(context! { user_info })?; Ok(Html(rendered)) } /// This file's routes and templates. -pub fn router(templates: &mut Environment) -> Router> { - templates - .add_template("404", include_str!("../../templates/404.jinja")) - .unwrap(); - templates - .add_template("feedback", include_str!("../../templates/feedback.jinja")) - .unwrap(); - templates - .add_template("changelog", include_str!("../../templates/changelog.jinja")) - .unwrap(); - templates - .add_template( - "privacy_policy", - include_str!("../../templates/privacy_policy.jinja"), - ) - .unwrap(); - +pub fn router() -> Router> { Router::new() .route("/404", get(page_404)) .route("/feedback", get(page_feedback_form)) diff --git a/vzdv-site/src/endpoints/user.rs b/vzdv-site/src/endpoints/user.rs index 2cff177..e63afe0 100644 --- a/vzdv-site/src/endpoints/user.rs +++ b/vzdv-site/src/endpoints/user.rs @@ -12,7 +12,7 @@ use axum::{ }; use chrono::NaiveDateTime; use log::{debug, info, warn}; -use minijinja::{context, Environment}; +use minijinja::context; use std::{collections::HashMap, sync::Arc}; use tower_sessions::Session; use vzdv::{ @@ -55,7 +55,7 @@ async fn page_training_notes( date_b.cmp(&date_a) // sort newest first }); - let template = state.templates.get_template("user/training_notes")?; + let template = state.templates.get_template("user/training_notes.jinja")?; let rendered = template.render(context! { user_info, training_records })?; Ok(Html(rendered).into_response()) } @@ -75,7 +75,7 @@ async fn page_discord( .bind(user_info.cid) .fetch_one(&state.db) .await?; - let template = state.templates.get_template("user/discord")?; + let template = state.templates.get_template("user/discord.jinja")?; let flashed_messages = flashed_messages::drain_flashed_messages(session).await?; let rendered: String = template.render(context! { user_info, @@ -141,20 +141,7 @@ async fn page_discord_callback( Ok(Redirect::to("/user/discord")) } -pub fn router(templates: &mut Environment) -> Router> { - templates - .add_template( - "user/training_notes", - include_str!("../../templates/user/training_notes.jinja"), - ) - .unwrap(); - templates - .add_template( - "user/discord", - include_str!("../../templates/user/discord.jinja"), - ) - .unwrap(); - +pub fn router() -> Router> { Router::new() .route("/user/training_notes", get(page_training_notes)) .route("/user/discord", get(page_discord)) diff --git a/vzdv-site/src/main.rs b/vzdv-site/src/main.rs index 381f383..8679bbf 100644 --- a/vzdv-site/src/main.rs +++ b/vzdv-site/src/main.rs @@ -16,12 +16,13 @@ use std::{ sync::Arc, time::Duration, }; +use thousands::Separable; use tokio::signal; use tower::ServiceBuilder; use tower_http::timeout::TimeoutLayer; use tower_sessions::{Expiry, SessionManagerLayer}; use tower_sessions_sqlx_store::SqliteStore; -use vzdv::general_setup; +use vzdv::{general_setup, ControllerRating}; mod discord; mod email; @@ -58,25 +59,71 @@ struct Cli { /// macro and supply to the minijinja environment. fn load_templates() -> Result, AppError> { let mut env = Environment::new(); - env.add_template("_layout", include_str!("../templates/_layout.jinja"))?; + + #[cfg(feature = "bundled")] + { + minijinja_embed::load_templates!(&mut env); + } + + #[cfg(not(feature = "bundled"))] + { + env.set_loader(minijinja::path_loader("vzdv-site/templates")); + } + + env.add_filter("minutes_to_hm", |total_minutes: u32| { + if total_minutes == 0 { + return String::new(); + } + let hours = total_minutes / 60; + let minutes = total_minutes % 60; + if hours > 0 || minutes > 0 { + format!("{hours}h{minutes}m") + } else { + String::new() + } + }); + env.add_filter("simple_date", |date: String| { + chrono::DateTime::parse_from_rfc3339(&date) + .unwrap() + .format("%m/%d/%Y") + .to_string() + }); + env.add_function( + "includes", + |roles: Vec, role: String| -> Result { + Ok(roles.contains(&role)) + }, + ); + env.add_filter("format_number", |value: u16| value.separate_with_commas()); + env.add_filter("nice_date", |date: String| { + chrono::DateTime::parse_from_rfc3339(&date) + .unwrap() + .format("%m/%d/%Y %H:%M:%S") + .to_string() + }); + env.add_filter( + "rating_str", + |rating: i8| match ControllerRating::try_from(rating) { + Ok(r) => r.as_str(), + Err(_) => "OBS", + }, + ); + Ok(env) } /// Create all the endpoints and insert middleware. -fn load_router( - sessions_layer: SessionManagerLayer, - env: &mut Environment, -) -> Router> { +fn load_router(sessions_layer: SessionManagerLayer) -> Router> { Router::new() - .merge(endpoints::router(env)) - .merge(endpoints::admin::router(env)) - .merge(endpoints::airspace::router(env)) - .merge(endpoints::auth::router(env)) - .merge(endpoints::controller::router(env)) - .merge(endpoints::events::router(env)) - .merge(endpoints::facility::router(env)) - .merge(endpoints::homepage::router(env)) - .merge(endpoints::user::router(env)) + .merge(endpoints::router()) + .merge(endpoints::admin::router()) + .merge(endpoints::airspace::router()) + .merge(endpoints::auth::router()) + .merge(endpoints::controller::router()) + .merge(endpoints::events::router()) + .merge(endpoints::facility::router()) + .merge(endpoints::homepage::router()) + .merge(endpoints::user::router()) .layer( ServiceBuilder::new() .layer(TimeoutLayer::new(Duration::from_secs(30))) @@ -135,7 +182,7 @@ async fn main() { .with_expiry(Expiry::OnInactivity(time::Duration::hours( middleware::SESSION_INACTIVITY_WINDOW, ))); - let mut templates = match load_templates() { + let templates = match load_templates() { Ok(t) => t, Err(e) => { error!("Could not load the first templates: {e}"); @@ -145,7 +192,7 @@ async fn main() { debug!("Loaded"); debug!("Setting up app"); - let router = load_router(session_layer, &mut templates); + let router = load_router(session_layer); let app_state = Arc::new(AppState { config, db: db.clone(), diff --git a/vzdv-site/templates/404.jinja b/vzdv-site/templates/404.jinja index cc5469c..ece5add 100644 --- a/vzdv-site/templates/404.jinja +++ b/vzdv-site/templates/404.jinja @@ -1,4 +1,4 @@ -{% extends "_layout" %} +{% extends "_layout.jinja" %} {% block title %}Not found | {{ super() }}{% endblock %} diff --git a/vzdv-site/templates/_error.jinja b/vzdv-site/templates/_error.jinja index bb6bdb9..5196b9d 100644 --- a/vzdv-site/templates/_error.jinja +++ b/vzdv-site/templates/_error.jinja @@ -1,4 +1,4 @@ -{% extends "_layout" %} +{% extends "_layout.jinja" %} {% block title %}Error | {{ super() }}{% endblock %} diff --git a/vzdv-site/templates/admin/activity_report_container.jinja b/vzdv-site/templates/admin/activity_report_container.jinja index 276160e..5a2d77d 100644 --- a/vzdv-site/templates/admin/activity_report_container.jinja +++ b/vzdv-site/templates/admin/activity_report_container.jinja @@ -1,4 +1,4 @@ -{% extends "_layout" %} +{% extends "_layout.jinja" %} {% block title %}Activity report | {{ super() }}{% endblock %} diff --git a/vzdv-site/templates/admin/emails.jinja b/vzdv-site/templates/admin/emails.jinja index 04d2250..2257783 100644 --- a/vzdv-site/templates/admin/emails.jinja +++ b/vzdv-site/templates/admin/emails.jinja @@ -1,4 +1,4 @@ -{% extends "_layout" %} +{% extends "_layout.jinja" %} {% block title %}Emails | {{ super() }}{% endblock %} diff --git a/vzdv-site/templates/admin/feedback.jinja b/vzdv-site/templates/admin/feedback.jinja index f668f45..a4da5cf 100644 --- a/vzdv-site/templates/admin/feedback.jinja +++ b/vzdv-site/templates/admin/feedback.jinja @@ -1,4 +1,4 @@ -{% extends "_layout" %} +{% extends "_layout.jinja" %} {% block title %}Manage feedback | {{ super() }}{% endblock %} diff --git a/vzdv-site/templates/admin/logs.jinja b/vzdv-site/templates/admin/logs.jinja index be29620..96333fe 100644 --- a/vzdv-site/templates/admin/logs.jinja +++ b/vzdv-site/templates/admin/logs.jinja @@ -1,4 +1,4 @@ -{% extends "_layout" %} +{% extends "_layout.jinja" %} {% block title %}Logs | {{ super() }}{% endblock %} diff --git a/vzdv-site/templates/admin/off_roster_list.jinja b/vzdv-site/templates/admin/off_roster_list.jinja index c481eb4..b1af883 100644 --- a/vzdv-site/templates/admin/off_roster_list.jinja +++ b/vzdv-site/templates/admin/off_roster_list.jinja @@ -1,4 +1,4 @@ -{% extends "_layout" %} +{% extends "_layout.jinja" %} {% block title %}Off-roster List | {{ super() }}{% endblock %} diff --git a/vzdv-site/templates/admin/resources.jinja b/vzdv-site/templates/admin/resources.jinja index 7066a9e..f1858b0 100644 --- a/vzdv-site/templates/admin/resources.jinja +++ b/vzdv-site/templates/admin/resources.jinja @@ -1,4 +1,4 @@ -{% extends "_layout" %} +{% extends "_layout.jinja" %} {% block title %}Resources | {{ super() }}{% endblock %} diff --git a/vzdv-site/templates/admin/visitor_applications.jinja b/vzdv-site/templates/admin/visitor_applications.jinja index a8e33b0..82e40b9 100644 --- a/vzdv-site/templates/admin/visitor_applications.jinja +++ b/vzdv-site/templates/admin/visitor_applications.jinja @@ -1,4 +1,4 @@ -{% extends "_layout" %} +{% extends "_layout.jinja" %} {% block title %}Visitor Applications | {{ super() }}{% endblock %} diff --git a/vzdv-site/templates/airspace/airports.jinja b/vzdv-site/templates/airspace/airports.jinja index 29d5068..7d9d9d5 100644 --- a/vzdv-site/templates/airspace/airports.jinja +++ b/vzdv-site/templates/airspace/airports.jinja @@ -1,4 +1,4 @@ -{% extends "_layout" %} +{% extends "_layout.jinja" %} {% block title %}Airports | {{ super() }}{% endblock %} diff --git a/vzdv-site/templates/airspace/flights.jinja b/vzdv-site/templates/airspace/flights.jinja index 22fd8ee..d1c782b 100644 --- a/vzdv-site/templates/airspace/flights.jinja +++ b/vzdv-site/templates/airspace/flights.jinja @@ -1,4 +1,4 @@ -{% extends "_layout" %} +{% extends "_layout.jinja" %} {% block title %}Flights | {{ super() }}{% endblock %} diff --git a/vzdv-site/templates/airspace/staffing_request.jinja b/vzdv-site/templates/airspace/staffing_request.jinja index b6d3b48..90ed0d1 100644 --- a/vzdv-site/templates/airspace/staffing_request.jinja +++ b/vzdv-site/templates/airspace/staffing_request.jinja @@ -1,4 +1,4 @@ -{% extends "_layout" %} +{% extends "_layout.jinja" %} {% block title %}Flights | {{ super() }}{% endblock %} diff --git a/vzdv-site/templates/airspace/weather.jinja b/vzdv-site/templates/airspace/weather.jinja index 35efc96..2ce1638 100644 --- a/vzdv-site/templates/airspace/weather.jinja +++ b/vzdv-site/templates/airspace/weather.jinja @@ -1,4 +1,4 @@ -{% extends "_layout" %} +{% extends "_layout.jinja" %} {% block title %}Weather | {{ super() }}{% endblock %} diff --git a/vzdv-site/templates/auth/login_complete.jinja b/vzdv-site/templates/auth/login_complete.jinja index f78cf44..7fb7953 100644 --- a/vzdv-site/templates/auth/login_complete.jinja +++ b/vzdv-site/templates/auth/login_complete.jinja @@ -1,4 +1,4 @@ -{% extends "_layout" %} +{% extends "_layout.jinja" %} {% block title %}Redirecting{% endblock %} diff --git a/vzdv-site/templates/changelog.jinja b/vzdv-site/templates/changelog.jinja index 1ef0032..c95e45c 100644 --- a/vzdv-site/templates/changelog.jinja +++ b/vzdv-site/templates/changelog.jinja @@ -1,4 +1,4 @@ -{% extends "_layout" %} +{% extends "_layout.jinja" %} {% block title %}Changelog | {{ super() }}{% endblock %} diff --git a/vzdv-site/templates/controller/controller.jinja b/vzdv-site/templates/controller/controller.jinja index 79ba6c8..ac0dfa7 100644 --- a/vzdv-site/templates/controller/controller.jinja +++ b/vzdv-site/templates/controller/controller.jinja @@ -1,4 +1,4 @@ -{% extends "_layout" %} +{% extends "_layout.jinja" %} {% block title %}User | {{ super() }}{% endblock %} diff --git a/vzdv-site/templates/events/event.jinja b/vzdv-site/templates/events/event.jinja index 14d5eb9..00243e3 100644 --- a/vzdv-site/templates/events/event.jinja +++ b/vzdv-site/templates/events/event.jinja @@ -1,4 +1,4 @@ -{% extends "_layout" %} +{% extends "_layout.jinja" %} {% block title %}{{ event.name }} | {{ super() }}{% endblock %} diff --git a/vzdv-site/templates/events/upcoming_events.jinja b/vzdv-site/templates/events/upcoming_events.jinja index e37bebc..1996980 100644 --- a/vzdv-site/templates/events/upcoming_events.jinja +++ b/vzdv-site/templates/events/upcoming_events.jinja @@ -1,4 +1,4 @@ -{% extends "_layout" %} +{% extends "_layout.jinja" %} {% block title %}Events | {{ super() }}{% endblock %} @@ -32,7 +32,7 @@ {% endif %} -{% include 'events/upcoming_events_snippet' %} +{% include 'events/upcoming_events_snippet.jinja' %}

Create new event

diff --git a/vzdv-site/templates/facility/activity.jinja b/vzdv-site/templates/facility/activity.jinja index bad45a0..f3fef5a 100644 --- a/vzdv-site/templates/facility/activity.jinja +++ b/vzdv-site/templates/facility/activity.jinja @@ -1,4 +1,4 @@ -{% extends "_layout" %} +{% extends "_layout.jinja" %} {% block title %}Activity | {{ super() }}{% endblock %} diff --git a/vzdv-site/templates/facility/resources.jinja b/vzdv-site/templates/facility/resources.jinja index 4bb7d56..fd71692 100644 --- a/vzdv-site/templates/facility/resources.jinja +++ b/vzdv-site/templates/facility/resources.jinja @@ -1,4 +1,4 @@ -{% extends "_layout" %} +{% extends "_layout.jinja" %} {% block title %}Resources | {{ super() }}{% endblock %} diff --git a/vzdv-site/templates/facility/roster.jinja b/vzdv-site/templates/facility/roster.jinja index fe9f06d..289e128 100644 --- a/vzdv-site/templates/facility/roster.jinja +++ b/vzdv-site/templates/facility/roster.jinja @@ -1,4 +1,4 @@ -{% extends "_layout" %} +{% extends "_layout.jinja" %} {% block title %}Roster | {{ super() }}{% endblock %} diff --git a/vzdv-site/templates/facility/staff.jinja b/vzdv-site/templates/facility/staff.jinja index 09228ee..013bc82 100644 --- a/vzdv-site/templates/facility/staff.jinja +++ b/vzdv-site/templates/facility/staff.jinja @@ -1,4 +1,4 @@ -{% extends "_layout" %} +{% extends "_layout.jinja" %} {% block title %}Staff | {{ super() }}{% endblock %} diff --git a/vzdv-site/templates/facility/visitor_application.jinja b/vzdv-site/templates/facility/visitor_application.jinja index 4e17caf..d9763ea 100644 --- a/vzdv-site/templates/facility/visitor_application.jinja +++ b/vzdv-site/templates/facility/visitor_application.jinja @@ -1,4 +1,4 @@ -{% extends "_layout" %} +{% extends "_layout.jinja" %} {% block title %}Visitor Application | {{ super() }}{% endblock %} diff --git a/vzdv-site/templates/feedback.jinja b/vzdv-site/templates/feedback.jinja index 3e54199..621cec0 100644 --- a/vzdv-site/templates/feedback.jinja +++ b/vzdv-site/templates/feedback.jinja @@ -1,4 +1,4 @@ -{% extends "_layout" %} +{% extends "_layout.jinja" %} {% block title %}Feedback | {{ super() }}{% endblock %} diff --git a/vzdv-site/templates/homepage/home.jinja b/vzdv-site/templates/homepage/home.jinja index c334ff2..efebe36 100644 --- a/vzdv-site/templates/homepage/home.jinja +++ b/vzdv-site/templates/homepage/home.jinja @@ -1,4 +1,4 @@ -{% extends "_layout" %} +{% extends "_layout.jinja" %} {% block title %}Home | {{ super() }}{% endblock %} diff --git a/vzdv-site/templates/privacy_policy.jinja b/vzdv-site/templates/privacy_policy.jinja index 0195105..d9670c7 100644 --- a/vzdv-site/templates/privacy_policy.jinja +++ b/vzdv-site/templates/privacy_policy.jinja @@ -1,4 +1,4 @@ -{% extends "_layout" %} +{% extends "_layout.jinja" %} {% block title %}Privacy policy | {{ super() }}{% endblock %} diff --git a/vzdv-site/templates/user/discord.jinja b/vzdv-site/templates/user/discord.jinja index 3bd9409..e8bb515 100644 --- a/vzdv-site/templates/user/discord.jinja +++ b/vzdv-site/templates/user/discord.jinja @@ -1,4 +1,4 @@ -{% extends "_layout" %} +{% extends "_layout.jinja" %} {% block title %}Discord | {{ super() }}{% endblock %} diff --git a/vzdv-site/templates/user/training_notes.jinja b/vzdv-site/templates/user/training_notes.jinja index 1d06fc9..73fe289 100644 --- a/vzdv-site/templates/user/training_notes.jinja +++ b/vzdv-site/templates/user/training_notes.jinja @@ -1,4 +1,4 @@ -{% extends "_layout" %} +{% extends "_layout.jinja" %} {% block title %}Training notes | {{ super() }}{% endblock %}