fix-ci-db #437

Merged
philipp merged 10 commits from fix-ci-db into staging 2024-04-24 15:58:19 +02:00
7 changed files with 36 additions and 51 deletions

View File

@ -17,17 +17,8 @@ jobs:
- name: Run Test DB Script - name: Run Test DB Script
run: ./test_db.sh run: ./test_db.sh
- name: Set up cargo cache - name: Cache Cargo dependencies
uses: actions/cache@v3 uses: Swatinem/rust-cache@v2
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: Build - name: Build
run: | run: |
@ -56,17 +47,9 @@ jobs:
- name: Run Test DB Script - name: Run Test DB Script
run: ./test_db.sh run: ./test_db.sh
- name: Set up cargo cache - name: Cache Cargo dependencies
uses: actions/cache@v3 uses: Swatinem/rust-cache@v2
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: Build - name: Build
run: | run: |
cargo build --release --target $CARGO_TARGET cargo build --release --target $CARGO_TARGET
@ -107,17 +90,8 @@ jobs:
- name: Run Test DB Script - name: Run Test DB Script
run: ./test_db.sh run: ./test_db.sh
- name: Set up cargo cache - name: Cache Cargo dependencies
uses: actions/cache@v3 uses: Swatinem/rust-cache@v2
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: Build - name: Build
run: | run: |

View File

@ -12,10 +12,10 @@ test("Cox can start and cancel trip", async ({ page }, testInfo) => {
await page.getByRole("link", { name: "Ausfahrt eintragen" }).click(); await page.getByRole("link", { name: "Ausfahrt eintragen" }).click();
if (testInfo.project.name.includes("Mobile")) { if (testInfo.project.name.includes("Mobile")) {
// No left boat selector on mobile views // 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(); await page.getByRole("option", { name: "Joe" }).click();
} else { } else {
await page.getByText('2x').click(); await page.getByText('2x', { exact: true }).click();
await page.getByText("Joe", { exact: true }).click(); await page.getByText("Joe", { exact: true }).click();
} }
await page.getByPlaceholder("Ruderer auswählen").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(); await page.getByRole("link", { name: "Ausfahrt eintragen" }).click();
if (testInfo.project.name.includes("Mobile")) { if (testInfo.project.name.includes("Mobile")) {
// No left boat selector on mobile views // 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(); await page.getByRole("option", { name: "Joe" }).click();
} else { } else {
await page.getByText('2x').click(); await page.getByText('2x', { exact: true }).click();
await page.getByText("Joe", { exact: true }).click(); await page.getByText("Joe", { exact: true }).click();
} }
await page.getByPlaceholder("Ruderer auswählen").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"); await page.goto("/log/kiosk/ekrv2019/Linz");
if (testInfo.project.name.includes("Mobile")) { if (testInfo.project.name.includes("Mobile")) {
// No left boat selector on mobile views // 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(); await page.getByRole("option", { name: "Joe" }).click();
} else { } else {
await page.getByText('2x').click(); await page.getByText('2x', { exact: true }).click();
await page.getByText("Joe", { exact: true }).click(); await page.getByText("Joe", { exact: true }).click();
} }
await page.getByPlaceholder("Ruderer auswählen").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")) { if (testInfo.project.name.includes("Mobile")) {
// No left boat selector on mobile views // 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(); await page.getByRole("option", { name: "Joe" }).click();
} else { } else {
await page.getByText('2x').click(); await page.getByText('2x', { exact: true }).click();
await page.getByText("Joe", { exact: true }).click(); await page.getByText("Joe", { exact: true }).click();
} }
await page.getByPlaceholder("Ruderer auswählen").click(); await page.getByPlaceholder("Ruderer auswählen").click();

View File

