Compare commits

..

5 Commits

Author SHA1 Message Date
80ac131fb2 Merge pull request 'default-dest-table' (#676) from default-dest-table into staging
All checks were successful
CI/CD Pipeline / test (push) Successful in 9m0s
CI/CD Pipeline / deploy-staging (push) Successful in 6m30s
CI/CD Pipeline / deploy-main (push) Has been skipped
Reviewed-on: #676
2024-08-18 20:53:06 +02:00
8e65a6540d fix tests
All checks were successful
CI/CD Pipeline / test (push) Successful in 9m13s
CI/CD Pipeline / deploy-staging (push) Has been skipped
CI/CD Pipeline / deploy-main (push) Has been skipped
2024-08-18 20:43:45 +02:00
d7e5731753 order by most used destination
Some checks failed
CI/CD Pipeline / deploy-staging (push) Blocked by required conditions
CI/CD Pipeline / deploy-main (push) Blocked by required conditions
CI/CD Pipeline / test (push) Has been cancelled
2024-08-18 20:34:55 +02:00
1a4d5ac569 create own default_destination table to remove clutter; Fixes #646
Some checks failed
CI/CD Pipeline / deploy-staging (push) Blocked by required conditions
CI/CD Pipeline / deploy-main (push) Blocked by required conditions
CI/CD Pipeline / test (push) Has been cancelled
2024-08-18 20:21:59 +02:00
668fc5e295 Merge pull request 'Keep selected rowers during boat change, Fixes #48' (#675) from keep-rowers-on-boatchange into main
All checks were successful
CI/CD Pipeline / test (push) Successful in 8m58s
CI/CD Pipeline / deploy-staging (push) Has been skipped
CI/CD Pipeline / deploy-main (push) Successful in 6m37s
Reviewed-on: #675
2024-08-15 15:51:12 +02:00
7 changed files with 48 additions and 38 deletions

View File

@ -213,3 +213,9 @@ CREATE TABLE IF NOT EXISTS "trailer_reservation" (
"created_at" datetime not null default CURRENT_TIMESTAMP "created_at" datetime not null default CURRENT_TIMESTAMP
); );
CREATE TABLE IF NOT EXISTS "distance" (
"id" integer NOT NULL PRIMARY KEY AUTOINCREMENT,
"destination" text NOT NULL,
"distance_in_km" integer NOT NULL
);

View File

@ -67,3 +67,5 @@ INSERT INTO "boat_damage" (boat_id, desc, user_id_created, created_at, lock_boat
INSERT INTO "notification" (user_id, message, category) VALUES (1, 'This is a test notification', 'test-cat'); INSERT INTO "notification" (user_id, message, category) VALUES (1, 'This is a test notification', 'test-cat');
INSERT INTO "trailer" (name) VALUES('Großer Hänger'); INSERT INTO "trailer" (name) VALUES('Großer Hänger');
INSERT INTO "trailer" (name) VALUES('Kleiner Hänger'); INSERT INTO "trailer" (name) VALUES('Kleiner Hänger');
insert into distance(destination, distance_in_km) values('Ottensheim', 25);

33
src/model/distance.rs Normal file
View File

@ -0,0 +1,33 @@
use serde::Serialize;
use sqlx::{FromRow, SqlitePool};
#[derive(FromRow, Serialize, Clone, Debug)]
pub struct Distance {
pub id: i64,
pub destination: String,
pub distance_in_km: i64,
}
impl Distance {
/// Return all default `distance`s, ordered by usage in logbook entries
pub async fn all(db: &SqlitePool) -> Vec<Self> {
sqlx::query_as!(
Self,
"SELECT
d.id,
d.destination,
d.distance_in_km
FROM
distance d
LEFT JOIN
logbook l ON d.destination = l.destination AND d.distance_in_km = l.distance_in_km
GROUP BY
d.id, d.destination, d.distance_in_km
ORDER BY
COUNT(l.id) DESC, d.destination ASC;"
)
.fetch_all(db)
.await
.unwrap()
}
}

View File

@ -496,25 +496,6 @@ ORDER BY departure DESC
Ok(()) Ok(())
} }
pub async fn distances(db: &SqlitePool) -> Vec<(String, i64)> {
let result = sqlx::query!("SELECT destination, distance_in_km FROM logbook WHERE id IN (SELECT MIN(id) FROM logbook GROUP BY destination) AND destination IS NOT NULL AND distance_in_km IS NOT NULL;")
.fetch_all(db)
.await
.unwrap();
result
.into_iter()
.filter_map(|r| {
if let (Some(destination), Some(distance_in_km)) = (r.destination, r.distance_in_km)
{
Some((destination, distance_in_km))
} else {
None
}
})
.collect()
}
async fn remove_rowers(&self, db: &mut Transaction<'_, Sqlite>) { async fn remove_rowers(&self, db: &mut Transaction<'_, Sqlite>) {
sqlx::query!("DELETE FROM rower WHERE logbook_id=?", self.id) sqlx::query!("DELETE FROM rower WHERE logbook_id=?", self.id)
.execute(db.deref_mut()) .execute(db.deref_mut())
@ -1071,21 +1052,6 @@ mod test {
assert_eq!(res, Err(LogbookCreateError::TooManyRowers(1, 2))); assert_eq!(res, Err(LogbookCreateError::TooManyRowers(1, 2)));
} }
#[sqlx::test]
fn test_distances() {
let pool = testdb!();
let res = Logbook::distances(&pool).await;
assert_eq!(
res,
vec![
("Ottensheim".into(), 25 as i64),
("Ottensheim + Regattastrecke".into(), 29 as i64),
]
);
}
#[sqlx::test] #[sqlx::test]
fn test_succ_home() { fn test_succ_home() {
let pool = testdb!(); let pool = testdb!();

View File

@ -14,6 +14,7 @@ pub mod boat;
pub mod boatdamage; pub mod boatdamage;
pub mod boathouse; pub mod boathouse;
pub mod boatreservation; pub mod boatreservation;
pub mod distance;
pub mod event; pub mod event;
pub mod family; pub mod family;
pub mod location; pub mod location;

View File

@ -18,6 +18,7 @@ use tera::Context;
use crate::model::{ use crate::model::{
boat::Boat, boat::Boat,
boatreservation::BoatReservation, boatreservation::BoatReservation,
distance::Distance,
log::Log, log::Log,
logbook::{ logbook::{
LogToAdd, LogToFinalize, LogToUpdate, Logbook, LogbookAdminUpdateError, LogbookCreateError, LogToAdd, LogToFinalize, LogToUpdate, Logbook, LogbookAdminUpdateError, LogbookCreateError,
@ -75,7 +76,7 @@ async fn index(
}); });
let logtypes = LogType::all(db).await; let logtypes = LogType::all(db).await;
let distances = Logbook::distances(db).await; let distances = Distance::all(db).await;
let on_water = Logbook::on_water(db).await; let on_water = Logbook::on_water(db).await;
@ -180,7 +181,7 @@ async fn kiosk(
}); });
let logtypes = LogType::all(db).await; let logtypes = LogType::all(db).await;
let distances = Logbook::distances(db).await; let distances = Distance::all(db).await;
let on_water = Logbook::on_water(db).await; let on_water = Logbook::on_water(db).await;

View File

@ -53,9 +53,10 @@
id="destination" id="destination"
name="destination" name="destination"
value="" value=""
data-relation="distance_in_km" /> data-relation="distance_in_km"
autocomplete="off" />
<datalist id="destinations"> <datalist id="destinations">
{% for distance in distances %}<option value="{{ distance.0 }}" distance="{{ distance.1 }}" />{% endfor %} {% for distance in distances %}<option value="{{ distance.destination }}" distance="{{ distance.distance_in_km}}" />{% endfor %}
</datalist> </datalist>
</div> </div>
<div class="relative col-span-2"> <div class="relative col-span-2">