1
+ # Copyright 2019 Akretion (http://www.akretion.com).
2
+ # @author Sébastien BEAU <[email protected] >
3
+ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
4
+ from typing import Annotated
5
+
6
+ from fastapi import Depends
7
+
8
+ from odoo import _ , api , models
9
+ from odoo .exceptions import UserError
10
+
11
+ from odoo .addons .base .models .res_partner import Partner as ResPartner
12
+ from odoo .addons .fastapi .dependencies import (
13
+ authenticated_partner ,
14
+ authenticated_partner_env ,
15
+ )
16
+ from odoo .addons .shopinvader_api_cart .routers import cart_router
17
+ from odoo .addons .shopinvader_schema_sale .schemas import Sale
18
+
19
+ from ..schemas import PublicDeliveryPickupInput
20
+
21
+
22
+ @cart_router .post ("/set_public_delivery_pickup" )
23
+ @cart_router .post ("/{uuid}/set_public_delivery_pickup" )
24
+ @cart_router .post ("/current/set_public_delivery_pickup" )
25
+ def set_public_delivery_pickup (
26
+ env : Annotated [api .Environment , Depends (authenticated_partner_env )],
27
+ partner : Annotated ["ResPartner" , Depends (authenticated_partner )],
28
+ data : PublicDeliveryPickupInput ,
29
+ uuid : str | None = None ,
30
+ ) -> Sale | None :
31
+ """
32
+ If cart is found, set the given dropoffsite on it.
33
+ """
34
+ cart = env ["sale.order" ]._find_open_cart (partner .id , uuid )
35
+ if not cart :
36
+ raise UserError (_ ("There is no cart" ))
37
+ dropoff_site = env ["shopinvader_api_cart.cart_router.helper" ]._add_update_dropoff_site (cart , data )
38
+ env ["shopinvader_api_cart.cart_router.helper" ]._set_delivery_pickup (cart , dropoff_site )
39
+ return Sale .from_sale_order (cart ) if cart else None
40
+
41
+
42
+ class ShopinvaderApiCartRouterHelper (models .AbstractModel ):
43
+ _inherit = "shopinvader_api_cart.cart_router.helper"
44
+
45
+ @api .model
46
+ def _prepare_dropoff_site_params (self , cart , data ):
47
+ if not cart .carrier_id :
48
+ raise UserError (_ ("You must select a carrier first" ))
49
+ elif not cart .carrier_id .allow_dropoff_site_public_edition :
50
+ raise UserError (
51
+ _ ("You can not add a dropoff site on this carrier" )
52
+ )
53
+ dropoff_site = {
54
+ "ref" : data .code ,
55
+ "name" : data .name ,
56
+ "street" : data .street ,
57
+ "street2" : data .street2 ,
58
+ "zip" : data .zip ,
59
+ "city" : data .city ,
60
+ "phone" : data .phone ,
61
+ }
62
+ country_code = data .country_code
63
+ state_code = data .state_code
64
+
65
+ country = self .env ["res.country" ].search ([("code" , "=" , country_code )])
66
+ if not country :
67
+ raise UserError (_ ("Invalid country code %s" ) % country_code )
68
+ dropoff_site ["country_id" ] = country .id
69
+
70
+ if state_code :
71
+ state = self .env ["res.country.state" ].search (
72
+ [("code" , "=" , state_code ), ("country_id" , "=" , country .id )]
73
+ )
74
+ if not state :
75
+ raise UserError (
76
+ _ ("Invalid state code %s for country %s" )
77
+ % (state_code , country_code )
78
+ )
79
+ dropoff_site ["state_id" ] = state .id
80
+
81
+ dropoff_site ["carrier_id" ] = cart .carrier_id .id
82
+ return dropoff_site
83
+
84
+ @api .model
85
+ def _add_update_dropoff_site (self , cart , data ):
86
+ vals = self ._prepare_dropoff_site_params (cart , data )
87
+ dropoff_site = self .env ["dropoff.site" ].search (
88
+ [
89
+ ("carrier_id" , "=" , cart .carrier_id .id ),
90
+ ("ref" , "=" , vals ["ref" ]),
91
+ ]
92
+ )
93
+ if dropoff_site :
94
+ dropoff_site .write (vals )
95
+ else :
96
+ dropoff_site = self .env ["dropoff.site" ].create (vals )
97
+ return dropoff_site
98
+
0 commit comments