Merge pull request 'use proper hydro license; add fluctuation' (#584) from proper-hydro into main
Reviewed-on: #584
This commit is contained in:
commit
01637d0800
@ -1,6 +1,7 @@
|
|||||||
use chrono::NaiveDate;
|
use chrono::NaiveDate;
|
||||||
use serde::Serialize;
|
use serde::Serialize;
|
||||||
use sqlx::SqlitePool;
|
use sqlx::SqlitePool;
|
||||||
|
use waterlevel::WaterlevelDay;
|
||||||
|
|
||||||
use self::{
|
use self::{
|
||||||
event::{Event, EventWithUserAndTriptype},
|
event::{Event, EventWithUserAndTriptype},
|
||||||
@ -38,7 +39,7 @@ pub struct Day {
|
|||||||
events: Vec<EventWithUserAndTriptype>,
|
events: Vec<EventWithUserAndTriptype>,
|
||||||
trips: Vec<TripWithUserAndType>,
|
trips: Vec<TripWithUserAndType>,
|
||||||
is_pinned: bool,
|
is_pinned: bool,
|
||||||
max_waterlevel: Option<i64>,
|
max_waterlevel: Option<WaterlevelDay>,
|
||||||
weather: Option<Weather>,
|
weather: Option<Weather>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -17,6 +17,13 @@ pub struct Waterlevel {
|
|||||||
pub tumittel: i64,
|
pub tumittel: i64,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Serialize)]
|
||||||
|
pub struct WaterlevelDay {
|
||||||
|
pub day: NaiveDate,
|
||||||
|
pub avg: i64,
|
||||||
|
pub fluctuation: i64,
|
||||||
|
}
|
||||||
|
|
||||||
pub struct Create {
|
pub struct Create {
|
||||||
pub day: NaiveDate,
|
pub day: NaiveDate,
|
||||||
pub time: String,
|
pub time: String,
|
||||||
@ -53,15 +60,28 @@ impl Waterlevel {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn max_waterlevel_for_day(db: &SqlitePool, day: NaiveDate) -> Option<i64> {
|
pub async fn max_waterlevel_for_day(db: &SqlitePool, day: NaiveDate) -> Option<WaterlevelDay> {
|
||||||
sqlx::query!(
|
let waterlevel = sqlx::query_as!(
|
||||||
"SELECT MAX(mittel) as max FROM waterlevel WHERE day = ?",
|
Waterlevel,
|
||||||
|
"SELECT id, day, time, max, min, mittel, tumax, tumin, tumittel FROM waterlevel WHERE day = ? ORDER BY mittel DESC LIMIT 1",
|
||||||
day
|
day
|
||||||
)
|
)
|
||||||
.fetch_one(db)
|
.fetch_optional(db)
|
||||||
.await
|
.await.unwrap();
|
||||||
.unwrap()
|
|
||||||
.max
|
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>) {
|
pub async fn delete_all(db: &mut Transaction<'_, Sqlite>) {
|
||||||
|
@ -100,7 +100,10 @@
|
|||||||
<div class="p-3">
|
<div class="p-3">
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
Die Wetterdaten werden von <a class="underline" href="https://openweathermap.org">OpenWeather</a> bereitgestellt.
|
Die <strong>Wetterdaten</strong> werden von <a class="underline" href="https://openweathermap.org">OpenWeather</a> bereitgestellt.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<strong>Wasserstandsvorhersagen:</strong> Die Vorhersagen werden stündlich vom <a class="underline" href="https://hydro.ooe.gv.at">Hydrographischen Dienstes Oberösterreich</a> 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).
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
@ -79,7 +79,7 @@
|
|||||||
{% if day.max_waterlevel %}
|
{% if day.max_waterlevel %}
|
||||||
• <a href="https://hydro.ooe.gv.at/#/overview/Wasserstand/station/16668/Linz/Wasserstand"
|
• <a href="https://hydro.ooe.gv.at/#/overview/Wasserstand/station/16668/Linz/Wasserstand"
|
||||||
target="_blank"
|
target="_blank"
|
||||||
title="Prognostizierter maximaler Wasserstand am {{ day.day | date(format="%A", locale="de_AT") }}: {{ day.max_waterlevel }} cm">🌊{{ day.max_waterlevel }} cm</a>
|
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</a>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</small>
|
</small>
|
||||||
{% if day.weather %}
|
{% if day.weather %}
|
||||||
@ -197,8 +197,7 @@
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
{# --- END List Rowers --- #}
|
{# --- END List Rowers --- #}
|
||||||
{% if "manage_events" in loggedin_user.roles %}
|
{% if "manage_events" in loggedin_user.roles %}
|
||||||
<form action="/planned/join/{{ event.trip_details_id }}"
|
<form action="/planned/join/{{ event.trip_details_id }}" method="get" />
|
||||||
method="get" />
|
|
||||||
{{ macros::input(label='Gast', class="input rounded-t", name='user_note', type='text', required=true) }}
|
{{ macros::input(label='Gast', class="input rounded-t", name='user_note', type='text', required=true) }}
|
||||||
<input value="Gast hinzufügen"
|
<input value="Gast hinzufügen"
|
||||||
class="btn btn-primary w-full rounded-t-none-important"
|
class="btn btn-primary w-full rounded-t-none-important"
|
||||||
@ -220,7 +219,7 @@
|
|||||||
{{ macros::input(label='Anzahl Steuerleute', name='planned_amount_cox', type='number', value=event.planned_amount_cox, required=true, min='0') }}
|
{{ macros::input(label='Anzahl Steuerleute', name='planned_amount_cox', type='number', value=event.planned_amount_cox, required=true, min='0') }}
|
||||||
{{ macros::checkbox(label='Immer anzeigen', name='always_show', id=event.id,checked=event.always_show) }}
|
{{ macros::checkbox(label='Immer anzeigen', name='always_show', id=event.id,checked=event.always_show) }}
|
||||||
{{ macros::checkbox(label='Gesperrt', name='is_locked', id=event.id,checked=event.is_locked) }}
|
{{ macros::checkbox(label='Gesperrt', name='is_locked', id=event.id,checked=event.is_locked) }}
|
||||||
{{ macros::select(label='Typ', name='trip_type', data=trip_types, default='Reguläre Ausfahrt', selected_id=event.trip_type_id) }}
|
{{ macros::select(label='Typ', name='trip_type', data=trip_types, default='Reguläre Ausfahrt', selected_id=event.trip_type_id) }}
|
||||||
{{ macros::input(label='Anmerkungen', name='notes', type='input', value=event.notes) }}
|
{{ macros::input(label='Anmerkungen', name='notes', type='input', value=event.notes) }}
|
||||||
<input value="Speichern" class="btn btn-primary" type="submit" />
|
<input value="Speichern" class="btn btn-primary" type="submit" />
|
||||||
</form>
|
</form>
|
||||||
@ -244,7 +243,7 @@
|
|||||||
<form action="/admin/planned-event" method="post" class="grid">
|
<form action="/admin/planned-event" method="post" class="grid">
|
||||||
<input type="hidden" name="_method" value="put" />
|
<input type="hidden" name="_method" value="put" />
|
||||||
<input type="hidden" name="id" value="{{ event.id }}" />
|
<input type="hidden" name="id" value="{{ event.id }}" />
|
||||||
{{ macros::input(label='Grund der Absage', name='notes', type='input', value='') }}
|
{{ macros::input(label='Grund der Absage', name='notes', type='input', value='') }}
|
||||||
{{ macros::input(label='', name='max_people', type='hidden', value=0) }}
|
{{ macros::input(label='', name='max_people', type='hidden', value=0) }}
|
||||||
{{ macros::input(label='', name='name', type='hidden', value=event.name) }}
|
{{ macros::input(label='', name='name', type='hidden', value=event.name) }}
|
||||||
{{ macros::input(label='', name='max_people', type='hidden', value=event.max_people) }}
|
{{ macros::input(label='', name='max_people', type='hidden', value=event.max_people) }}
|
||||||
|
Loading…
Reference in New Issue
Block a user