diff --git a/src/BreCalClient/EditTimesAgencyIncomingControl.xaml.cs b/src/BreCalClient/EditTimesAgencyIncomingControl.xaml.cs index db03b11..8d85d68 100644 --- a/src/BreCalClient/EditTimesAgencyIncomingControl.xaml.cs +++ b/src/BreCalClient/EditTimesAgencyIncomingControl.xaml.cs @@ -73,7 +73,7 @@ namespace BreCalClient { if (!CheckValues(out string message)) { - MessageBox.Show(message, "Warning", MessageBoxButton.OK, MessageBoxImage.Warning); + MessageBox.Show(message, BreCalClient.Resources.Resources.textWarning, MessageBoxButton.OK, MessageBoxImage.Warning); } else { @@ -145,6 +145,13 @@ namespace BreCalClient return false; } + if((this.datePickerETA_End.Value.HasValue && !this.datePickerETA.Value.HasValue) || + (this.datePickerTidalWindowTo.Value.HasValue && !this.datePickerTidalWindowFrom.Value.HasValue)) + { + message = BreCalClient.Resources.Resources.textStartTimeMissing; + return false; + } + return true; } diff --git a/src/BreCalClient/EditTimesAgencyOutgoingControl.xaml.cs b/src/BreCalClient/EditTimesAgencyOutgoingControl.xaml.cs index b05ec49..c850ed8 100644 --- a/src/BreCalClient/EditTimesAgencyOutgoingControl.xaml.cs +++ b/src/BreCalClient/EditTimesAgencyOutgoingControl.xaml.cs @@ -82,7 +82,7 @@ namespace BreCalClient { if (!CheckValues(out string message)) { - System.Windows.MessageBox.Show(message, "Warning", MessageBoxButton.OK, MessageBoxImage.Warning); + System.Windows.MessageBox.Show(message, BreCalClient.Resources.Resources.textWarning, MessageBoxButton.OK, MessageBoxImage.Warning); } else { @@ -155,6 +155,13 @@ namespace BreCalClient return false; } + if((this.datePickerETD_End.Value.HasValue && !this.datePickerETD.Value.HasValue) || + (this.datePickerTidalWindowTo.Value.HasValue && !this.datePickerTidalWindowFrom.Value.HasValue)) + { + message = BreCalClient.Resources.Resources.textStartTimeMissing; + return false; + } + return true; } diff --git a/src/BreCalClient/EditTimesAgencyShiftingControl.xaml.cs b/src/BreCalClient/EditTimesAgencyShiftingControl.xaml.cs index fdf8619..9307943 100644 --- a/src/BreCalClient/EditTimesAgencyShiftingControl.xaml.cs +++ b/src/BreCalClient/EditTimesAgencyShiftingControl.xaml.cs @@ -73,7 +73,7 @@ namespace BreCalClient { if (!CheckValues(out string message)) { - System.Windows.MessageBox.Show(message, "Warning", MessageBoxButton.OK, MessageBoxImage.Warning); + System.Windows.MessageBox.Show(message, BreCalClient.Resources.Resources.textWarning, MessageBoxButton.OK, MessageBoxImage.Warning); } else { @@ -164,6 +164,14 @@ namespace BreCalClient return false; } + if((this.datePickerETA_End.Value.HasValue && !this.datePickerETA.Value.HasValue) || + (this.datePickerETD_End.Value.HasValue && !this.datePickerETD.Value.HasValue) || + (this.datePickerTidalWindowTo.Value.HasValue && !this.datePickerTidalWindowFrom.Value.HasValue)) + { + message = BreCalClient.Resources.Resources.textStartTimeMissing; + return false; + } + return true; } diff --git a/src/BreCalClient/EditTimesControl.xaml.cs b/src/BreCalClient/EditTimesControl.xaml.cs index 3ce8417..079d9ab 100644 --- a/src/BreCalClient/EditTimesControl.xaml.cs +++ b/src/BreCalClient/EditTimesControl.xaml.cs @@ -49,7 +49,8 @@ namespace BreCalClient { if (!CheckValues(out string message)) { - System.Windows.MessageBox.Show(message, "Warning", MessageBoxButton.OK, MessageBoxImage.Warning); + System.Windows.MessageBox.Show(message, BreCalClient.Resources.Resources.textWarning, + MessageBoxButton.OK, MessageBoxImage.Warning); } else { @@ -116,6 +117,24 @@ namespace BreCalClient return false; } + if (this.datePickerETDBerth.Value.HasValue && (this.datePickerETDBerth.Value.Value < DateTime.Now) && (this.datePickerETABerth_End.Value == null)) + { + message = BreCalClient.Resources.Resources.textETDInThePast; + return false; + } + + if (this.datePickerETDBerth_End.Value.HasValue && this.datePickerETDBerth_End.Value < DateTime.Now) + { + message = BreCalClient.Resources.Resources.textETDInThePast; + return false; + } + + if (this.datePickerETDBerth.Value.HasValue && this.datePickerETDBerth_End.Value.HasValue && this.datePickerETDBerth.Value > this.datePickerETDBerth_End.Value) + { + message = BreCalClient.Resources.Resources.textEndValueBeforeStartValue; + return false; + } + if (this.datePickerLockTime.Value.HasValue && (this.datePickerLockTime.Value.Value < DateTime.Now)) { message = BreCalClient.Resources.Resources.textLockTimeInThePast; @@ -135,6 +154,13 @@ namespace BreCalClient return false; } + if((this.datePickerETABerth_End.Value.HasValue && !this.datePickerETABerth.Value.HasValue) || + (this.datePickerETDBerth_End.Value.HasValue && !this.datePickerETDBerth.Value.HasValue)) + { + message = BreCalClient.Resources.Resources.textStartTimeMissing; + return false; + } + return true; } diff --git a/src/BreCalClient/EditTimesTerminalControl.xaml.cs b/src/BreCalClient/EditTimesTerminalControl.xaml.cs index 1b43b18..e980c9e 100644 --- a/src/BreCalClient/EditTimesTerminalControl.xaml.cs +++ b/src/BreCalClient/EditTimesTerminalControl.xaml.cs @@ -64,7 +64,7 @@ namespace BreCalClient { if (!CheckValues(out string message)) { - System.Windows.MessageBox.Show(message, "Warning", MessageBoxButton.OK, MessageBoxImage.Warning); + System.Windows.MessageBox.Show(message, BreCalClient.Resources.Resources.textWarning, MessageBoxButton.OK, MessageBoxImage.Warning); } else { @@ -150,6 +150,13 @@ namespace BreCalClient return false; } + if((this.datePickerOperationEnd_End.Value.HasValue && !this.datePickerOperationEnd.Value.HasValue) || + (this.datePickerOperationStart_End.Value.HasValue && !this.datePickerOperationStart.Value.HasValue)) + { + message = BreCalClient.Resources.Resources.textStartTimeMissing; + return false; + } + return true; } diff --git a/src/BreCalClient/Resources/Resources.Designer.cs b/src/BreCalClient/Resources/Resources.Designer.cs index 3537740..fa754f9 100644 --- a/src/BreCalClient/Resources/Resources.Designer.cs +++ b/src/BreCalClient/Resources/Resources.Designer.cs @@ -119,6 +119,15 @@ namespace BreCalClient.Resources { } } + /// + /// Looks up a localized string similar to . + /// + public static string arrow_right_blue { + get { + return ResourceManager.GetString("arrow_right_blue", resourceCulture); + } + } + /// /// Looks up a localized resource of type System.Byte[]. /// @@ -139,6 +148,15 @@ namespace BreCalClient.Resources { } } + /// + /// Looks up a localized string similar to . + /// + public static string arrow_up_green { + get { + return ResourceManager.GetString("arrow_up_green", resourceCulture); + } + } + /// /// Looks up a localized resource of type System.Byte[]. /// @@ -1199,6 +1217,15 @@ namespace BreCalClient.Resources { } } + /// + /// Looks up a localized string similar to If an end time is set, a start time is also required. + /// + public static string textStartTimeMissing { + get { + return ResourceManager.GetString("textStartTimeMissing", resourceCulture); + } + } + /// /// Looks up a localized string similar to Terminal. /// diff --git a/src/BreCalClient/Resources/Resources.de.resx b/src/BreCalClient/Resources/Resources.de.resx index 5cf59e7..72398ef 100644 --- a/src/BreCalClient/Resources/Resources.de.resx +++ b/src/BreCalClient/Resources/Resources.de.resx @@ -117,16 +117,13 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Einkommend + arrow_down_red.png;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - arrow_right_blue.png;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - arrow_up_green.png;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - clipboard.png;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -136,15 +133,24 @@ containership.png;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Ausgehend + emergency_stop_button.png;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 logo_bremen_calling.png;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Verholung + ship2.png;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Hinzufügen + Agenturen @@ -160,9 +166,18 @@ Liegeplatz + + Liegeplatz Informationen + Liegeplätze + + Beide Tidenzeiten sollten angegeben werden (von - bis) + + + Freigabe zur Bearb. f. BSMD erteilt + Bunkeraufnahme @@ -181,59 +196,122 @@ Ändern + + Kontaktdaten bearbeiten + + + Verlauf + Passwort ändern + + Alle Eintragungen zurücksetzen? + + + Zuordnung entfernen + + + Filter löschen + + + Eingabe löschen + Schliessen + + Bestätigung + + + Löschen + + + Gelöscht + Terminal Abfahrt Tiefgang (m) + + Bearbeiten + + + Schiff bearbeiten + Schiffsanlauf bearbeiten + + Schiffe anlegen / bearbeiten + Zeiten bearbeiten - - ETA Liegeplatz + + E-Mail - - ETD Liegeplatz + + Endzeit liegt vor Startzeit Schiff / Bemerkung + + Error + + + ETA Liegeplatz + + + Zeitpunkt ETA liegt in der Vergangenheit + + + ETD Liegeplatz + + + Zeitpunkt ETD liegt in der Vergangenheit + Verlassen - - von - - - Zeitraum - - - L/B (m) - - - Anmelden - Fest + + Als feste Bestellung vermerkt + + + von + + + Einkommend + + + App Info anzeigen und Passwort ändern + + + Zeitraum + + + Länge + + + L/B (m) + Zeit Schleuse - - Operation Ende + + Schleusenzeit liegt in der Vergangenheit - - Operation Start + + Anmelden + + + nur eigene auch in Schleuse @@ -250,21 +328,45 @@ Ungedreht - - Reviereintritt - OK Altes Passwort + + Vorgang + + + Operation Endzeit liegt in der Vergangenheit + + + Operation Ende + + + Operation Start + + + Operation Startzeit liegt in der Vergangenheit + + + Ausgehend + + + Teilnehmer + Teilnehmer Passwort + + Passwort geändert. + + + Telefon + Anlegeseite @@ -274,12 +376,24 @@ Lotsorder + + Flusslotsen + + + Backbord + + + Hafenamt + Regensensitive Ladung Anzahl Schlepper + + Info + Neues Passwort wiederholen @@ -295,27 +409,75 @@ Suche + + Verholung + + + Verholung von + + + Verhol. Nr. + + + Verholung nach + Schiff Schiffslänge + + Schiffe + + + Stornierte anzeigen + + + Änderungshistorie der Anläufe anzeigen + Sortierung + + Steuerbord + Terminal + + Für das Tidenfenster müssen beide Zeiten angegeben werden + Tidenfenster + + Tidenzeit liegt in der Vergangenheit + + + Zeitpunkt + bis + + Eine Zeiteingabe ist zu weit in der Zukunft + + + Als feste Bestellung vermerken + + + Feste Bestellung zurücknehmen + + + Manuelle Aktualisierung der Anläufe auslösen + Schlepper + + Schlepper-Reederei + Schlepperorder @@ -328,9 +490,27 @@ Benutzername + + Benutzername / Passwort leer! + Reise + + Warnung + + + Breite + + + Benutzername / Passwort falsch + + + Zeit Reviereintritt liegt in der Vergangenheit + + + Reviereintritt + trafficlight_green.png;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -355,196 +535,19 @@ umbrella_open.png;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - worker2.png;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Zuordnung entfernen - - - Eingabe löschen - - - Bestätigung - - - Passwort geändert. - - - Filter löschen - - - Stornierte anzeigen - - - Liegeplatz Informationen - - - Freigabe zur Bearb. f. BSMD erteilt - - - Info - - - Einkommend - - - Ausgehend - - - Verholung - - - Länge - - - Verholung von - - - Verholung nach - - - Breite - - - Kontaktdaten bearbeiten - - - E-Mail - - - Telefon - - - Benutzername / Passwort falsch - - - Benutzername / Passwort leer! - - - Backbord - - - Steuerbord - - - Hinzufügen - - - Löschen - - - Bearbeiten - - - Schiffe anlegen / bearbeiten - - - Gelöscht - - - Schiff bearbeiten - - - Schlepper-Reederei - - - Verlauf - - - App Info anzeigen und Passwort ändern - - - Änderungshistorie der Anläufe anzeigen - - - nur eigene - - - Vorgang - - - Teilnehmer - - - Zeitpunkt - - - Als feste Bestellung vermerkt - - - Als feste Bestellung vermerken - - - Feste Bestellung zurücknehmen - - - Manuelle Aktualisierung der Anläufe auslösen - - - Einkommend - - - Ausgehend - - - Verholung - Unbekannt - - Schiffe + + worker2.png;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Flusslotsen + + arrow_right_blue.png;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Hafenamt + + arrow_up_green.png;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Verhol. Nr. - - - Alle Eintragungen zurücksetzen? - - - Beide Tidenzeiten sollten angegeben werden (von - bis) - - - Endzeit liegt vor Startzeit - - - Error - - - Zeitpunkt ETA liegt in der Vergangenheit - - - Zeitpunkt ETD liegt in der Vergangenheit - - - Schleusenzeit liegt in der Vergangenheit - - - Operation Endzeit liegt in der Vergangenheit - - - Operation Startzeit liegt in der Vergangenheit - - - Tidenzeit liegt in der Vergangenheit - - - Warnung - - - Zeit Reviereintritt liegt in der Vergangenheit - - - Für das Tidenfenster müssen beide Zeiten angegeben werden - - - Eine Zeiteingabe ist zu weit in der Zukunft + + Wenn eine Ende-Zeit angegeben wird, muss auch eine Start-Zeit angegeben werden \ No newline at end of file diff --git a/src/BreCalClient/Resources/Resources.resx b/src/BreCalClient/Resources/Resources.resx index 0b1de64..c421af5 100644 --- a/src/BreCalClient/Resources/Resources.resx +++ b/src/BreCalClient/Resources/Resources.resx @@ -589,4 +589,13 @@ lock.png;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + + + + If an end time is set, a start time is also required + \ No newline at end of file diff --git a/src/server/BreCal/validators/input_validation_ship.py b/src/server/BreCal/validators/input_validation_ship.py index ce1c5e4..af9855b 100644 --- a/src/server/BreCal/validators/input_validation_ship.py +++ b/src/server/BreCal/validators/input_validation_ship.py @@ -6,7 +6,7 @@ from marshmallow import ValidationError from string import ascii_letters, digits from BreCal.schemas.model import Ship, Shipcall, Berth, User, Participant, ShipcallType -from BreCal.database.sql_handler import execute_sql_query_standalone +from BreCal.database.sql_handler import execute_sql_query_standalone from BreCal.database.sql_queries import SQLQuery from BreCal.impl.participant import GetParticipant from BreCal.impl.ships import GetShips @@ -27,7 +27,7 @@ class InputValidationShip(): Example: InputValidationShip.evaluate(user_data, loadedModel, content) - When the data violates one of the rules, a marshmallow.ValidationError is raised, which details the issues. + When the data violates one of the rules, a marshmallow.ValidationError is raised, which details the issues. """ def __init__(self) -> None: pass @@ -37,13 +37,13 @@ class InputValidationShip(): # 1.) Only users of type BSMD are allowed to POST InputValidationShip.check_user_is_bsmd_type(user_data) - # 2.) The ship IMOs are used as matching keys. They must be unique in the database. + # 2.) The ship IMOs are used as matching keys. They must be unique in the database. InputValidationShip.check_ship_imo_already_exists(loadedModel) # 3.) Check for reasonable Values (see BreCal.schemas.model.ShipSchema) InputValidationShip.optionally_evaluate_bollard_pull_value(content) return - + @staticmethod def evaluate_put_data(user_data:dict, loadedModel:dict, content:dict): # 1.) Only users of type BSMD are allowed to PUT @@ -58,20 +58,20 @@ class InputValidationShip(): # 4.) Check for reasonable Values (see BreCal.schemas.model.ShipSchema) InputValidationShip.optionally_evaluate_bollard_pull_value(content) return - + @staticmethod def evaluate_delete_data(user_data:dict, ship_id:typing.Optional[int]): if ship_id is None: raise ValidationError({"id":f"The ship id must be provided."}) ship_id = int(ship_id) - + # 1.) Only users of type BSMD are allowed to PUT InputValidationShip.check_user_is_bsmd_type(user_data) # 2.) The dataset entry may not be deleted already InputValidationShip.check_if_entry_is_already_deleted(ship_id) return - + @staticmethod def optionally_evaluate_bollard_pull_value(content:dict): bollard_pull = content.get("bollard_pull",None) @@ -89,7 +89,7 @@ class InputValidationShip(): is_bsmd = check_if_user_is_bsmd_type(user_data) if not is_bsmd: raise ValidationError({"participant_type":f"current user does not belong to BSMD. Cannot post, put or delete ships. Found user data: {user_data}"}) - + @staticmethod def check_ship_imo_already_exists(loadedModel:dict): # get the ships, convert them to a list of JSON dictionaries @@ -97,35 +97,35 @@ class InputValidationShip(): ships = json.loads(response) # extract only the 'imo' values - ship_imos = [ship.get("imo") for ship in ships if not ship.deleted] + ship_imos = [ship.get("imo") for ship in ships if not ship.get("deleted")] # check, if the imo in the POST-request already exists in the list imo_already_exists = loadedModel.get("imo") in ship_imos if imo_already_exists: raise ValidationError({"imo":f"the provided ship IMO {loadedModel.get('imo')} already exists. A ship may only be added, if there is no other ship with the same IMO number."}) return - + @staticmethod def put_content_may_not_contain_imo_number(content:dict): # IMO is a required field, so it will never be None outside of tests. If so, there is no violation put_data_ship_imo = content.get("imo",None) if put_data_ship_imo is None: return - + # grab the ship by its ID and compare, whether the IMO is unchanged ship = execute_sql_query_standalone(SQLQuery.get_ship_by_id(), param={"id":content.get("id")}, command_type="single", model=Ship) if put_data_ship_imo != ship.imo: raise ValidationError({"imo":f"The IMO number field may not be changed since it serves the purpose of a primary (matching) key."}) return - + @staticmethod def content_contains_ship_id(content:dict): put_data_ship_id = content.get('id',None) if put_data_ship_id is None: raise ValidationError({"id":f"The id field is required."}) return - + @staticmethod def check_if_entry_is_already_deleted(ship_id:typing.Optional[int]): """ @@ -147,4 +147,4 @@ class InputValidationShip(): return - +