diff --git a/.gitea/workflows/action.yml b/.gitea/workflows/action.yml index fb36000..f1704d2 100644 --- a/.gitea/workflows/action.yml +++ b/.gitea/workflows/action.yml @@ -17,17 +17,8 @@ jobs: - name: Run Test DB Script run: ./test_db.sh - - name: Set up cargo cache - uses: actions/cache@v3 - with: - path: | - ~/.cargo/bin/ - ~/.cargo/registry/index/ - ~/.cargo/registry/cache/ - ~/.cargo/git/db/ - target/ - key: ${{ runner.os }}-cargo-debug-rowt-${{ hashFiles('**/Cargo.lock') }} - restore-keys: ${{ runner.os }}-cargo-debug-rowt- + - name: Cache Cargo dependencies + uses: Swatinem/rust-cache@v2 - name: Build run: | @@ -56,17 +47,9 @@ jobs: - name: Run Test DB Script run: ./test_db.sh - - name: Set up cargo cache - uses: actions/cache@v3 - with: - path: | - ~/.cargo/bin/ - ~/.cargo/registry/index/ - ~/.cargo/registry/cache/ - ~/.cargo/git/db/ - target/ - key: ${{ runner.os }}-cargo-release-rowt-${{ hashFiles('**/Cargo.lock') }} - restore-keys: ${{ runner.os }}-cargo-release-rowt- + - name: Cache Cargo dependencies + uses: Swatinem/rust-cache@v2 + - name: Build run: | cargo build --release --target $CARGO_TARGET @@ -107,17 +90,8 @@ jobs: - name: Run Test DB Script run: ./test_db.sh - - name: Set up cargo cache - uses: actions/cache@v3 - with: - path: | - ~/.cargo/bin/ - ~/.cargo/registry/index/ - ~/.cargo/registry/cache/ - ~/.cargo/git/db/ - target/ - key: ${{ runner.os }}-cargo-release-rowt-${{ hashFiles('**/Cargo.lock') }} - restore-keys: ${{ runner.os }}-cargo-release-rowt- + - name: Cache Cargo dependencies + uses: Swatinem/rust-cache@v2 - name: Build run: | diff --git a/frontend/tests/log.spec.ts b/frontend/tests/log.spec.ts index 64d2c09..b12f0cb 100644 --- a/frontend/tests/log.spec.ts +++ b/frontend/tests/log.spec.ts @@ -12,10 +12,10 @@ test("Cox can start and cancel trip", async ({ page }, testInfo) => { await page.getByRole("link", { name: "Ausfahrt eintragen" }).click(); if (testInfo.project.name.includes("Mobile")) { // No left boat selector on mobile views - await page.getByText("Kaputtes Boot :-( (7 x)").nth(1).click(); + await page.getByText("Kaputtes Boot :-( (7x)").nth(1).click(); await page.getByRole("option", { name: "Joe" }).click(); } else { - await page.getByText('2x').click(); + await page.getByText('2x', { exact: true }).click(); await page.getByText("Joe", { exact: true }).click(); } await page.getByPlaceholder("Ruderer auswählen").click(); @@ -53,10 +53,10 @@ test("Cox can start and finish trip", async ({ page }, testInfo) => { await page.getByRole("link", { name: "Ausfahrt eintragen" }).click(); if (testInfo.project.name.includes("Mobile")) { // No left boat selector on mobile views - await page.getByText("Kaputtes Boot :-( (7 x)").nth(1).click(); + await page.getByText("Kaputtes Boot :-( (7x)").nth(1).click(); await page.getByRole("option", { name: "Joe" }).click(); } else { - await page.getByText('2x').click(); + await page.getByText('2x', { exact: true }).click(); await page.getByText("Joe", { exact: true }).click(); } await page.getByPlaceholder("Ruderer auswählen").click(); @@ -105,10 +105,10 @@ test("Kiosk can start and cancel trip", async ({ page }, testInfo) => { await page.goto("/log/kiosk/ekrv2019/Linz"); if (testInfo.project.name.includes("Mobile")) { // No left boat selector on mobile views - await page.getByText("Kaputtes Boot :-( (7 x)").nth(1).click(); + await page.getByText("Kaputtes Boot :-( (7x)").nth(1).click(); await page.getByRole("option", { name: "Joe" }).click(); } else { - await page.getByText('2x').click(); + await page.getByText('2x', { exact: true }).click(); await page.getByText("Joe", { exact: true }).click(); } await page.getByPlaceholder("Ruderer auswählen").click(); @@ -139,10 +139,10 @@ test("Kiosk can start and finish trip", async ({ page }, testInfo) => { if (testInfo.project.name.includes("Mobile")) { // No left boat selector on mobile views - await page.getByText("Kaputtes Boot :-( (7 x)").nth(1).click(); + await page.getByText("Kaputtes Boot :-( (7x)").nth(1).click(); await page.getByRole("option", { name: "Joe" }).click(); } else { - await page.getByText('2x').click(); + await page.getByText('2x', { exact: true }).click(); await page.getByText("Joe", { exact: true }).click(); } await page.getByPlaceholder("Ruderer auswählen").click(); diff --git a/src/model/boat.rs b/src/model/boat.rs index 5860d32..115acec 100644 --- a/src/model/boat.rs +++ b/src/model/boat.rs @@ -21,9 +21,9 @@ pub struct Boat { pub boatbuilder: Option, pub default_destination: Option, #[serde(default = "bool::default")] - convert_handoperated_possible: bool, + pub convert_handoperated_possible: bool, #[serde(default = "bool::default")] - default_shipmaster_only_steering: bool, + pub default_shipmaster_only_steering: bool, #[serde(default = "bool::default")] skull: bool, #[serde(default = "bool::default")] @@ -46,6 +46,7 @@ pub struct BoatWithDetails { damage: BoatDamage, on_water: bool, reserved_today: bool, + cat: String, } #[derive(FromForm)] @@ -179,11 +180,18 @@ AND date('now') BETWEEN start_date AND end_date;", if boat.is_locked(db).await { damage = BoatDamage::Locked; } + let cat = if boat.default_shipmaster_only_steering { + format!("{}+", boat.amount_seats - 1) + } else { + format!("{}x", boat.amount_seats) + }; + res.push(BoatWithDetails { damage, on_water: boat.on_water(db).await, reserved_today: boat.reserved_today(db).await, boat, + cat, }); } res diff --git a/src/model/logbook.rs b/src/model/logbook.rs index 5d83f12..156ad8e 100644 --- a/src/model/logbook.rs +++ b/src/model/logbook.rs @@ -126,6 +126,7 @@ pub enum LogbookCreateError { NotYourEntry, ArrivalSetButNotRemainingTwo, OnlyAllowedToEndTripsEndingToday, + CantChangeHandoperatableStatusForThisBoat, } impl From for LogbookCreateError { @@ -302,6 +303,12 @@ ORDER BY departure DESC return Err(LogbookCreateError::BoatNotFound); }; + if log.shipmaster_only_steering != boat.default_shipmaster_only_steering { + if !boat.convert_handoperated_possible { + return Err(LogbookCreateError::CantChangeHandoperatableStatusForThisBoat); + } + } + if boat.amount_seats == 1 && log.rowers.is_empty() { log.rowers = vec![created_by_user.id]; } diff --git a/src/tera/log.rs b/src/tera/log.rs index 241f36c..2c618b0 100644 --- a/src/tera/log.rs +++ b/src/tera/log.rs @@ -214,6 +214,7 @@ async fn create_logbook( 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::OnlyAllowedToEndTripsEndingToday) => Flash::error(Redirect::to("/log"), "Nur Ausfahrten, die in der letzten Woche enden dürfen eingetragen werden. Für einen Nachtrag schreibe alle Daten Philipp (Tel. nr. siehe Signal oder it@rudernlinz.at)."), + Err(LogbookCreateError::CantChangeHandoperatableStatusForThisBoat) => Flash::error(Redirect::to("/log"), "Handsteuer-Status dieses Boots kann nicht verändert werden."), } } diff --git a/templates/includes/forms/log.html.tera b/templates/includes/forms/log.html.tera index 99d308e..c70fb8c 100644 --- a/templates/includes/forms/log.html.tera +++ b/templates/includes/forms/log.html.tera @@ -3,16 +3,14 @@ Inputs: boats #} {% macro show_boats() %} - {% for amount_seats, grouped_boats in boats | group_by(attribute="amount_seats") %} + {% for amount_seats, grouped_boats in boats | group_by(attribute="cat") %}
{% if grouped_boats[0].external %} Vereinsfremde Boote - {% elif grouped_boats[0].default_shipmaster_only_steering %} - {{ grouped_boats[0].amount_seats - 1 }}+ {% else %} - {{ amount_seats }}x + {{ grouped_boats[0].cat }} {% endif %} ({{ grouped_boats | length }}) @@ -78,7 +76,7 @@ {% endmacro new %} {% macro boat_select(id="boat_id") %} - {{ macros::select(label="Boot", data=boats, name="boat_id", id=id, display=["name", " (","amount_seats", " x)"], extras=["default_shipmaster_only_steering", "amount_seats", "on_water", "default_destination"], wrapper_class="col-span-4", show_seats=true) }} + {{ macros::select(label="Boot", data=boats, name="boat_id", id=id, display=["name", " (","cat",")"], extras=["default_shipmaster_only_steering", "amount_seats", "on_water", "default_destination"], wrapper_class="col-span-4", show_seats=true) }} {% endmacro boat_select %} {% macro rower_select(id, selected, amount_seats='', class='', init='false', cox_on_boat='', steering_person_id='') %} {#{% if not amount_seats or amount_seats > 1 %}#}