11from contextlib import AbstractContextManager
2- from typing import Any , Generator , Union
2+ from typing import Any , Generator , Union , Optional
3+ from datetime import datetime
34
45from bloom .domain .vessel import Vessel
56from bloom .domain .metrics import VesselTimeInZone
67from bloom .infra .database import sql_model
78from dependency_injector .providers import Callable
8- from sqlalchemy import func , select , update , and_ , asc , desc , literal_column
9+ from sqlalchemy import func , select , update , and_ , asc , desc , literal_column , between
910from sqlalchemy .orm import Session
1011from bloom .routers .requests import (DatetimeRangeRequest ,
1112 OrderByRequest ,
1213 OrderByEnum )
14+ from bloom .config import settings
1315
1416
1517class VesselRepository :
@@ -20,54 +22,128 @@ def __init__(
2022 self .session_factory = session_factory
2123
2224
23- def get_vessel_tracked_count (self , session : Session ) -> int :
25+ def get_vessel_tracked_count (self , session : Session ,
26+ scd_date :Optional [datetime ]= None ,
27+ scd_enable :bool = True
28+ ) -> int :
2429 stmt = select (func .count (sql_model .Vessel .id )).select_from (sql_model .Vessel )\
2530 .distinct ().where (sql_model .Vessel .tracking_activated == True )
31+ if scd_enable :
32+ if scd_date :
33+ stmt = stmt .where (between (scd_date ,sql_model .Vessel .scd_start ,sql_model .Vessel .scd_end ))
34+ else :
35+ stmt = stmt .where (sql_model .Vessel .scd_active )
2636 return session .execute (stmt ).scalar ()
2737
28- def get_vessel_types (self , session : Session ) -> list [str ]:
38+ def get_vessel_types (self ,
39+ session : Session ,
40+ scd_date :Optional [datetime ]= None ,
41+ scd_enable :bool = True
42+ ) -> list [str ]:
2943 stmt = select (sql_model .Vessel .type ).select_from (sql_model .Vessel ).distinct ()
44+ if scd_enable :
45+ if scd_date :
46+ stmt = stmt .where (between (scd_date ,sql_model .Vessel .scd_start ,sql_model .Vessel .scd_end ))
47+ else :
48+ stmt = stmt .where (sql_model .Vessel .scd_active )
3049 return [i for i in session .execute (stmt ).scalars ()]
3150
32- def get_vessel_length_classes (self , session : Session ) -> list [str ]:
51+ def get_vessel_length_classes (self , session : Session ,
52+ scd_date :Optional [datetime ]= None ,
53+ scd_enable :bool = True
54+ ) -> list [str ]:
3355 stmt = select (sql_model .Vessel .length_class ).select_from (sql_model .Vessel ).distinct ()
56+ if scd_enable :
57+ if scd_date :
58+ stmt = stmt .where (between (scd_date ,sql_model .Vessel .scd_start ,sql_model .Vessel .scd_end ))
59+ else :
60+ stmt = stmt .where (sql_model .Vessel .scd_active )
3461 return [i for i in session .execute (stmt ).scalars ()]
3562
36- def get_vessel_countries (self , session : Session ) -> list [str ]:
63+ def get_vessel_countries (self , session : Session ,
64+ scd_date :Optional [datetime ]= None ,
65+ scd_enable :bool = True
66+ ) -> list [str ]:
3767 stmt = select (sql_model .Vessel .country_iso3 ).select_from (sql_model .Vessel ).distinct ()
68+ if scd_enable :
69+ if scd_date :
70+ stmt = stmt .where (between (scd_date ,sql_model .Vessel .scd_start ,sql_model .Vessel .scd_end ))
71+ else :
72+ stmt = stmt .where (sql_model .Vessel .scd_active )
3873 return [i for i in session .execute (stmt ).scalars ()]
3974
4075 def get_vessel_by_id (self , session : Session , vessel_id : int ) -> Union [Vessel , None ]:
4176 return session .get (sql_model .Vessel , vessel_id )
77+
78+ def get_vessel_by_key (self , session : Session ,
79+ key : str ,
80+ scd_date :Optional [datetime ]= None ,
81+ scd_enable :bool = True
82+ ) -> Union [Vessel , list [Vessel ],None ]:
83+ stmt = select (sql_model .Vessel ).where (sql_model .Vessel .key == key )
84+ if scd_enable :
85+ if scd_date :
86+ stmt = stmt .where (between (scd_date ,sql_model .Vessel .scd_start ,sql_model .Vessel .scd_end ))
87+ else :
88+ stmt = stmt .where (sql_model .Vessel .scd_active )
89+ return session .execute (stmt ).scalar ()
90+ else :
91+ return session .execute (stmt ).scalars ()
4292
43- def get_activated_vessel_by_mmsi (self , session : Session , mmsi : int ) -> Union [Vessel , None ]:
93+ def get_activated_vessel_by_mmsi (self , session : Session ,
94+ mmsi : int ,
95+ scd_date :Optional [datetime ]= None ,
96+ scd_enable :bool = True
97+ ) -> Union [Vessel , None ]:
4498 stmt = select (sql_model .Vessel ).where (
4599 and_ (
46100 sql_model .Vessel .tracking_activated == True ,
47101 sql_model .Vessel .mmsi == mmsi
48102 )
49103 )
104+ if scd_enable :
105+ if scd_date :
106+ stmt = stmt .where (between (scd_date ,sql_model .Vessel .scd_start ,sql_model .Vessel .scd_end ))
107+ else :
108+ stmt = stmt .where (sql_model .Vessel .scd_active )
50109 vessel = session .execute (stmt ).scalar ()
51110 if not vessel :
52111 return None
53112 else :
54113 return VesselRepository .map_to_domain (vessel )
55114
56- def get_vessels_list (self , session : Session ) -> list [Vessel ]:
115+ def get_vessels_list (self , session : Session ,
116+ scd_date :Optional [datetime ]= None ,
117+ scd_enable :bool = True
118+ ) -> list [Vessel ]:
57119 """
58120 Liste l'ensemble des vessels actifs
59121 """
60122 stmt = select (sql_model .Vessel ).where (sql_model .Vessel .tracking_activated == True )
123+ if scd_enable :
124+ if scd_date :
125+ stmt = stmt .where (between (scd_date ,sql_model .Vessel .scd_start ,sql_model .Vessel .scd_end ))
126+ else :
127+ stmt = stmt .where (sql_model .Vessel .scd_active )
61128 e = session .execute (stmt ).scalars ()
62129 if not e :
63130 return []
64131 return [VesselRepository .map_to_domain (vessel ) for vessel in e ]
65132
66- def get_all_vessels_list (self , session : Session ) -> list [Vessel ]:
133+ def get_all_vessels_list (self ,
134+ session : Session ,
135+ scd_date :Optional [datetime ]= None ,
136+ scd_enable :bool = True
137+ ) -> list [Vessel ]:
67138 """
68139 Liste l'ensemble des vessels actifs ou inactifs
69140 """
70141 stmt = select (sql_model .Vessel )
142+ if scd_enable :
143+ if scd_date :
144+ stmt = stmt .where (between (scd_date ,sql_model .Vessel .scd_start ,sql_model .Vessel .scd_end ))
145+ else :
146+ stmt = stmt .where (sql_model .Vessel .scd_active )
71147 e = session .execute (stmt ).scalars ()
72148
73149 if not e :
@@ -137,8 +213,10 @@ def get_vessel_times_in_zones( self,
137213
138214 return result
139215
140- def batch_create_vessel (self , session : Session , vessels : list [Vessel ]) -> list [Vessel ]:
141- orm_list = [VesselRepository .map_to_sql (port ) for port in vessels ]
216+ def batch_create_vessel (self , session : Session ,
217+ vessels : list [Vessel ]
218+ ) -> list [Vessel ]:
219+ orm_list = [VesselRepository .map_to_sql (vessel ) for vessel in vessels ]
142220 session .add_all (orm_list )
143221 return [VesselRepository .map_to_domain (orm ) for orm in orm_list ]
144222
@@ -187,12 +265,16 @@ def map_to_domain(sql_vessel: sql_model.Vessel) -> Vessel:
187265 details = sql_vessel .details ,
188266 check = sql_vessel .check ,
189267 length_class = sql_vessel .length_class ,
268+ scd_start = sql_vessel .scd_start ,
269+ scd_end = sql_vessel .scd_end ,
270+ scd_active = sql_vessel .scd_active ,
190271 )
191272
192273 @staticmethod
193274 def map_to_sql (vessel : Vessel ) -> sql_model .Vessel :
194275 return sql_model .Vessel (
195276 id = vessel .id ,
277+ key = vessel .key ,
196278 mmsi = vessel .mmsi ,
197279 ship_name = vessel .ship_name ,
198280 width = vessel .width ,
@@ -211,4 +293,7 @@ def map_to_sql(vessel: Vessel) -> sql_model.Vessel:
211293 details = vessel .details ,
212294 check = vessel .check ,
213295 length_class = vessel .length_class ,
296+ scd_start = vessel .scd_start ,
297+ scd_end = vessel .scd_end ,
298+ scd_active = vessel .scd_active ,
214299 )
0 commit comments