Skip to content

Commit 0106c10

Browse files
[16.0][MIG] shopinvader_delivery_pickup_public_edition: Migration to 16.0 (FastAPI)
1 parent 4f9f4c1 commit 0106c10

File tree

25 files changed

+779
-186
lines changed

25 files changed

+779
-186
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
# addons listed in this file are ignored by
2+
# setuptools-odoo-make-default (one addon per line)

setup/README

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
To learn more about this directory, please visit
2+
https://pypi.python.org/pypi/setuptools-odoo
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
../../../../shopinvader_api_delivery_pickup_public_edition
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import setuptools
2+
3+
setuptools.setup(
4+
setup_requires=['setuptools-odoo'],
5+
odoo_addon=True,
6+
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
=================================
2+
Shopinvader Pickup Public Edition
3+
=================================
4+
5+
..
6+
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
7+
!! This file is generated by oca-gen-addon-readme !!
8+
!! changes will be overwritten. !!
9+
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
10+
!! source digest: sha256:c11b4eb95a24a33dea25c3c5f7136d2907d1facd2de388b7e2851b0d18a0053c
11+
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
12+
13+
.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
14+
:target: https://odoo-community.org/page/development-status
15+
:alt: Beta
16+
.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png
17+
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
18+
:alt: License: AGPL-3
19+
.. |badge3| image:: https://img.shields.io/badge/github-shopinvader%2Fodoo--shopinvader--carrier-lightgray.png?logo=github
20+
:target: https://github.com/shopinvader/odoo-shopinvader-carrier/tree/16.0/shopinvader_api_delivery_pickup_public_edition
21+
:alt: shopinvader/odoo-shopinvader-carrier
22+
23+
|badge1| |badge2| |badge3|
24+
25+
This is shopinvader the odoo module for the new generation of e-commerce.
26+
27+
This module is a base module for supporting external carrier widget for selecting dropoff site.
28+
29+
You must be aware that this implementation allow public user to create the dropoff site.
30+
So information can be altered, so you should not trust at 100% the meta-information of the dropoffsite.
31+
But the code of the dropoff site is not alterable and can be trusted, as it the only information that are used for sending the goods (we only use the dropoff site code) their is no risk that a package is delivered to the wrong address.
32+
33+
34+
.. _Shopinvader: https://shopinvader.com
35+
36+
**Table of contents**
37+
38+
.. contents::
39+
:local:
40+
41+
Bug Tracker
42+
===========
43+
44+
Bugs are tracked on `GitHub Issues <https://github.com/shopinvader/odoo-shopinvader-carrier/issues>`_.
45+
In case of trouble, please check there if your issue has already been reported.
46+
If you spotted it first, help us to smash it by providing a detailed and welcomed
47+
`feedback <https://github.com/shopinvader/odoo-shopinvader-carrier/issues/new?body=module:%20shopinvader_api_delivery_pickup_public_edition%0Aversion:%2016.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
48+
49+
Do not contact contributors directly about support or help with technical issues.
50+
51+
Credits
52+
=======
53+
54+
Authors
55+
~~~~~~~
56+
57+
* Akretion
58+
* Shopinvader
59+
60+
Contributors
61+
~~~~~~~~~~~~
62+
63+
* Sebastien BEAU <[email protected]>
64+
* Chafique DELLI <[email protected]>
65+
66+
Other credits
67+
~~~~~~~~~~~~~
68+
69+
The development of this module has been financially supported by:
70+
71+
* Akretion
72+
73+
Maintainers
74+
~~~~~~~~~~~
75+
76+
This module is part of the `shopinvader/odoo-shopinvader-carrier <https://github.com/shopinvader/odoo-shopinvader-carrier/tree/16.0/shopinvader_api_delivery_pickup_public_edition>`_ project on GitHub.
77+
78+
You are welcome to contribute.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
from . import routers
2+
from . import models

shopinvader_delivery_pickup_public_edition/__manifest__.py renamed to shopinvader_api_delivery_pickup_public_edition/__manifest__.py

+5-6
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,19 @@
1-
# -*- coding: utf-8 -*-
2-
# Copyright 2019 Akretion (http://www.akretion.com)
1+
# Copyright 2019-2024 Akretion (http://www.akretion.com)
32
# Sébastien BEAU <[email protected]>
43
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
54

65
{
76
"name": "Shopinvader Pickup Public Edition",
87
"summary": "Shopinvader Pickup Public Edition",
9-
"version": "10.0.0.0.0",
8+
"version": "16.0.1.0.0",
109
"category": "e-commerce",
11-
"website": "https://akretion.com",
12-
"author": "Akretion",
10+
"website": "https://github.com/shopinvader/odoo-shopinvader-carrier",
11+
"author": "Akretion, Shopinvader",
1312
"license": "AGPL-3",
1413
"application": False,
1514
"installable": True,
1615
"external_dependencies": {"python": [], "bin": []},
17-
"depends": ["shopinvader_delivery_pickup"],
16+
"depends": ["shopinvader_api_delivery_pickup"],
1817
"data": ["views/delivery_carrier_view.xml"],
1918
"demo": [],
2019
"qweb": [],
Original file line numberDiff line numberDiff line change
@@ -1,3 +1 @@
1-
# -*- coding: utf-8 -*-
2-
31
from . import delivery_carrier

shopinvader_delivery_pickup_public_edition/models/delivery_carrier.py renamed to shopinvader_api_delivery_pickup_public_edition/models/delivery_carrier.py

-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
# coding: utf-8
21
# Copyright (C) 2018 - Today: GRAP (http://www.grap.coop)
32
# @author: Sylvain LE GAL (https://twitter.com/legalsylvain)
43
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
@@ -10,7 +9,6 @@ class DeliveryCarrier(models.Model):
109
_inherit = "delivery.carrier"
1110

1211
allow_dropoff_site_public_edition = fields.Boolean(
13-
string="Allow Dropoff Site Public Edition",
1412
help="This option allow to create a dropoff site from public call "
1513
"on a shopinvader website, this is needed for some carrier",
1614
)
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
* Sebastien BEAU <[email protected]>
2+
* Chafique DELLI <[email protected]>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
from . import cart
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
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[
38+
"shopinvader_api_cart.cart_router.helper"
39+
]._add_update_dropoff_site(cart, data)
40+
env["shopinvader_api_cart.cart_router.helper"]._set_delivery_pickup(
41+
cart, dropoff_site
42+
)
43+
return Sale.from_sale_order(cart) if cart else None
44+
45+
46+
class ShopinvaderApiCartRouterHelper(models.AbstractModel):
47+
_inherit = "shopinvader_api_cart.cart_router.helper"
48+
49+
@api.model
50+
def _prepare_dropoff_site_params(self, cart, data):
51+
if not cart.carrier_id:
52+
raise UserError(_("You must select a carrier first"))
53+
elif not cart.carrier_id.allow_dropoff_site_public_edition:
54+
raise UserError(_("You can not add a dropoff site on this carrier"))
55+
dropoff_site = {
56+
"ref": data.code,
57+
"name": data.name,
58+
"street": data.street,
59+
"street2": data.street2,
60+
"zip": data.zip,
61+
"city": data.city,
62+
"phone": data.phone,
63+
}
64+
country_code = data.country_code
65+
state_code = data.state_code
66+
67+
country = self.env["res.country"].search([("code", "=", country_code)])
68+
if not country:
69+
raise UserError(_("Invalid country code %(country_code)s"))
70+
dropoff_site["country_id"] = country.id
71+
72+
if state_code:
73+
state = self.env["res.country.state"].search(
74+
[("code", "=", state_code), ("country_id", "=", country.id)]
75+
)
76+
if not state:
77+
raise UserError(
78+
_("Invalid state code %(state_code)s for country %(country_code)s")
79+
)
80+
dropoff_site["state_id"] = state.id
81+
82+
dropoff_site["carrier_id"] = cart.carrier_id.id
83+
return dropoff_site
84+
85+
@api.model
86+
def _add_update_dropoff_site(self, cart, data):
87+
vals = self._prepare_dropoff_site_params(cart, data)
88+
dropoff_site = self.env["dropoff.site"].search(
89+
[
90+
("carrier_id", "=", cart.carrier_id.id),
91+
("ref", "=", vals["ref"]),
92+
]
93+
)
94+
if dropoff_site:
95+
dropoff_site.write(vals)
96+
else:
97+
dropoff_site = self.env["dropoff.site"].create(vals)
98+
return dropoff_site
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
from . import public_delivery_pickup
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
# Copyright 2019 ACSONE SA/NV
2+
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
3+
from typing import Annotated, Field
4+
5+
from extendable_pydantic import StrictExtendableBaseModel
6+
7+
from odoo import api
8+
9+
10+
class PublicDeliveryPickupInput(StrictExtendableBaseModel):
11+
code: str
12+
name: str
13+
street: str | None = None
14+
street2: str | None = None
15+
zip: str
16+
city: str
17+
phone: str | None = None
18+
state_code: str | None = None
19+
country_code: str
20+
21+
22+
class PublicDeliveryPickupSearch(StrictExtendableBaseModel):
23+
name: Annotated[
24+
str | None,
25+
Field(
26+
description="When used, the search look for any delivery pickup where name "
27+
"contains the given value case insensitively."
28+
),
29+
] = None
30+
carrier_id: Annotated[
31+
int | None,
32+
Field(
33+
description="When used, the search look for any delivery pickup where carrier "
34+
"contains the given value case insensitively."
35+
),
36+
] = None
37+
38+
def to_odoo_domain(self, env: api.Environment):
39+
domain = []
40+
if self.name:
41+
domain.append(("name", "ilike", self.name))
42+
if self.carrier_id:
43+
domain.append(("carrier_id", "ilike", self.carrier_id.id))
44+
return domain
45+
46+
47+
class PublicDeliveryPickup(StrictExtendableBaseModel):
48+
code: str
49+
name: str
50+
street: str | None = None
51+
street2: str | None = None
52+
zip: str
53+
city: str
54+
phone: str | None = None
55+
state_code: str | None = None
56+
country_code: str
57+
58+
@classmethod
59+
def from_public_delivery_pickup(cls, odoo_rec):
60+
return cls.model_construct(
61+
code=odoo_rec.code,
62+
name=odoo_rec.name,
63+
street=odoo_rec.street or None,
64+
street2=odoo_rec.street2 or None,
65+
zip=odoo_rec.zip,
66+
city=odoo_rec.city,
67+
phone=odoo_rec.phone or None,
68+
state_code=odoo_rec.state_id.code or None,
69+
country_code=odoo_rec.country_id.code,
70+
)

0 commit comments

Comments
 (0)