vessel-api-python 1.0.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- vessel_api_python/__init__.py +183 -0
- vessel_api_python/_client.py +163 -0
- vessel_api_python/_constants.py +8 -0
- vessel_api_python/_errors.py +137 -0
- vessel_api_python/_iterator.py +120 -0
- vessel_api_python/_models.py +887 -0
- vessel_api_python/_services.py +1180 -0
- vessel_api_python/_transport.py +185 -0
- vessel_api_python/py.typed +0 -0
- vessel_api_python-1.0.0.dist-info/METADATA +168 -0
- vessel_api_python-1.0.0.dist-info/RECORD +13 -0
- vessel_api_python-1.0.0.dist-info/WHEEL +4 -0
- vessel_api_python-1.0.0.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,887 @@
|
|
|
1
|
+
"""Pydantic v2 models for the Vessel Tracking API.
|
|
2
|
+
|
|
3
|
+
Models are generated from the OpenAPI spec and follow Python conventions.
|
|
4
|
+
All optional fields use ``type | None = None`` and JSON field mapping uses
|
|
5
|
+
``Field(alias="camelCase")`` where the API returns camelCase keys.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
from pydantic import BaseModel, ConfigDict, Field
|
|
11
|
+
|
|
12
|
+
# ---------------------------------------------------------------------------
|
|
13
|
+
# Base config shared by all models
|
|
14
|
+
# ---------------------------------------------------------------------------
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class _Base(BaseModel):
|
|
18
|
+
model_config = ConfigDict(populate_by_name=True)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
# ---------------------------------------------------------------------------
|
|
22
|
+
# Shared / helper sub-models
|
|
23
|
+
# ---------------------------------------------------------------------------
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class GeoJSON(_Base):
|
|
27
|
+
"""GeoJSON Point geometry for geospatial coordinates."""
|
|
28
|
+
|
|
29
|
+
coordinates: list[float] | None = None
|
|
30
|
+
type: str | None = None
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class PortCountry(_Base):
|
|
34
|
+
"""Country information for a port."""
|
|
35
|
+
|
|
36
|
+
code: str | None = None
|
|
37
|
+
name: str | None = None
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
class PortReference(_Base):
|
|
41
|
+
"""Port identification details used in port event references."""
|
|
42
|
+
|
|
43
|
+
country: str | None = None
|
|
44
|
+
name: str | None = None
|
|
45
|
+
unlo_code: str | None = None
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
class VesselReference(_Base):
|
|
49
|
+
"""Vessel identification details used in port event references."""
|
|
50
|
+
|
|
51
|
+
imo: int | None = None
|
|
52
|
+
mmsi: int | None = None
|
|
53
|
+
name: str | None = None
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
class VesselFormerName(_Base):
|
|
57
|
+
"""Historical vessel name record."""
|
|
58
|
+
|
|
59
|
+
name: str | None = None
|
|
60
|
+
year_until: str | None = None
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
class BroadcastStation(_Base):
|
|
64
|
+
"""NAVTEX radio broadcast station details."""
|
|
65
|
+
|
|
66
|
+
country: str | None = None
|
|
67
|
+
coverage: str | None = None
|
|
68
|
+
latitude: float | None = None
|
|
69
|
+
longitude: float | None = None
|
|
70
|
+
name: str | None = None
|
|
71
|
+
station_id: str | None = None
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
# ---------------------------------------------------------------------------
|
|
75
|
+
# Classification sub-models
|
|
76
|
+
# ---------------------------------------------------------------------------
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
class ClassificationPurpose(_Base):
|
|
80
|
+
"""Purpose entry within classification identification."""
|
|
81
|
+
|
|
82
|
+
description: str | None = None
|
|
83
|
+
is_main_purpose: bool | None = Field(default=None, alias="isMainPurpose")
|
|
84
|
+
purpose: str | None = None
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
class ClassificationCertificate(_Base):
|
|
88
|
+
"""Certificate entry within vessel classification."""
|
|
89
|
+
|
|
90
|
+
certificate: str | None = None
|
|
91
|
+
code: str | None = None
|
|
92
|
+
expires: str | None = None
|
|
93
|
+
ext_until: str | None = Field(default=None, alias="extUntil")
|
|
94
|
+
issued: str | None = None
|
|
95
|
+
term: str | None = None
|
|
96
|
+
type: str | None = None
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
class ClassificationCondition(_Base):
|
|
100
|
+
"""Condition entry within vessel classification."""
|
|
101
|
+
|
|
102
|
+
condition: str | None = None
|
|
103
|
+
due_date: str | None = Field(default=None, alias="dueDate")
|
|
104
|
+
imposed_date: str | None = Field(default=None, alias="imposedDate")
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
class ClassificationDimensions(_Base):
|
|
108
|
+
"""Vessel dimensions from classification data."""
|
|
109
|
+
|
|
110
|
+
bm: float | None = None
|
|
111
|
+
dm: float | None = None
|
|
112
|
+
draught: float | None = None
|
|
113
|
+
dwt: float | None = None
|
|
114
|
+
gross_ton_69: float | None = Field(default=None, alias="grossTon69")
|
|
115
|
+
lbp: float | None = None
|
|
116
|
+
length_overall: float | None = Field(default=None, alias="lengthOverall")
|
|
117
|
+
net_ton_69: float | None = Field(default=None, alias="netTon69")
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
class ClassificationHull(_Base):
|
|
121
|
+
"""Hull details from classification data."""
|
|
122
|
+
|
|
123
|
+
decks_number: str | None = Field(default=None, alias="decksNumber")
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
class ClassificationIdentification(_Base):
|
|
127
|
+
"""Identification details from classification data."""
|
|
128
|
+
|
|
129
|
+
class_status_string: str | None = Field(default=None, alias="classStatusString")
|
|
130
|
+
flag_code: str | None = Field(default=None, alias="flagCode")
|
|
131
|
+
flag_name: str | None = Field(default=None, alias="flagName")
|
|
132
|
+
home_port: str | None = Field(default=None, alias="homePort")
|
|
133
|
+
imo_number: str | None = Field(default=None, alias="imoNumber")
|
|
134
|
+
non_class_relation_string: str | None = Field(
|
|
135
|
+
default=None, alias="nonClassRelationString"
|
|
136
|
+
)
|
|
137
|
+
official_number: str | None = Field(default=None, alias="officialNumber")
|
|
138
|
+
operational_status_string: str | None = Field(
|
|
139
|
+
default=None, alias="operationalStatusString"
|
|
140
|
+
)
|
|
141
|
+
purposes: list[ClassificationPurpose] | None = None
|
|
142
|
+
register_: str | None = Field(default=None, alias="register")
|
|
143
|
+
signal_letters: str | None = Field(default=None, alias="signalLetters")
|
|
144
|
+
type_formatted: str | None = Field(default=None, alias="typeFormatted")
|
|
145
|
+
vessel_id: str | None = Field(default=None, alias="vesselId")
|
|
146
|
+
vessel_name: str | None = Field(default=None, alias="vesselName")
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
class ClassificationInfo(_Base):
|
|
150
|
+
"""Classification notation and class status details."""
|
|
151
|
+
|
|
152
|
+
class_entry_date: str | None = Field(default=None, alias="classEntryDate")
|
|
153
|
+
class_notation_string: str | None = Field(
|
|
154
|
+
default=None, alias="classNotationString"
|
|
155
|
+
)
|
|
156
|
+
class_notation_string_design: str | None = Field(
|
|
157
|
+
default=None, alias="classNotationStringDesign"
|
|
158
|
+
)
|
|
159
|
+
class_notation_string_in_operation: str | None = Field(
|
|
160
|
+
default=None, alias="classNotationStringInOperation"
|
|
161
|
+
)
|
|
162
|
+
class_notation_string_main: str | None = Field(
|
|
163
|
+
default=None, alias="classNotationStringMain"
|
|
164
|
+
)
|
|
165
|
+
construction_symbol: str | None = Field(default=None, alias="constructionSymbol")
|
|
166
|
+
dual_class: str | None = Field(default=None, alias="dualClass")
|
|
167
|
+
equipment_number: str | None = Field(default=None, alias="equipmentNumber")
|
|
168
|
+
last_classification_society: str | None = Field(
|
|
169
|
+
default=None, alias="lastClassificationSociety"
|
|
170
|
+
)
|
|
171
|
+
main_class: str | None = Field(default=None, alias="mainClass")
|
|
172
|
+
main_class_machinery: str | None = Field(
|
|
173
|
+
default=None, alias="mainClassMachinery"
|
|
174
|
+
)
|
|
175
|
+
register_notation_string: str | None = Field(
|
|
176
|
+
default=None, alias="registerNotationString"
|
|
177
|
+
)
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
class ClassificationMachinery(_Base):
|
|
181
|
+
"""Machinery details from classification data."""
|
|
182
|
+
|
|
183
|
+
main_propulsion: str | None = Field(default=None, alias="mainPropulsion")
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
class ClassificationOwner(_Base):
|
|
187
|
+
"""Owner/manager details from classification data."""
|
|
188
|
+
|
|
189
|
+
doc_holder_dnv_id: str | None = Field(default=None, alias="docHolderDnvId")
|
|
190
|
+
doc_holder_imo_number: str | None = Field(
|
|
191
|
+
default=None, alias="docHolderImoNumber"
|
|
192
|
+
)
|
|
193
|
+
doc_holder_name: str | None = Field(default=None, alias="docHolderName")
|
|
194
|
+
manager_dnv_id: str | None = Field(default=None, alias="managerDnvId")
|
|
195
|
+
manager_imo_number: str | None = Field(default=None, alias="managerImoNumber")
|
|
196
|
+
manager_name: str | None = Field(default=None, alias="managerName")
|
|
197
|
+
owner_dnv_id: str | None = Field(default=None, alias="ownerDnvId")
|
|
198
|
+
owner_imo_number: str | None = Field(default=None, alias="ownerImoNumber")
|
|
199
|
+
owner_name: str | None = Field(default=None, alias="ownerName")
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
class ClassificationSurvey(_Base):
|
|
203
|
+
"""Survey entry within vessel classification."""
|
|
204
|
+
|
|
205
|
+
category: str | None = None
|
|
206
|
+
due_from: str | None = Field(default=None, alias="dueFrom")
|
|
207
|
+
due_to: str | None = Field(default=None, alias="dueTo")
|
|
208
|
+
last_date: str | None = Field(default=None, alias="lastDate")
|
|
209
|
+
location: str | None = None
|
|
210
|
+
postponed: str | None = None
|
|
211
|
+
survey: str | None = None
|
|
212
|
+
|
|
213
|
+
|
|
214
|
+
class ClassificationYard(_Base):
|
|
215
|
+
"""Shipyard/builder details from classification data."""
|
|
216
|
+
|
|
217
|
+
contracted_builder: str | None = Field(default=None, alias="contractedBuilder")
|
|
218
|
+
contracted_builder_build_no: str | None = Field(
|
|
219
|
+
default=None, alias="contractedBuilderBuildNo"
|
|
220
|
+
)
|
|
221
|
+
date_of_build: str | None = Field(default=None, alias="dateOfBuild")
|
|
222
|
+
hull_yard_build_no: str | None = Field(default=None, alias="hullYardBuildNo")
|
|
223
|
+
hull_yard_name: str | None = Field(default=None, alias="hullYardName")
|
|
224
|
+
keel_date: str | None = Field(default=None, alias="keelDate")
|
|
225
|
+
|
|
226
|
+
|
|
227
|
+
# ---------------------------------------------------------------------------
|
|
228
|
+
# Vessel models
|
|
229
|
+
# ---------------------------------------------------------------------------
|
|
230
|
+
|
|
231
|
+
|
|
232
|
+
class Vessel(_Base):
|
|
233
|
+
"""A vessel record with complete static data."""
|
|
234
|
+
|
|
235
|
+
breadth: int | None = None
|
|
236
|
+
breadth_unit: str | None = None
|
|
237
|
+
builder: str | None = None
|
|
238
|
+
call_sign: str | None = None
|
|
239
|
+
class_society: str | None = None
|
|
240
|
+
country: str | None = None
|
|
241
|
+
country_code: str | None = None
|
|
242
|
+
deadweight_tonnage: int | None = None
|
|
243
|
+
draft: int | None = None
|
|
244
|
+
draft_unit: str | None = None
|
|
245
|
+
engine_model_name: str | None = None
|
|
246
|
+
engine_type: int | None = None
|
|
247
|
+
former_names: list[VesselFormerName] | None = None
|
|
248
|
+
gross_tonnage: int | None = None
|
|
249
|
+
home_port: str | None = None
|
|
250
|
+
imo: int | None = None
|
|
251
|
+
kilowatt_power: int | None = None
|
|
252
|
+
length: int | None = None
|
|
253
|
+
length_unit: str | None = None
|
|
254
|
+
manager_name: str | None = None
|
|
255
|
+
mmsi: int | None = None
|
|
256
|
+
name: str | None = None
|
|
257
|
+
operating_status: str | None = None
|
|
258
|
+
owner_name: str | None = None
|
|
259
|
+
vessel_type: str | None = None
|
|
260
|
+
year_built: int | None = None
|
|
261
|
+
|
|
262
|
+
|
|
263
|
+
class VesselResponse(_Base):
|
|
264
|
+
"""Response for a single vessel lookup."""
|
|
265
|
+
|
|
266
|
+
vessel: Vessel | None = None
|
|
267
|
+
|
|
268
|
+
|
|
269
|
+
class VesselPosition(_Base):
|
|
270
|
+
"""A real-time vessel position record from AIS data."""
|
|
271
|
+
|
|
272
|
+
cog: float | None = None
|
|
273
|
+
heading: int | None = None
|
|
274
|
+
imo: int | None = None
|
|
275
|
+
latitude: float | None = None
|
|
276
|
+
location: GeoJSON | None = None
|
|
277
|
+
longitude: float | None = None
|
|
278
|
+
mmsi: int | None = None
|
|
279
|
+
nav_status: int | None = None
|
|
280
|
+
processed_timestamp: str | None = None
|
|
281
|
+
sog: float | None = None
|
|
282
|
+
suspected_glitch: bool | None = None
|
|
283
|
+
timestamp: str | None = None
|
|
284
|
+
vessel_name: str | None = None
|
|
285
|
+
|
|
286
|
+
|
|
287
|
+
class VesselPositionResponse(_Base):
|
|
288
|
+
"""Response for a single vessel position lookup."""
|
|
289
|
+
|
|
290
|
+
vessel_position: VesselPosition | None = Field(
|
|
291
|
+
default=None, alias="vesselPosition"
|
|
292
|
+
)
|
|
293
|
+
|
|
294
|
+
|
|
295
|
+
class VesselPositionsResponse(_Base):
|
|
296
|
+
"""Response for multiple vessel positions."""
|
|
297
|
+
|
|
298
|
+
vessel_positions: list[VesselPosition] | None = Field(
|
|
299
|
+
default=None, alias="vesselPositions"
|
|
300
|
+
)
|
|
301
|
+
next_token: str | None = Field(default=None, alias="nextToken")
|
|
302
|
+
|
|
303
|
+
|
|
304
|
+
# ---------------------------------------------------------------------------
|
|
305
|
+
# Vessel sub-resource models
|
|
306
|
+
# ---------------------------------------------------------------------------
|
|
307
|
+
|
|
308
|
+
|
|
309
|
+
class MarineCasualty(_Base):
|
|
310
|
+
"""A marine casualty record."""
|
|
311
|
+
|
|
312
|
+
at_coding: list[str] | None = Field(default=None, alias="atCoding")
|
|
313
|
+
casualty_report_nr: str | None = Field(default=None, alias="casualtyReportNr")
|
|
314
|
+
cf_coding: list[str] | None = Field(default=None, alias="cfCoding")
|
|
315
|
+
collected_at: str | None = Field(default=None, alias="collectedAt")
|
|
316
|
+
competent_authority: list[str] | None = Field(
|
|
317
|
+
default=None, alias="competentAuthority"
|
|
318
|
+
)
|
|
319
|
+
date_of_occurrence: str | None = Field(default=None, alias="dateOfOccurrence")
|
|
320
|
+
deviation: list[str] | None = None
|
|
321
|
+
event_type: list[str] | None = Field(default=None, alias="eventType")
|
|
322
|
+
finished_investigation: bool | None = Field(
|
|
323
|
+
default=None, alias="finishedInvestigation"
|
|
324
|
+
)
|
|
325
|
+
imo_nr: list[str] | None = Field(default=None, alias="imoNr")
|
|
326
|
+
interim_report: bool | None = Field(default=None, alias="interimReport")
|
|
327
|
+
investigating_state: str | None = Field(
|
|
328
|
+
default=None, alias="investigatingState"
|
|
329
|
+
)
|
|
330
|
+
lives_lost_total: str | None = Field(default=None, alias="livesLostTotal")
|
|
331
|
+
name_of_ship: list[str] | None = Field(default=None, alias="nameOfShip")
|
|
332
|
+
occurrence_severity: str | None = Field(
|
|
333
|
+
default=None, alias="occurrenceSeverity"
|
|
334
|
+
)
|
|
335
|
+
occurrence_uuid: str | None = Field(default=None, alias="occurrenceUuid")
|
|
336
|
+
occurrence_with_persons: list[str] | None = Field(
|
|
337
|
+
default=None, alias="occurrenceWithPersons"
|
|
338
|
+
)
|
|
339
|
+
occurrence_with_ships: list[str] | None = Field(
|
|
340
|
+
default=None, alias="occurrenceWithShips"
|
|
341
|
+
)
|
|
342
|
+
people_injured_total: str | None = Field(
|
|
343
|
+
default=None, alias="peopleInjuredTotal"
|
|
344
|
+
)
|
|
345
|
+
pollution: bool | None = None
|
|
346
|
+
ship_craft_type: list[str] | None = Field(default=None, alias="shipCraftType")
|
|
347
|
+
sr_coding: list[str] | None = Field(default=None, alias="srCoding")
|
|
348
|
+
|
|
349
|
+
|
|
350
|
+
class MarineCasualtiesResponse(_Base):
|
|
351
|
+
"""Response for vessel casualties."""
|
|
352
|
+
|
|
353
|
+
casualties: list[MarineCasualty] | None = None
|
|
354
|
+
next_token: str | None = Field(default=None, alias="nextToken")
|
|
355
|
+
|
|
356
|
+
|
|
357
|
+
class ClassificationVessel(_Base):
|
|
358
|
+
"""Full vessel classification data with nested sub-objects."""
|
|
359
|
+
|
|
360
|
+
certificates: list[ClassificationCertificate] | None = None
|
|
361
|
+
classification: ClassificationInfo | None = None
|
|
362
|
+
collected_at: str | None = Field(default=None, alias="collectedAt")
|
|
363
|
+
conditions: list[ClassificationCondition] | None = None
|
|
364
|
+
dimensions: ClassificationDimensions | None = None
|
|
365
|
+
hull: ClassificationHull | None = None
|
|
366
|
+
identification: ClassificationIdentification | None = None
|
|
367
|
+
imo: int | None = None
|
|
368
|
+
machinery: ClassificationMachinery | None = None
|
|
369
|
+
owner: ClassificationOwner | None = None
|
|
370
|
+
surveys: list[ClassificationSurvey] | None = None
|
|
371
|
+
yard: ClassificationYard | None = None
|
|
372
|
+
|
|
373
|
+
|
|
374
|
+
# Keep the ``Classification`` alias so existing code continues to work.
|
|
375
|
+
Classification = ClassificationVessel
|
|
376
|
+
|
|
377
|
+
|
|
378
|
+
class ClassificationResponse(_Base):
|
|
379
|
+
"""Response for vessel classification."""
|
|
380
|
+
|
|
381
|
+
classification: ClassificationVessel | None = None
|
|
382
|
+
|
|
383
|
+
|
|
384
|
+
class VesselEmission(_Base):
|
|
385
|
+
"""A vessel emission record (EU MRV data)."""
|
|
386
|
+
|
|
387
|
+
co2_emissions_at_berth: float | None = None
|
|
388
|
+
co2_emissions_on_laden_voyages: float | None = None
|
|
389
|
+
co2_emissions_total: float | None = None
|
|
390
|
+
co2_per_distance: float | None = None
|
|
391
|
+
co2_per_transport_work: float | None = None
|
|
392
|
+
collected_at: str | None = None
|
|
393
|
+
distance_through_ice: float | None = None
|
|
394
|
+
doc_expiry_date: str | None = None
|
|
395
|
+
doc_issue_date: str | None = None
|
|
396
|
+
flag_code: str | None = None
|
|
397
|
+
flag_name: str | None = None
|
|
398
|
+
fuel_consumption_hfo: float | None = None
|
|
399
|
+
fuel_consumption_lfo: float | None = None
|
|
400
|
+
fuel_consumption_lng: float | None = None
|
|
401
|
+
fuel_consumption_mdo: float | None = None
|
|
402
|
+
fuel_consumption_mgo: float | None = None
|
|
403
|
+
fuel_consumption_other: float | None = None
|
|
404
|
+
fuel_consumption_total: float | None = None
|
|
405
|
+
fuel_per_distance: float | None = None
|
|
406
|
+
fuel_per_transport_work: float | None = None
|
|
407
|
+
home_port: str | None = None
|
|
408
|
+
ice_class: str | None = None
|
|
409
|
+
imo: int | None = None
|
|
410
|
+
monitoring_method_a: str | None = None
|
|
411
|
+
monitoring_method_b: str | None = None
|
|
412
|
+
monitoring_method_c: str | None = None
|
|
413
|
+
monitoring_method_d: str | None = None
|
|
414
|
+
name: str | None = None
|
|
415
|
+
port_calls_outside_eu: int | None = None
|
|
416
|
+
port_calls_within_eu: int | None = None
|
|
417
|
+
reporting_period: str | None = None
|
|
418
|
+
source_url: str | None = None
|
|
419
|
+
technical_efficiency: str | None = None
|
|
420
|
+
technical_efficiency_value: float | None = None
|
|
421
|
+
time_at_sea_through_ice: float | None = None
|
|
422
|
+
total_time_at_sea: float | None = None
|
|
423
|
+
unique_key: str | None = None
|
|
424
|
+
verifier_accreditation: str | None = None
|
|
425
|
+
verifier_address: str | None = None
|
|
426
|
+
verifier_name: str | None = None
|
|
427
|
+
vessel_type: str | None = None
|
|
428
|
+
|
|
429
|
+
|
|
430
|
+
class VesselEmissionsResponse(_Base):
|
|
431
|
+
"""Response for vessel emissions."""
|
|
432
|
+
|
|
433
|
+
emissions: list[VesselEmission] | None = None
|
|
434
|
+
next_token: str | None = Field(default=None, alias="nextToken")
|
|
435
|
+
|
|
436
|
+
|
|
437
|
+
class VesselETA(_Base):
|
|
438
|
+
"""Vessel Estimated Time of Arrival information."""
|
|
439
|
+
|
|
440
|
+
destination: str | None = None
|
|
441
|
+
draught: float | None = None
|
|
442
|
+
eta: str | None = None
|
|
443
|
+
imo: int | None = None
|
|
444
|
+
mmsi: int | None = None
|
|
445
|
+
timestamp: str | None = None
|
|
446
|
+
vessel_name: str | None = None
|
|
447
|
+
|
|
448
|
+
|
|
449
|
+
class VesselETAResponse(_Base):
|
|
450
|
+
"""Response for vessel ETA."""
|
|
451
|
+
|
|
452
|
+
vessel_eta: VesselETA | None = Field(default=None, alias="vesselEta")
|
|
453
|
+
|
|
454
|
+
|
|
455
|
+
# ---------------------------------------------------------------------------
|
|
456
|
+
# Inspection models
|
|
457
|
+
# ---------------------------------------------------------------------------
|
|
458
|
+
|
|
459
|
+
|
|
460
|
+
class InspectionRecord(_Base):
|
|
461
|
+
"""A port-state control inspection record (from types.Inspection)."""
|
|
462
|
+
|
|
463
|
+
authority: str | None = None
|
|
464
|
+
deficiencies: int | None = None
|
|
465
|
+
detail_id: str | None = None
|
|
466
|
+
detained: bool | None = None
|
|
467
|
+
imo: int | None = None
|
|
468
|
+
inspection_date: str | None = None
|
|
469
|
+
inspection_type: str | None = None
|
|
470
|
+
mou_region: str | None = None
|
|
471
|
+
port: str | None = None
|
|
472
|
+
|
|
473
|
+
|
|
474
|
+
# Keep ``Inspection`` as an alias so existing imports keep working.
|
|
475
|
+
Inspection = InspectionRecord
|
|
476
|
+
|
|
477
|
+
|
|
478
|
+
class InspectionDeficiency(_Base):
|
|
479
|
+
"""A deficiency entry from an inspection detail."""
|
|
480
|
+
|
|
481
|
+
category: str | None = None
|
|
482
|
+
count: int | None = None
|
|
483
|
+
deficiency: str | None = None
|
|
484
|
+
|
|
485
|
+
|
|
486
|
+
class InspectionDetailRecord(_Base):
|
|
487
|
+
"""Detailed inspection record with deficiency breakdown."""
|
|
488
|
+
|
|
489
|
+
authority: str | None = None
|
|
490
|
+
deficiencies: list[InspectionDeficiency] | None = None
|
|
491
|
+
deficiency_count: int | None = None
|
|
492
|
+
detail_id: str | None = None
|
|
493
|
+
detained: bool | None = None
|
|
494
|
+
detention_grounds: list[InspectionDeficiency] | None = None
|
|
495
|
+
imo: int | None = None
|
|
496
|
+
inspection_date: str | None = None
|
|
497
|
+
inspection_type: str | None = None
|
|
498
|
+
mou_region: str | None = None
|
|
499
|
+
port: str | None = None
|
|
500
|
+
|
|
501
|
+
|
|
502
|
+
# Keep ``InspectionDetail`` as an alias so existing imports keep working.
|
|
503
|
+
InspectionDetail = InspectionDetailRecord
|
|
504
|
+
|
|
505
|
+
|
|
506
|
+
class InspectionsResponseData(_Base):
|
|
507
|
+
"""Inner data of the inspections response (types.InspectionsResponse)."""
|
|
508
|
+
|
|
509
|
+
cached_at: str | None = None
|
|
510
|
+
imo: int | None = None
|
|
511
|
+
inspection_count: int | None = None
|
|
512
|
+
inspections: list[InspectionRecord] | None = None
|
|
513
|
+
|
|
514
|
+
|
|
515
|
+
class TypesInspectionsResponse(_Base):
|
|
516
|
+
"""Response for vessel inspections (wraps InspectionsResponseData)."""
|
|
517
|
+
|
|
518
|
+
cached_at: str | None = None
|
|
519
|
+
imo: int | None = None
|
|
520
|
+
inspection_count: int | None = None
|
|
521
|
+
inspections: list[InspectionRecord] | None = None
|
|
522
|
+
|
|
523
|
+
|
|
524
|
+
class InspectionDetailResponseData(_Base):
|
|
525
|
+
"""Inner data of the inspection detail response."""
|
|
526
|
+
|
|
527
|
+
cached_at: str | None = None
|
|
528
|
+
detail_id: str | None = None
|
|
529
|
+
imo: int | None = None
|
|
530
|
+
inspection_detail: InspectionDetailRecord | None = None
|
|
531
|
+
|
|
532
|
+
|
|
533
|
+
class TypesInspectionDetailResponse(_Base):
|
|
534
|
+
"""Response for a detailed inspection."""
|
|
535
|
+
|
|
536
|
+
cached_at: str | None = None
|
|
537
|
+
detail_id: str | None = None
|
|
538
|
+
imo: int | None = None
|
|
539
|
+
inspection_detail: InspectionDetailRecord | None = None
|
|
540
|
+
|
|
541
|
+
|
|
542
|
+
# ---------------------------------------------------------------------------
|
|
543
|
+
# Ownership models
|
|
544
|
+
# ---------------------------------------------------------------------------
|
|
545
|
+
|
|
546
|
+
|
|
547
|
+
class VesselOwnership(_Base):
|
|
548
|
+
"""Vessel ownership and management details."""
|
|
549
|
+
|
|
550
|
+
doc_company: str | None = None
|
|
551
|
+
doc_company_address: str | None = None
|
|
552
|
+
imo: int | None = None
|
|
553
|
+
registered_owner: str | None = None
|
|
554
|
+
registered_owner_address: str | None = None
|
|
555
|
+
ship_manager: str | None = None
|
|
556
|
+
ship_manager_address: str | None = None
|
|
557
|
+
|
|
558
|
+
|
|
559
|
+
# Keep ``Ownership`` as an alias so existing imports keep working.
|
|
560
|
+
Ownership = VesselOwnership
|
|
561
|
+
|
|
562
|
+
|
|
563
|
+
class OwnershipResponseData(_Base):
|
|
564
|
+
"""Inner data of the ownership response (types.OwnershipResponse)."""
|
|
565
|
+
|
|
566
|
+
cached_at: str | None = None
|
|
567
|
+
imo: int | None = None
|
|
568
|
+
ownership: VesselOwnership | None = None
|
|
569
|
+
|
|
570
|
+
|
|
571
|
+
class TypesOwnershipResponse(_Base):
|
|
572
|
+
"""Response for vessel ownership."""
|
|
573
|
+
|
|
574
|
+
cached_at: str | None = None
|
|
575
|
+
imo: int | None = None
|
|
576
|
+
ownership: VesselOwnership | None = None
|
|
577
|
+
|
|
578
|
+
|
|
579
|
+
# ---------------------------------------------------------------------------
|
|
580
|
+
# Port models
|
|
581
|
+
# ---------------------------------------------------------------------------
|
|
582
|
+
|
|
583
|
+
|
|
584
|
+
class Port(_Base):
|
|
585
|
+
"""A port record with complete harbor details and facilities."""
|
|
586
|
+
|
|
587
|
+
anchorage_depth: float | None = None
|
|
588
|
+
anchorage_depth_unit: str | None = None
|
|
589
|
+
cargo_handling_depth: float | None = None
|
|
590
|
+
cargo_handling_depth_unit: str | None = None
|
|
591
|
+
channel_depth: float | None = None
|
|
592
|
+
channel_depth_unit: str | None = None
|
|
593
|
+
country: PortCountry | None = None
|
|
594
|
+
garbage_disposal: bool | None = None
|
|
595
|
+
harbor_size: str | None = None
|
|
596
|
+
harbor_type: str | None = None
|
|
597
|
+
harbor_use: str | None = None
|
|
598
|
+
has_drydock: bool | None = None
|
|
599
|
+
latitude: float | None = None
|
|
600
|
+
location: GeoJSON | None = None
|
|
601
|
+
longitude: float | None = None
|
|
602
|
+
max_vessel_beam: float | None = None
|
|
603
|
+
max_vessel_beam_unit: str | None = None
|
|
604
|
+
max_vessel_draft: float | None = None
|
|
605
|
+
max_vessel_draft_unit: str | None = None
|
|
606
|
+
max_vessel_length: float | None = None
|
|
607
|
+
max_vessel_length_unit: str | None = None
|
|
608
|
+
medical_facilities: bool | None = None
|
|
609
|
+
name: str | None = None
|
|
610
|
+
navigation_area: str | None = None
|
|
611
|
+
pilotage_available: bool | None = None
|
|
612
|
+
pilotage_compulsory: bool | None = None
|
|
613
|
+
port_security: bool | None = None
|
|
614
|
+
region_name: str | None = None
|
|
615
|
+
repair_capability: str | None = None
|
|
616
|
+
shelter: str | None = None
|
|
617
|
+
size: str | None = None
|
|
618
|
+
supply_diesel: bool | None = None
|
|
619
|
+
supply_fuel: bool | None = None
|
|
620
|
+
supply_water: bool | None = None
|
|
621
|
+
traffic_separation_scheme: bool | None = None
|
|
622
|
+
tugs_available: bool | None = None
|
|
623
|
+
type: str | None = None
|
|
624
|
+
unlo_code: str | None = None
|
|
625
|
+
vessel_traffic_service: bool | None = None
|
|
626
|
+
|
|
627
|
+
|
|
628
|
+
class PortResponse(_Base):
|
|
629
|
+
"""Response for a single port lookup."""
|
|
630
|
+
|
|
631
|
+
port: Port | None = None
|
|
632
|
+
|
|
633
|
+
|
|
634
|
+
# ---------------------------------------------------------------------------
|
|
635
|
+
# Port event models
|
|
636
|
+
# ---------------------------------------------------------------------------
|
|
637
|
+
|
|
638
|
+
|
|
639
|
+
class PortEvent(_Base):
|
|
640
|
+
"""A port event (arrival/departure) record."""
|
|
641
|
+
|
|
642
|
+
event: str | None = None
|
|
643
|
+
port: PortReference | None = None
|
|
644
|
+
timestamp: str | None = None
|
|
645
|
+
vessel: VesselReference | None = None
|
|
646
|
+
|
|
647
|
+
|
|
648
|
+
class PortEventsResponse(_Base):
|
|
649
|
+
"""Response for port events list."""
|
|
650
|
+
|
|
651
|
+
port_events: list[PortEvent] | None = Field(
|
|
652
|
+
default=None, alias="portEvents"
|
|
653
|
+
)
|
|
654
|
+
next_token: str | None = Field(default=None, alias="nextToken")
|
|
655
|
+
|
|
656
|
+
|
|
657
|
+
class PortEventResponse(_Base):
|
|
658
|
+
"""Response for a single port event (e.g. last by vessel)."""
|
|
659
|
+
|
|
660
|
+
port_event: PortEvent | None = Field(default=None, alias="portEvent")
|
|
661
|
+
|
|
662
|
+
|
|
663
|
+
# ---------------------------------------------------------------------------
|
|
664
|
+
# Search models
|
|
665
|
+
# ---------------------------------------------------------------------------
|
|
666
|
+
|
|
667
|
+
|
|
668
|
+
class FindVesselsResponse(_Base):
|
|
669
|
+
"""Response for vessel search."""
|
|
670
|
+
|
|
671
|
+
vessels: list[Vessel] | None = None
|
|
672
|
+
next_token: str | None = Field(default=None, alias="nextToken")
|
|
673
|
+
|
|
674
|
+
|
|
675
|
+
class FindPortsResponse(_Base):
|
|
676
|
+
"""Response for port search."""
|
|
677
|
+
|
|
678
|
+
ports: list[Port] | None = None
|
|
679
|
+
next_token: str | None = Field(default=None, alias="nextToken")
|
|
680
|
+
|
|
681
|
+
|
|
682
|
+
class DGPSStation(_Base):
|
|
683
|
+
"""A DGPS station record."""
|
|
684
|
+
|
|
685
|
+
aid_type: str | None = None
|
|
686
|
+
delete_flag: str | None = None
|
|
687
|
+
feature_number: float | None = None
|
|
688
|
+
frequency: float | None = None
|
|
689
|
+
geopolitical_heading: str | None = None
|
|
690
|
+
location: GeoJSON | None = None
|
|
691
|
+
name: str | None = None
|
|
692
|
+
notice_number: int | None = None
|
|
693
|
+
notice_week: str | None = None
|
|
694
|
+
notice_year: str | None = None
|
|
695
|
+
position: str | None = None
|
|
696
|
+
post_note: str | None = None
|
|
697
|
+
preceding_note: str | None = None
|
|
698
|
+
range: int | None = None
|
|
699
|
+
region_heading: str | None = None
|
|
700
|
+
remarks: str | None = None
|
|
701
|
+
remove_from_list: str | None = None
|
|
702
|
+
station_id: str | None = None
|
|
703
|
+
transfer_rate: int | None = None
|
|
704
|
+
volume_number: str | None = None
|
|
705
|
+
|
|
706
|
+
|
|
707
|
+
class FindDGPSStationsResponse(_Base):
|
|
708
|
+
"""Response for DGPS station search."""
|
|
709
|
+
|
|
710
|
+
dgps_stations: list[DGPSStation] | None = Field(
|
|
711
|
+
default=None, alias="dgpsStations"
|
|
712
|
+
)
|
|
713
|
+
next_token: str | None = Field(default=None, alias="nextToken")
|
|
714
|
+
|
|
715
|
+
|
|
716
|
+
class LightAid(_Base):
|
|
717
|
+
"""A light aid to navigation record."""
|
|
718
|
+
|
|
719
|
+
aid_type: str | None = None
|
|
720
|
+
characteristic: str | None = None
|
|
721
|
+
characteristic_number: int | None = None
|
|
722
|
+
delete_flag: str | None = None
|
|
723
|
+
feature_number: str | None = None
|
|
724
|
+
geopolitical_heading: str | None = None
|
|
725
|
+
height_feet_meters: str | None = None
|
|
726
|
+
local_heading: str | None = None
|
|
727
|
+
location: GeoJSON | None = None
|
|
728
|
+
name: str | None = None
|
|
729
|
+
notice_number: int | None = None
|
|
730
|
+
notice_week: str | None = None
|
|
731
|
+
notice_year: str | None = None
|
|
732
|
+
position: str | None = None
|
|
733
|
+
post_note: str | None = None
|
|
734
|
+
preceding_note: str | None = None
|
|
735
|
+
range: str | None = None
|
|
736
|
+
region_heading: str | None = None
|
|
737
|
+
remarks: str | None = None
|
|
738
|
+
remove_from_list: str | None = None
|
|
739
|
+
structure: str | None = None
|
|
740
|
+
subregion_heading: str | None = None
|
|
741
|
+
volume_number: str | None = None
|
|
742
|
+
|
|
743
|
+
|
|
744
|
+
class FindLightAidsResponse(_Base):
|
|
745
|
+
"""Response for light aids search."""
|
|
746
|
+
|
|
747
|
+
light_aids: list[LightAid] | None = Field(default=None, alias="lightAids")
|
|
748
|
+
next_token: str | None = Field(default=None, alias="nextToken")
|
|
749
|
+
|
|
750
|
+
|
|
751
|
+
class MODU(_Base):
|
|
752
|
+
"""A Mobile Offshore Drilling Unit record."""
|
|
753
|
+
|
|
754
|
+
date: str | None = None
|
|
755
|
+
distance: float | None = None
|
|
756
|
+
latitude: float | None = None
|
|
757
|
+
location: GeoJSON | None = None
|
|
758
|
+
longitude: float | None = None
|
|
759
|
+
name: str | None = None
|
|
760
|
+
navigation_area: str | None = None
|
|
761
|
+
position: str | None = None
|
|
762
|
+
region: int | None = None
|
|
763
|
+
rig_status: str | None = None
|
|
764
|
+
special_status: str | None = None
|
|
765
|
+
sub_region: int | None = None
|
|
766
|
+
|
|
767
|
+
|
|
768
|
+
class FindMODUsResponse(_Base):
|
|
769
|
+
"""Response for MODU search."""
|
|
770
|
+
|
|
771
|
+
modus: list[MODU] | None = None
|
|
772
|
+
next_token: str | None = Field(default=None, alias="nextToken")
|
|
773
|
+
|
|
774
|
+
|
|
775
|
+
class RadioBeacon(_Base):
|
|
776
|
+
"""A radio beacon record."""
|
|
777
|
+
|
|
778
|
+
aid_type: str | None = None
|
|
779
|
+
characteristic: str | None = None
|
|
780
|
+
delete_flag: str | None = None
|
|
781
|
+
feature_number: float | None = None
|
|
782
|
+
frequency: str | None = None
|
|
783
|
+
geopolitical_heading: str | None = None
|
|
784
|
+
location: GeoJSON | None = None
|
|
785
|
+
name: str | None = None
|
|
786
|
+
notice_number: int | None = None
|
|
787
|
+
notice_week: str | None = None
|
|
788
|
+
notice_year: str | None = None
|
|
789
|
+
position: str | None = None
|
|
790
|
+
post_note: str | None = None
|
|
791
|
+
preceding_note: str | None = None
|
|
792
|
+
range: str | None = None
|
|
793
|
+
region_heading: str | None = None
|
|
794
|
+
remove_from_list: str | None = None
|
|
795
|
+
sequence_text: str | None = None
|
|
796
|
+
station_remark: str | None = None
|
|
797
|
+
volume_number: str | None = None
|
|
798
|
+
|
|
799
|
+
|
|
800
|
+
class FindRadioBeaconsResponse(_Base):
|
|
801
|
+
"""Response for radio beacon search."""
|
|
802
|
+
|
|
803
|
+
radio_beacons: list[RadioBeacon] | None = Field(
|
|
804
|
+
default=None, alias="radioBeacons"
|
|
805
|
+
)
|
|
806
|
+
next_token: str | None = Field(default=None, alias="nextToken")
|
|
807
|
+
|
|
808
|
+
|
|
809
|
+
# ---------------------------------------------------------------------------
|
|
810
|
+
# Location query response models
|
|
811
|
+
# ---------------------------------------------------------------------------
|
|
812
|
+
|
|
813
|
+
|
|
814
|
+
class VesselsWithinLocationResponse(_Base):
|
|
815
|
+
"""Response for vessel location queries (bounding box or radius)."""
|
|
816
|
+
|
|
817
|
+
vessels: list[VesselPosition] | None = None
|
|
818
|
+
next_token: str | None = Field(default=None, alias="nextToken")
|
|
819
|
+
|
|
820
|
+
|
|
821
|
+
class PortsWithinLocationResponse(_Base):
|
|
822
|
+
"""Response for port location queries."""
|
|
823
|
+
|
|
824
|
+
ports: list[Port] | None = None
|
|
825
|
+
next_token: str | None = Field(default=None, alias="nextToken")
|
|
826
|
+
|
|
827
|
+
|
|
828
|
+
class DGPSStationsWithinLocationResponse(_Base):
|
|
829
|
+
"""Response for DGPS station location queries."""
|
|
830
|
+
|
|
831
|
+
dgps_stations: list[DGPSStation] | None = Field(
|
|
832
|
+
default=None, alias="dgpsStations"
|
|
833
|
+
)
|
|
834
|
+
next_token: str | None = Field(default=None, alias="nextToken")
|
|
835
|
+
|
|
836
|
+
|
|
837
|
+
class LightAidsWithinLocationResponse(_Base):
|
|
838
|
+
"""Response for light aids location queries."""
|
|
839
|
+
|
|
840
|
+
light_aids: list[LightAid] | None = Field(default=None, alias="lightAids")
|
|
841
|
+
next_token: str | None = Field(default=None, alias="nextToken")
|
|
842
|
+
|
|
843
|
+
|
|
844
|
+
class MODUsWithinLocationResponse(_Base):
|
|
845
|
+
"""Response for MODU location queries."""
|
|
846
|
+
|
|
847
|
+
modus: list[MODU] | None = None
|
|
848
|
+
next_token: str | None = Field(default=None, alias="nextToken")
|
|
849
|
+
|
|
850
|
+
|
|
851
|
+
class RadioBeaconsWithinLocationResponse(_Base):
|
|
852
|
+
"""Response for radio beacon location queries."""
|
|
853
|
+
|
|
854
|
+
radio_beacons: list[RadioBeacon] | None = Field(
|
|
855
|
+
default=None, alias="radioBeacons"
|
|
856
|
+
)
|
|
857
|
+
next_token: str | None = Field(default=None, alias="nextToken")
|
|
858
|
+
|
|
859
|
+
|
|
860
|
+
# ---------------------------------------------------------------------------
|
|
861
|
+
# Navtex models
|
|
862
|
+
# ---------------------------------------------------------------------------
|
|
863
|
+
|
|
864
|
+
|
|
865
|
+
class Navtex(_Base):
|
|
866
|
+
"""A NAVTEX maritime safety message."""
|
|
867
|
+
|
|
868
|
+
issuing_office: str | None = None
|
|
869
|
+
label: str | None = None
|
|
870
|
+
lines: list[str] | None = None
|
|
871
|
+
metarea_coordinator: str | None = None
|
|
872
|
+
metarea_id: str | None = None
|
|
873
|
+
metarea_name: str | None = None
|
|
874
|
+
metarea_region: str | None = None
|
|
875
|
+
metarea_stations: list[BroadcastStation] | None = None
|
|
876
|
+
raw_content: str | None = None
|
|
877
|
+
timestamp: str | None = None
|
|
878
|
+
wmo_header: str | None = None
|
|
879
|
+
|
|
880
|
+
|
|
881
|
+
class NavtexMessagesResponse(_Base):
|
|
882
|
+
"""Response for NAVTEX messages list."""
|
|
883
|
+
|
|
884
|
+
navtex_messages: list[Navtex] | None = Field(
|
|
885
|
+
default=None, alias="navtexMessages"
|
|
886
|
+
)
|
|
887
|
+
next_token: str | None = Field(default=None, alias="nextToken")
|