marshmallow.fields incorrectly resolved the 'required' field. Adapted each field to ensure that missing data properly raises an error.

This commit is contained in:
Max Metz 2024-08-14 13:59:26 +02:00
parent 0e8faf499d
commit 4f3686e00f

View File

@ -119,7 +119,7 @@ class History:
return self(id, participant_id, shipcall_id, timestamp, eta, ObjectType(type), OperationType(operation))
class Error(Schema):
message = fields.String(metadata={'required':True})
message = fields.String(required=True)
class GetVerifyInlineResp(Schema):
@ -203,37 +203,37 @@ class ShipcallSchema(Schema):
super().__init__(unknown=None)
pass
id = fields.Integer(metadata={'required':True})
ship_id = fields.Integer(metadata={'required':True})
id = fields.Integer(required=True)
ship_id = fields.Integer(required=True)
type = fields.Enum(ShipcallType, default=ShipcallType.undefined)
eta = fields.DateTime(metadata={'required':False}, allow_none=True)
voyage = fields.String(allow_none=True, metadata={'Required':False}, validate=[validate.Length(max=16)]) # Solving: RemovedInMarshmallow4Warning: Passing field metadata as keyword arguments is deprecated. Use the explicit `metadata=...` argument instead. Additional metadata: {'Required': False}
etd = fields.DateTime(metadata={'required':False}, allow_none=True)
arrival_berth_id = fields.Integer(metadata={'required':False}, allow_none=True)
departure_berth_id = fields.Integer(metadata={'required':False}, allow_none=True)
tug_required = fields.Bool(metadata={'required':False}, allow_none=True)
pilot_required = fields.Bool(metadata={'required':False}, allow_none=True)
flags = fields.Integer(metadata={'required':False}, allow_none=True)
pier_side = fields.Bool(metadata={'required':False}, allow_none=True)
bunkering = fields.Bool(metadata={'required':False}, allow_none=True)
replenishing_terminal = fields.Bool(metadata={'required':False}, allow_none=True)
replenishing_lock = fields.Bool(metadata={'required':False}, allow_none=True)
draft = fields.Float(metadata={'required':False}, allow_none=True, validate=[validate.Range(min=0, max=20, min_inclusive=False, max_inclusive=True)])
tidal_window_from = fields.DateTime(metadata={'required':False}, allow_none=True)
tidal_window_to = fields.DateTime(metadata={'required':False}, allow_none=True)
rain_sensitive_cargo = fields.Bool(metadata={'required':False}, allow_none=True)
recommended_tugs = fields.Integer(metadata={'required':False}, allow_none=True, validate=[validate.Range(min=0, max=10, min_inclusive=True, max_inclusive=True)])
anchored = fields.Bool(metadata={'required':False}, allow_none=True)
moored_lock = fields.Bool(metadata={'required':False}, allow_none=True)
canceled = fields.Bool(metadata={'required':False}, allow_none=True)
evaluation = fields.Enum(EvaluationType, metadata={'required':False}, allow_none=True, default=EvaluationType.undefined)
evaluation_message = fields.Str(allow_none=True, metadata={'Required':False}) # Solving: RemovedInMarshmallow4Warning: Passing field metadata as keyword arguments is deprecated. Use the explicit `metadata=...` argument instead. Additional metadata: {'Required': False}
evaluation_time = fields.DateTime(metadata={'required':False}, allow_none=True)
evaluation_notifications_sent = fields.Bool(metadata={'required':False}, allow_none=True)
time_ref_point = fields.Integer(metadata={'required':False}, allow_none=True)
eta = fields.DateTime(required=False, allow_none=True)
voyage = fields.String(allow_none=True, required=False, validate=[validate.Length(max=16)])
etd = fields.DateTime(required=False, allow_none=True)
arrival_berth_id = fields.Integer(required=False, allow_none=True)
departure_berth_id = fields.Integer(required=False, allow_none=True)
tug_required = fields.Bool(required=False, allow_none=True)
pilot_required = fields.Bool(required=False, allow_none=True)
flags = fields.Integer(required=False, allow_none=True)
pier_side = fields.Bool(required=False, allow_none=True)
bunkering = fields.Bool(required=False, allow_none=True)
replenishing_terminal = fields.Bool(required=False, allow_none=True)
replenishing_lock = fields.Bool(required=False, allow_none=True)
draft = fields.Float(required=False, allow_none=True, validate=[validate.Range(min=0, max=20, min_inclusive=False, max_inclusive=True)])
tidal_window_from = fields.DateTime(required=False, allow_none=True)
tidal_window_to = fields.DateTime(required=False, allow_none=True)
rain_sensitive_cargo = fields.Bool(required=False, allow_none=True)
recommended_tugs = fields.Integer(required=False, allow_none=True, validate=[validate.Range(min=0, max=10, min_inclusive=True, max_inclusive=True)])
anchored = fields.Bool(required=False, allow_none=True)
moored_lock = fields.Bool(required=False, allow_none=True)
canceled = fields.Bool(required=False, allow_none=True)
evaluation = fields.Enum(EvaluationType, required=False, allow_none=True, default=EvaluationType.undefined)
evaluation_message = fields.Str(allow_none=True, required=False)
evaluation_time = fields.DateTime(required=False, allow_none=True)
evaluation_notifications_sent = fields.Bool(required=False, allow_none=True)
time_ref_point = fields.Integer(required=False, allow_none=True)
participants = fields.List(fields.Nested(ParticipantAssignmentSchema))
created = fields.DateTime(metadata={'required':False}, allow_none=True)
modified = fields.DateTime(metadata={'required':False}, allow_none=True)
created = fields.DateTime(required=False, allow_none=True)
modified = fields.DateTime(required=False, allow_none=True)
@post_load
def make_shipcall(self, data, **kwargs):
@ -357,30 +357,30 @@ class TimesSchema(Schema):
super().__init__(unknown=None)
pass
id = fields.Integer(metadata={'required':False})
eta_berth = fields.DateTime(metadata={'required':False}, allow_none=True)
eta_berth_fixed = fields.Bool(metadata={'required':False}, allow_none=True)
etd_berth = fields.DateTime(metadata={'required':False}, allow_none=True)
etd_berth_fixed = fields.Bool(metadata={'required':False}, allow_none=True)
lock_time = fields.DateTime(metadata={'required':False}, allow_none=True)
lock_time_fixed = fields.Bool(metadata={'required':False}, allow_none=True)
zone_entry = fields.DateTime(metadata={'required':False}, allow_none=True)
zone_entry_fixed = fields.Bool(metadata={'required':False}, allow_none=True)
operations_start = fields.DateTime(metadata={'required':False}, allow_none=True)
operations_end = fields.DateTime(metadata={'required':False}, allow_none=True)
remarks = fields.String(metadata={'required':False}, allow_none=True, validate=[validate.Length(max=512)])
participant_id = fields.Integer(metadata={'required':True})
berth_id = fields.Integer(metadata={'required':False}, allow_none = True)
berth_info = fields.String(metadata={'required':False}, allow_none=True, validate=[validate.Length(max=512)])
pier_side = fields.Bool(metadata={'required':False}, allow_none = True)
shipcall_id = fields.Integer(metadata={'required':True})
participant_type = fields.Integer(Required = False, allow_none=True)# TODO: could become Enum. fields.Enum(ParticipantType, metadata={'required':False}, allow_none=True, default=ParticipantType.undefined) #fields.Integer(metadata={'required':False}, allow_none=True)
ata = fields.DateTime(metadata={'required':False}, allow_none=True)
atd = fields.DateTime(metadata={'required':False}, allow_none=True)
eta_interval_end = fields.DateTime(metadata={'required':False}, allow_none=True)
etd_interval_end = fields.DateTime(metadata={'required':False}, allow_none=True)
created = fields.DateTime(metadata={'required':False}, allow_none=True)
modified = fields.DateTime(metadata={'required':False}, allow_none=True)
id = fields.Integer(required=False)
eta_berth = fields.DateTime(required=False, allow_none=True)
eta_berth_fixed = fields.Bool(required=False, allow_none=True)
etd_berth = fields.DateTime(required=False, allow_none=True)
etd_berth_fixed = fields.Bool(required=False, allow_none=True)
lock_time = fields.DateTime(required=False, allow_none=True)
lock_time_fixed = fields.Bool(required=False, allow_none=True)
zone_entry = fields.DateTime(required=False, allow_none=True)
zone_entry_fixed = fields.Bool(required=False, allow_none=True)
operations_start = fields.DateTime(required=False, allow_none=True)
operations_end = fields.DateTime(required=False, allow_none=True)
remarks = fields.String(required=False, allow_none=True, validate=[validate.Length(max=512)])
participant_id = fields.Integer(required=True)
berth_id = fields.Integer(required=False, allow_none = True)
berth_info = fields.String(required=False, allow_none=True, validate=[validate.Length(max=512)])
pier_side = fields.Bool(required=False, allow_none = True)
shipcall_id = fields.Integer(required=True)
participant_type = fields.Integer(Required = False, allow_none=True)# TODO: could become Enum. fields.Enum(ParticipantType, required=False, allow_none=True, default=ParticipantType.undefined) #fields.Integer(required=False, allow_none=True)
ata = fields.DateTime(required=False, allow_none=True)
atd = fields.DateTime(required=False, allow_none=True)
eta_interval_end = fields.DateTime(required=False, allow_none=True)
etd_interval_end = fields.DateTime(required=False, allow_none=True)
created = fields.DateTime(required=False, allow_none=True)
modified = fields.DateTime(required=False, allow_none=True)
@validates("participant_type")
def validate_participant_type(self, value):
@ -443,13 +443,13 @@ class UserSchema(Schema):
def __init__(self):
super().__init__(unknown=None)
pass
id = fields.Integer(metadata={'required':True})
first_name = fields.String(allow_none=True, metadata={'Required':False}, validate=[validate.Length(max=64)])
last_name = fields.String(allow_none=True, metadata={'Required':False}, validate=[validate.Length(max=64)])
user_phone = fields.String(allow_none=True, metadata={'Required':False})
user_email = fields.String(allow_none=True, metadata={'Required':False}, validate=[validate.Length(max=64)])
old_password = fields.String(allow_none=True, metadata={'Required':False}, validate=[validate.Length(max=128)])
new_password = fields.String(allow_none=True, metadata={'Required':False}, validate=[validate.Length(min=6, max=128)])
id = fields.Integer(required=True)
first_name = fields.String(allow_none=True, required=False, validate=[validate.Length(max=64)])
last_name = fields.String(allow_none=True, required=False, validate=[validate.Length(max=64)])
user_phone = fields.String(allow_none=True, required=False)
user_email = fields.String(allow_none=True, required=False, validate=[validate.Length(max=64)])
old_password = fields.String(allow_none=True, required=False, validate=[validate.Length(max=128)])
new_password = fields.String(allow_none=True, required=False, validate=[validate.Length(min=6, max=128)])
# #TODO: the user schema does not (yet) include the 'notify_' fields
@validates("user_phone")
@ -532,19 +532,19 @@ class ShipSchema(Schema):
super().__init__(unknown=None)
pass
id = fields.Int(metadata={'required':False})
name = fields.String(allow_none=False, metadata={'Required':True})
imo = fields.Int(allow_none=False, metadata={'Required':True})
callsign = fields.String(allow_none=True, metadata={'Required':False})
participant_id = fields.Int(allow_none=True, metadata={'Required':False})
length = fields.Float(allow_none=True, metadata={'Required':False}, validate=[validate.Range(min=0, max=1000, min_inclusive=False, max_inclusive=False)])
width = fields.Float(allow_none=True, metadata={'Required':False}, validate=[validate.Range(min=0, max=100, min_inclusive=False, max_inclusive=False)])
is_tug = fields.Bool(allow_none=True, metadata={'Required':False}, default=False)
bollard_pull = fields.Int(allow_none=True, metadata={'Required':False})
eni = fields.Int(allow_none=True, metadata={'Required':False})
created = fields.DateTime(allow_none=True, metadata={'Required':False})
modified = fields.DateTime(allow_none=True, metadata={'Required':False})
deleted = fields.Bool(allow_none=True, metadata={'Required':False}, default=False)
id = fields.Int(required=False)
name = fields.String(allow_none=False, required=True)
imo = fields.Int(allow_none=False, required=True)
callsign = fields.String(allow_none=True, required=False)
participant_id = fields.Int(allow_none=True, required=False)
length = fields.Float(allow_none=True, required=False, validate=[validate.Range(min=0, max=1000, min_inclusive=False, max_inclusive=False)])
width = fields.Float(allow_none=True, required=False, validate=[validate.Range(min=0, max=100, min_inclusive=False, max_inclusive=False)])
is_tug = fields.Bool(allow_none=True, required=False, default=False)
bollard_pull = fields.Int(allow_none=True, required=False)
eni = fields.Int(allow_none=True, required=False)
created = fields.DateTime(allow_none=True, required=False)
modified = fields.DateTime(allow_none=True, required=False)
deleted = fields.Bool(allow_none=True, required=False, default=False)
@validates("name")
def validate_name(self, value):