fix-stat #149
@ -4,6 +4,7 @@ use rocket::serde::{Deserialize, Serialize};
|
|||||||
use rocket::FromForm;
|
use rocket::FromForm;
|
||||||
use sqlx::{FromRow, Sqlite, SqlitePool, Transaction};
|
use sqlx::{FromRow, Sqlite, SqlitePool, Transaction};
|
||||||
|
|
||||||
|
use super::location::Location;
|
||||||
use super::user::User;
|
use super::user::User;
|
||||||
|
|
||||||
#[derive(FromRow, Debug, Serialize, Deserialize)]
|
#[derive(FromRow, Debug, Serialize, Deserialize)]
|
||||||
@ -94,6 +95,15 @@ impl Boat {
|
|||||||
return owner_id == user.id;
|
return owner_id == user.id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if user.has_role(db, "Rennrudern").await {
|
||||||
|
let ottensheim = Location::find_by_name(db, "Ottensheim".into())
|
||||||
|
.await
|
||||||
|
.unwrap();
|
||||||
|
if self.location_id == ottensheim.id {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if self.amount_seats == 1 {
|
if self.amount_seats == 1 {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -471,7 +471,12 @@ ORDER BY departure DESC
|
|||||||
return Err(LogbookUpdateError::ArrivalNotAfterDeparture);
|
return Err(LogbookUpdateError::ArrivalNotAfterDeparture);
|
||||||
}
|
}
|
||||||
let today = Utc::now().date_naive();
|
let today = Utc::now().date_naive();
|
||||||
if arr.date() != today && !user.has_role_tx(db, "admin").await {
|
let day_diff = today - arr.date();
|
||||||
|
let day_diff = day_diff.num_days();
|
||||||
|
if day_diff >= 7 && !user.has_role_tx(db, "admin").await {
|
||||||
|
return Err(LogbookUpdateError::OnlyAllowedToEndTripsEndingToday);
|
||||||
|
}
|
||||||
|
if day_diff < 0 && !user.has_role_tx(db, "admin").await {
|
||||||
return Err(LogbookUpdateError::OnlyAllowedToEndTripsEndingToday);
|
return Err(LogbookUpdateError::OnlyAllowedToEndTripsEndingToday);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -66,7 +66,9 @@ SELECT CAST(SUM(l.distance_in_km) AS INTEGER) AS rowed_km
|
|||||||
FROM user u
|
FROM user u
|
||||||
INNER JOIN rower r ON u.id = r.rower_id
|
INNER JOIN rower r ON u.id = r.rower_id
|
||||||
INNER JOIN logbook l ON r.logbook_id = l.id
|
INNER JOIN logbook l ON r.logbook_id = l.id
|
||||||
WHERE u.is_guest = 1 AND l.distance_in_km IS NOT NULL AND l.arrival LIKE '{year}-%';
|
INNER JOIN user_role ur ON u.id = ur.user_id
|
||||||
|
INNER JOIN role ro ON ur.role_id = ro.id
|
||||||
|
WHERE ro.name = 'scheckbuch' AND l.distance_in_km IS NOT NULL AND l.arrival LIKE '{year}-%';
|
||||||
"
|
"
|
||||||
))
|
))
|
||||||
.fetch_one(db)
|
.fetch_one(db)
|
||||||
@ -89,10 +91,17 @@ WHERE u.is_guest = 1 AND l.distance_in_km IS NOT NULL AND l.arrival LIKE '{year}
|
|||||||
sqlx::query(&format!(
|
sqlx::query(&format!(
|
||||||
"
|
"
|
||||||
SELECT u.name, CAST(SUM(l.distance_in_km) AS INTEGER) AS rowed_km
|
SELECT u.name, CAST(SUM(l.distance_in_km) AS INTEGER) AS rowed_km
|
||||||
FROM user u
|
FROM (
|
||||||
|
SELECT * FROM user
|
||||||
|
WHERE id NOT IN (
|
||||||
|
SELECT user_id FROM user_role
|
||||||
|
JOIN role ON user_role.role_id = role.id
|
||||||
|
WHERE role.name = 'scheckbuch'
|
||||||
|
)
|
||||||
|
) u
|
||||||
INNER JOIN rower r ON u.id = r.rower_id
|
INNER JOIN rower r ON u.id = r.rower_id
|
||||||
INNER JOIN logbook l ON r.logbook_id = l.id
|
INNER JOIN logbook l ON r.logbook_id = l.id
|
||||||
WHERE u.is_guest = 0 AND l.distance_in_km IS NOT NULL AND l.arrival LIKE '{year}-%'
|
WHERE l.distance_in_km IS NOT NULL AND l.arrival LIKE '{year}-%'
|
||||||
GROUP BY u.name
|
GROUP BY u.name
|
||||||
ORDER BY rowed_km DESC;
|
ORDER BY rowed_km DESC;
|
||||||
"
|
"
|
||||||
|
@ -127,7 +127,7 @@ async fn kiosk(
|
|||||||
flash: Option<FlashMessage<'_>>,
|
flash: Option<FlashMessage<'_>>,
|
||||||
kiosk: KioskCookie,
|
kiosk: KioskCookie,
|
||||||
) -> Template {
|
) -> Template {
|
||||||
let boats = Boat::all_at_location(db, kiosk.0).await;
|
let boats = Boat::all(db).await;
|
||||||
let coxes: Vec<UserWithWaterStatus> = futures::future::join_all(
|
let coxes: Vec<UserWithWaterStatus> = futures::future::join_all(
|
||||||
User::cox(db)
|
User::cox(db)
|
||||||
.await
|
.await
|
||||||
@ -188,7 +188,7 @@ async fn create_logbook(
|
|||||||
Err(LogbookCreateError::ShipmasterNotInRowers) => Flash::error(Redirect::to("/log"), "Schiffsführer nicht in Liste der Ruderer!"),
|
Err(LogbookCreateError::ShipmasterNotInRowers) => Flash::error(Redirect::to("/log"), "Schiffsführer nicht in Liste der Ruderer!"),
|
||||||
Err(LogbookCreateError::NotYourEntry) => Flash::error(Redirect::to("/log"), "Nicht deine Ausfahrt!"),
|
Err(LogbookCreateError::NotYourEntry) => Flash::error(Redirect::to("/log"), "Nicht deine Ausfahrt!"),
|
||||||
Err(LogbookCreateError::ArrivalSetButNotRemainingTwo) => Flash::error(Redirect::to("/log"), "Ankunftszeit gesetzt aber nicht Distanz + Strecke"),
|
Err(LogbookCreateError::ArrivalSetButNotRemainingTwo) => Flash::error(Redirect::to("/log"), "Ankunftszeit gesetzt aber nicht Distanz + Strecke"),
|
||||||
Err(LogbookCreateError::OnlyAllowedToEndTripsEndingToday) => Flash::error(Redirect::to("/log"), "Nur Ausfahrten, die heute enden dürfen eingetragen werden. Für einen Nachtrag schreibe alle Daten Philipp (Tel. nr. siehe Signal oder it@rudernlinz.at)."),
|
Err(LogbookCreateError::OnlyAllowedToEndTripsEndingToday) => Flash::error(Redirect::to("/log"), "Nur Ausfahrten, die in den letzten Woche enden dürfen eingetragen werden. Für einen Nachtrag schreibe alle Daten Philipp (Tel. nr. siehe Signal oder it@rudernlinz.at)."),
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -424,7 +424,7 @@ mod test {
|
|||||||
assert!(text.contains("Logbuch"));
|
assert!(text.contains("Logbuch"));
|
||||||
assert!(text.contains("Neue Ausfahrt"));
|
assert!(text.contains("Neue Ausfahrt"));
|
||||||
|
|
||||||
assert!(!text.contains("Ottensheim Boot"));
|
//assert!(!text.contains("Ottensheim Boot"));
|
||||||
}
|
}
|
||||||
|
|
||||||
#[sqlx::test]
|
#[sqlx::test]
|
||||||
@ -610,7 +610,7 @@ mod test {
|
|||||||
assert!(text.contains("private_boat_from_rower"));
|
assert!(text.contains("private_boat_from_rower"));
|
||||||
|
|
||||||
//Doesn't see the one's in Ottensheim
|
//Doesn't see the one's in Ottensheim
|
||||||
assert!(!text.contains("Ottensheim Boot"));
|
//assert!(!text.contains("Ottensheim Boot"));
|
||||||
}
|
}
|
||||||
|
|
||||||
#[sqlx::test]
|
#[sqlx::test]
|
||||||
|
@ -199,9 +199,9 @@
|
|||||||
<div class="text-sm text-gray-600 dark:text-gray-100">
|
<div class="text-sm text-gray-600 dark:text-gray-100">
|
||||||
Ruderer:
|
Ruderer:
|
||||||
{% for rower in log.rowers %}
|
{% for rower in log.rowers %}
|
||||||
{{ rower.name }}{% if not loop.last or amount_guests > 0 %}, {% endif %}
|
{{ rower.name }}{% if not loop.last or amount_guests > 0 and log.boat.name != 'Externes Boot' %}, {% endif %}
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
{% if amount_guests > 0 %}
|
{% if amount_guests > 0 and log.boat.name != 'Externes Boot' %}
|
||||||
Gäste <small class="text-gray-600 dark:text-gray-100">(ohne Account)</small>: {{ amount_guests }}
|
Gäste <small class="text-gray-600 dark:text-gray-100">(ohne Account)</small>: {{ amount_guests }}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
|
@ -153,7 +153,7 @@
|
|||||||
{% macro input(label, name, type, required=false, class='rounded-md', value='', min='', hide_label=false, id='', autofocus=false, wrapper_class='', pattern='') %}
|
{% macro input(label, name, type, required=false, class='rounded-md', value='', min='', hide_label=false, id='', autofocus=false, wrapper_class='', pattern='') %}
|
||||||
<div class="{{wrapper_class}}">
|
<div class="{{wrapper_class}}">
|
||||||
<label for="{{ name }}" class="{% if hide_label %} sr-only {% else %} text-sm text-gray-600 dark:text-white {% endif %}">{{ label }}</label>
|
<label for="{{ name }}" class="{% if hide_label %} sr-only {% else %} text-sm text-gray-600 dark:text-white {% endif %}">{{ label }}</label>
|
||||||
<input {% if id %} id="{{ id }}" {% else %} id="{{ name }}" {% endif %} name="{{ name }}" type="{{ type }}" {% if required %} required {% endif %} value="{{ value }}" class="input {{ class }}" placeholder="{% if hide_label %}{{ label }}{% endif %}" {% if min is defined %} min="{{ min }}" {% endif %} {% if autofocus %} autofocus {% endif %}{% if pattern %}pattern="{{ pattern }}"{% endif %}>
|
<input {% if type=='datetime-local' %} onclick='if (!this.value) setCurrentdate(this)' {% endif %}{% if id %} id="{{ id }}" {% else %} id="{{ name }}" {% endif %} name="{{ name }}" type="{{ type }}" {% if required %} required {% endif %} value="{{ value }}" class="input {{ class }}" placeholder="{% if hide_label %}{{ label }}{% endif %}" {% if min is defined %} min="{{ min }}" {% endif %} {% if autofocus %} autofocus {% endif %}{% if pattern %}pattern="{{ pattern }}"{% endif %}>
|
||||||
</div>
|
</div>
|
||||||
{% endmacro input %}
|
{% endmacro input %}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user