From 0a77011170f25d0c0920cf5d597878e15299561c Mon Sep 17 00:00:00 2001 From: philipp Date: Mon, 10 Jun 2024 15:48:49 +0200 Subject: [PATCH] use proper hydro license; add fluctuation --- src/model/mod.rs | 3 ++- src/model/waterlevel.rs | 34 +++++++++++++++++++++++++++------- templates/impressum.html.tera | 5 ++++- templates/planned.html.tera | 9 ++++----- 4 files changed, 37 insertions(+), 14 deletions(-) diff --git a/src/model/mod.rs b/src/model/mod.rs index 0380975..43760da 100644 --- a/src/model/mod.rs +++ b/src/model/mod.rs @@ -1,6 +1,7 @@ use chrono::NaiveDate; use serde::Serialize; use sqlx::SqlitePool; +use waterlevel::WaterlevelDay; use self::{ event::{Event, EventWithUserAndTriptype}, @@ -38,7 +39,7 @@ pub struct Day { events: Vec, trips: Vec, is_pinned: bool, - max_waterlevel: Option, + max_waterlevel: Option, weather: Option, } diff --git a/src/model/waterlevel.rs b/src/model/waterlevel.rs index 351b36a..2a09953 100644 --- a/src/model/waterlevel.rs +++ b/src/model/waterlevel.rs @@ -17,6 +17,13 @@ pub struct Waterlevel { pub tumittel: i64, } +#[derive(Debug, Serialize)] +pub struct WaterlevelDay { + pub day: NaiveDate, + pub avg: i64, + pub fluctuation: i64, +} + pub struct Create { pub day: NaiveDate, pub time: String, @@ -53,15 +60,28 @@ impl Waterlevel { Ok(()) } - pub async fn max_waterlevel_for_day(db: &SqlitePool, day: NaiveDate) -> Option { - sqlx::query!( - "SELECT MAX(mittel) as max FROM waterlevel WHERE day = ?", + pub async fn max_waterlevel_for_day(db: &SqlitePool, day: NaiveDate) -> Option { + let waterlevel = sqlx::query_as!( + Waterlevel, + "SELECT id, day, time, max, min, mittel, tumax, tumin, tumittel FROM waterlevel WHERE day = ? ORDER BY mittel DESC LIMIT 1", day ) - .fetch_one(db) - .await - .unwrap() - .max + .fetch_optional(db) + .await.unwrap(); + + if let Some(waterlevel) = waterlevel { + let max_diff = (waterlevel.mittel - waterlevel.max).abs(); + let min_diff = (waterlevel.mittel - waterlevel.min).abs(); + let fluctuation = max_diff.max(min_diff); + + return Some(WaterlevelDay { + day: waterlevel.day, + avg: waterlevel.mittel, + fluctuation, + }); + } + + None } pub async fn delete_all(db: &mut Transaction<'_, Sqlite>) { diff --git a/templates/impressum.html.tera b/templates/impressum.html.tera index c5d3636..0749b1e 100644 --- a/templates/impressum.html.tera +++ b/templates/impressum.html.tera @@ -100,7 +100,10 @@
  • - Die Wetterdaten werden von OpenWeather bereitgestellt. + Die Wetterdaten werden von OpenWeather bereitgestellt. +
  • +
  • + Wasserstandsvorhersagen: Die Vorhersagen werden stündlich vom Hydrographischen Dienstes Oberösterreich geladen und zwischengespeichert, der höchste Tages-Mittelwert wird gemeinsam mit der Schwankungsbreite bei den geplanten Ausfahrten angezeigt. Es handelt sich hierbei um ungeprüfte Rohdaten. Rohdatenfehler können durch betriebliche Störungen an den Messgeräten, Fernübertragungseinrichtungen u. dgl. entstehen. Die Vorhersagen sind daher mit Unsicherheiten behaftet! Mit der Länge des Vorhersagezeitraumeszeitraumes werden diese Unsicherheiten größer! Es wird keine Gewähr für die Vollständigkeit, Richtigkeit und Genauigkeit der dargestellten Daten übernommen. Gewährleistungs- und Haftungsansprüche werden ausdrücklich ausgeschlossen (sowohl vom Hydrographischen Dienstes Oberösterreich als auch vom ASKÖ Ruderverein Donau Linz).
diff --git a/templates/planned.html.tera b/templates/planned.html.tera index 649df55..d6191f5 100644 --- a/templates/planned.html.tera +++ b/templates/planned.html.tera @@ -79,7 +79,7 @@ {% if day.max_waterlevel %} • 🌊{{ day.max_waterlevel }} cm + title="Prognostizierter maximaler Wasserstand am {{ day.day | date(format="%A", locale="de_AT") }}: {{ day.max_waterlevel.avg }} ± {{ day.max_waterlevel.fluctuation }} cm (ungeprüfte Rohdaten, für Details siehe die Infos dazu im Impressum)">🌊{{ day.max_waterlevel.avg }} ± {{ day.max_waterlevel.fluctuation }} cm {% endif %} {% if day.weather %} @@ -197,8 +197,7 @@ {% endif %} {# --- END List Rowers --- #} {% if "manage_events" in loggedin_user.roles %} -
+ {{ macros::input(label='Gast', class="input rounded-t", name='user_note', type='text', required=true) }}
@@ -244,7 +243,7 @@
- {{ macros::input(label='Grund der Absage', name='notes', type='input', value='') }} + {{ macros::input(label='Grund der Absage', name='notes', type='input', value='') }} {{ macros::input(label='', name='max_people', type='hidden', value=0) }} {{ macros::input(label='', name='name', type='hidden', value=event.name) }} {{ macros::input(label='', name='max_people', type='hidden', value=event.max_people) }}