@ -21,9 +21,9 @@ pub struct Boat {
pub boatbuilder: Option<String>, pub boatbuilder: Option<String>,
pub default_destination: Option<String>, pub default_destination: Option<String>,
#[serde(default = "bool::default")] #[serde(default = "bool::default")]
convert_handoperated_possible: bool, pub convert_handoperated_possible: bool,
#[serde(default = "bool::default")] #[serde(default = "bool::default")]
default_shipmaster_only_steering: bool, pub default_shipmaster_only_steering: bool,
#[serde(default = "bool::default")] #[serde(default = "bool::default")]
skull: bool, skull: bool,
#[serde(default = "bool::default")] #[serde(default = "bool::default")]
@ -46,6 +46,7 @@ pub struct BoatWithDetails {
damage: BoatDamage, damage: BoatDamage,
on_water: bool, on_water: bool,
reserved_today: bool, reserved_today: bool,
cat: String,
} }
#[derive(FromForm)] #[derive(FromForm)]
@ -179,11 +180,18 @@ AND date('now') BETWEEN start_date AND end_date;",
if boat.is_locked(db).await { if boat.is_locked(db).await {
damage = BoatDamage::Locked; 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 { res.push(BoatWithDetails {
damage, damage,
on_water: boat.on_water(db).await, on_water: boat.on_water(db).await,
reserved_today: boat.reserved_today(db).await, reserved_today: boat.reserved_today(db).await,
boat, boat,
cat,
}); });
} }
res res

View File

@ -126,6 +126,7 @@ pub enum LogbookCreateError {
NotYourEntry, NotYourEntry,
ArrivalSetButNotRemainingTwo, ArrivalSetButNotRemainingTwo,
OnlyAllowedToEndTripsEndingToday, OnlyAllowedToEndTripsEndingToday,
CantChangeHandoperatableStatusForThisBoat,
} }
impl From<LogbookUpdateError> for LogbookCreateError { impl From<LogbookUpdateError> for LogbookCreateError {
@ -302,6 +303,12 @@ ORDER BY departure DESC
return Err(LogbookCreateError::BoatNotFound); 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() { if boat.amount_seats == 1 && log.rowers.is_empty() {
log.rowers = vec![created_by_user.id]; log.rowers = vec![created_by_user.id];
} }

View File

@ -214,6 +214,7 @@ async fn create_logbook(
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 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::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."),
} }
} }

View File

@ -1,6 +1,3 @@
ALTER TABLE boat ADD COLUMN convert_handoperated_possible BOOLEAN DEFAULT false NOT NULL;
-- test user -- test user
INSERT INTO user(name) VALUES('Marie'); INSERT INTO user(name) VALUES('Marie');
INSERT INTO "user_role" (user_id, role_id) VALUES((SELECT id from user where name = 'Marie'),(SELECT id FROM role where name = 'Donau Linz')); INSERT INTO "user_role" (user_id, role_id) VALUES((SELECT id from user where name = 'Marie'),(SELECT id FROM role where name = 'Donau Linz'));

View File

@ -3,16 +3,14 @@
Inputs: boats Inputs: boats
#} #}
{% macro show_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") %}
<details> <details>
<summary class="font-bold cursor-pointer text-primary-900 dark:text-white border-t p-3 hover:bg-gray-100 dark:hover:bg-primary-950"> <summary class="font-bold cursor-pointer text-primary-900 dark:text-white border-t p-3 hover:bg-gray-100 dark:hover:bg-primary-950">
<span> <span>
{% if grouped_boats[0].external %} {% if grouped_boats[0].external %}
Vereinsfremde Boote Vereinsfremde Boote
{% elif grouped_boats[0].default_shipmaster_only_steering %}
{{ grouped_boats[0].amount_seats - 1 }}+
{% else %} {% else %}
{{ amount_seats }}x {{ grouped_boats[0].cat }}
{% endif %} {% endif %}
</span> </span>
<small class="text-gray-500 dark:text-gray-100">({{ grouped_boats | length }})</small> <small class="text-gray-500 dark:text-gray-100">({{ grouped_boats | length }})</small>
@ -78,7 +76,7 @@
</form> </form>
{% endmacro new %} {% endmacro new %}
{% macro boat_select(id="boat_id") %} {% 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 %} {% endmacro boat_select %}
{% macro rower_select(id, selected, amount_seats='', class='', init='false', cox_on_boat='', steering_person_id='') %} {% macro rower_select(id, selected, amount_seats='', class='', init='false', cox_on_boat='', steering_person_id='') %}
{#{% if not amount_seats or amount_seats > 1 %}#} {#{% if not amount_seats or amount_seats > 1 %}#}