11
11
Parcel ,
12
12
ParcelLabel ,
13
13
PickupSite ,
14
- PickupSiteInput ,
15
- PickupSiteOutput ,
14
+ PickupSiteSearchInput ,
16
15
PickupSiteSearch ,
16
+ PickupSiteGetInput ,
17
+ PickupSiteGet ,
18
+ PickupSiteOpeningSlot ,
19
+ PickupSiteOpeningHours ,
20
+ PickupSiteSearchOutput ,
21
+ PickupSiteGetOutput ,
17
22
Service ,
18
23
)
19
24
from .constants import SORTED_KEYS
20
25
from hashlib import md5
26
+ from datetime import datetime
21
27
22
28
23
29
class MondialRelayAuth (Auth ):
@@ -163,43 +169,75 @@ def soap(self):
163
169
164
170
165
171
class MondialRelayPickupSiteSearch (PickupSiteSearch ):
166
- id : int | None = None
167
- weight : float | None = None
172
+ lat : float | None = None
173
+ lng : float | None = None
168
174
action : str | None = None
169
- delay : int | None = None
170
175
searchRadius : int | None = None
171
176
actionType : str | None = None
172
177
resultsCount : int | None = None
173
178
174
179
def soap (self ):
175
180
return {
176
181
"Pays" : self .country ,
177
- "NumPointRelais" : self .id ,
178
182
"CP" : self .zip ,
179
183
"Latitude" : self .lat ,
180
184
"Longitude" : self .lng ,
181
185
"Poids" : self .weight ,
182
186
"Action" : self .action ,
183
- "DelaiEnvoi" : self .delay ,
184
187
"RayonRecherche" : self .searchRadius ,
185
188
"TypeActivite" : self .actionType ,
186
189
"NombreResultats" : self .resultsCount ,
187
190
}
188
191
189
192
190
- class MondialRelayPickupSiteInput (PickupSiteInput ):
193
+ class MondialRelayPickupSiteService (Service ):
194
+ def soap (self ):
195
+ delay = None
196
+ if self .shippingDate :
197
+ delay = (self .shippingDate - datetime .now ()).days
198
+ return {
199
+ "DelaiEnvoi" : delay ,
200
+ }
201
+
202
+
203
+ class MondialRelayPickupSiteSearchInput (PickupSiteSearchInput ):
191
204
auth : MondialRelayAuth
205
+ service : MondialRelayPickupSiteService | None = None
192
206
search : MondialRelayPickupSiteSearch
193
207
194
208
def soap (self ):
195
209
return self .auth .sign (
196
210
{
197
211
** self .auth .soap (),
212
+ ** (self .service .soap () if self .service else {}),
198
213
** self .search .soap (),
199
214
}
200
215
)
201
216
202
217
218
+ class MondialRelayPickupSiteGet (PickupSiteGet ):
219
+ def soap (self ):
220
+ return {
221
+ "Pays" : self .zone ,
222
+ "NumPointRelais" : self .id ,
223
+ }
224
+
225
+
226
+ class MondialRelayPickupSiteGetInput (PickupSiteGetInput ):
227
+ auth : MondialRelayAuth
228
+ service : MondialRelayPickupSiteService | None = None
229
+ get : MondialRelayPickupSiteGet
230
+
231
+ def soap (self ):
232
+ return self .auth .sign (
233
+ {
234
+ ** self .auth .soap (),
235
+ ** (self .service .soap () if self .service else {}),
236
+ ** self .get .soap (),
237
+ }
238
+ )
239
+
240
+
203
241
class MondialRelayLabel (Label ):
204
242
@classmethod
205
243
def from_soap (cls , result ):
@@ -229,9 +267,43 @@ def from_soap(cls, result):
229
267
return cls .model_construct (parcels = [MondialRelayParcelLabel .from_soap (result )])
230
268
231
269
270
+ class MondialRelayPickupSiteOpeningSlot (PickupSiteOpeningSlot ):
271
+ @classmethod
272
+ def from_soap (cls , start , end ):
273
+ return cls .model_construct (
274
+ start = datetime .strptime (start , "%H%M" ).time (),
275
+ end = datetime .strptime (end , "%H%M" ).time (),
276
+ )
277
+
278
+
279
+ class MondialRelayPickupSiteOpeningHours (PickupSiteOpeningHours ):
280
+ @classmethod
281
+ def from_soap (cls , result ):
282
+ return cls .model_construct (
283
+ ** {
284
+ day : [
285
+ MondialRelayPickupSiteOpeningSlot .from_soap (slot_start , slot_end )
286
+ for slot_start , slot_end in zip (
287
+ result [f"Horaires_{ day_label } " ]["string" ][::2 ],
288
+ result [f"Horaires_{ day_label } " ]["string" ][1 ::2 ],
289
+ )
290
+ if slot_start != "0000" and slot_end != "0000"
291
+ ]
292
+ for day , day_label in [
293
+ ("monday" , "Lundi" ),
294
+ ("tuesday" , "Mardi" ),
295
+ ("wednesday" , "Mercredi" ),
296
+ ("thursday" , "Jeudi" ),
297
+ ("friday" , "Vendredi" ),
298
+ ("saturday" , "Samedi" ),
299
+ ("sunday" , "Dimanche" ),
300
+ ]
301
+ }
302
+ )
303
+
304
+
232
305
class MondialRelayPickupSite (PickupSite ):
233
306
actionType : str
234
- hours : dict
235
307
url_pic : str
236
308
url_map : str
237
309
@@ -240,32 +312,24 @@ def from_soap(cls, result):
240
312
return cls .model_construct (
241
313
id = result ["Num" ],
242
314
name = "\n " .join (
243
- [part for part in [result ["LgAdr1" ], result ["LgAdr2" ]] if part ]
315
+ [part . strip () for part in [result ["LgAdr1" ], result ["LgAdr2" ]] if part ]
244
316
),
245
317
street = "\n " .join (
246
- [part for part in [result ["LgAdr3" ], result ["LgAdr4" ]] if part ]
318
+ [part . strip () for part in [result ["LgAdr3" ], result ["LgAdr4" ]] if part ]
247
319
),
248
320
zip = result ["CP" ],
249
- city = result ["Ville" ],
321
+ city = result ["Ville" ]. strip () if result [ "Ville" ] else None ,
250
322
country = result ["Pays" ],
251
- lat = result ["Latitude" ],
252
- lng = result ["Longitude" ],
323
+ lat = result ["Latitude" ]. replace ( "," , "." ) ,
324
+ lng = result ["Longitude" ]. replace ( "," , "." ) ,
253
325
actionType = result ["TypeActivite" ],
254
- hours = {
255
- "monday" : result ["Horaires_Lundi" ],
256
- "tuesday" : result ["Horaires_Mardi" ],
257
- "wednesday" : result ["Horaires_Mercredi" ],
258
- "thursday" : result ["Horaires_Jeudi" ],
259
- "friday" : result ["Horaires_Vendredi" ],
260
- "saturday" : result ["Horaires_Samedi" ],
261
- "sunday" : result ["Horaires_Dimanche" ],
262
- },
326
+ hours = MondialRelayPickupSiteOpeningHours .from_soap (result ),
263
327
url_pic = result ["URL_Photo" ],
264
328
url_map = result ["URL_Plan" ],
265
329
)
266
330
267
331
268
- class MondialRelayPickupSiteOutput ( PickupSiteOutput ):
332
+ class MondialRelayPickupSiteSearchOutput ( PickupSiteSearchOutput ):
269
333
sites : list [MondialRelayPickupSite ]
270
334
271
335
@classmethod
@@ -276,3 +340,17 @@ def from_soap(cls, result):
276
340
for site in result ["PointsRelais" ]["PointRelais_Details" ]
277
341
]
278
342
)
343
+
344
+
345
+ class MondialRelayPickupSiteGetOutput (PickupSiteGetOutput ):
346
+ site : MondialRelayPickupSite
347
+
348
+ @classmethod
349
+ def from_soap (cls , result ):
350
+ return cls .model_construct (
351
+ site = MondialRelayPickupSite .from_soap (
352
+ result ["PointsRelais" ]["PointRelais_Details" ][0 ]
353
+ )
354
+ if result ["PointsRelais" ]["PointRelais_Details" ]
355
+ else None
356
+ )
0 commit comments