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
-
+