From c7b073237d02b030b31381e8a4c09a5464140d63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20BEAU?= Date: Fri, 28 Jun 2019 15:36:26 +0200 Subject: [PATCH 1/6] [REF] refactor code split edition part in a separated module and add laposte support --- shopinvader_dropoff_site_edition/__init__.py | 4 + .../__manifest__.py | 21 +++++ .../models/__init__.py | 3 + .../models/delivery_carrier.py | 16 ++++ .../readme/CONTRIBUTORS.rst | 1 + .../readme/CREDITS.rst | 3 + .../readme/DESCRIPTION.rst | 10 +++ .../services/__init__.py | 3 + .../services/cart.py | 86 +++++++++++++++++++ .../tests/__init__.py | 3 + .../tests/test_dropoff_site.py | 64 ++++++++++++++ .../views/delivery_carrier_view.xml | 16 ++++ 12 files changed, 230 insertions(+) create mode 100644 shopinvader_dropoff_site_edition/__init__.py create mode 100644 shopinvader_dropoff_site_edition/__manifest__.py create mode 100644 shopinvader_dropoff_site_edition/models/__init__.py create mode 100644 shopinvader_dropoff_site_edition/models/delivery_carrier.py create mode 100644 shopinvader_dropoff_site_edition/readme/CONTRIBUTORS.rst create mode 100644 shopinvader_dropoff_site_edition/readme/CREDITS.rst create mode 100644 shopinvader_dropoff_site_edition/readme/DESCRIPTION.rst create mode 100644 shopinvader_dropoff_site_edition/services/__init__.py create mode 100644 shopinvader_dropoff_site_edition/services/cart.py create mode 100644 shopinvader_dropoff_site_edition/tests/__init__.py create mode 100644 shopinvader_dropoff_site_edition/tests/test_dropoff_site.py create mode 100644 shopinvader_dropoff_site_edition/views/delivery_carrier_view.xml diff --git a/shopinvader_dropoff_site_edition/__init__.py b/shopinvader_dropoff_site_edition/__init__.py new file mode 100644 index 0000000..4b75472 --- /dev/null +++ b/shopinvader_dropoff_site_edition/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- + +from . import services +from . import models diff --git a/shopinvader_dropoff_site_edition/__manifest__.py b/shopinvader_dropoff_site_edition/__manifest__.py new file mode 100644 index 0000000..2d3da3c --- /dev/null +++ b/shopinvader_dropoff_site_edition/__manifest__.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +# Copyright 2019 Akretion (http://www.akretion.com) +# Sébastien BEAU +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +{ + "name": "Shopinvader Dropoff site Public Edition", + "summary": "Shopinvader Dropoff site Public Edition", + "version": "10.0.0.0.0", + "category": "e-commerce", + "website": "https://akretion.com", + "author": "Akretion", + "license": "AGPL-3", + "application": False, + "installable": True, + "external_dependencies": {"python": [], "bin": []}, + "depends": ["shopinvader_dropoff_site"], + "data": ["views/delivery_carrier_view.xml"], + "demo": [], + "qweb": [], +} diff --git a/shopinvader_dropoff_site_edition/models/__init__.py b/shopinvader_dropoff_site_edition/models/__init__.py new file mode 100644 index 0000000..dcd71fd --- /dev/null +++ b/shopinvader_dropoff_site_edition/models/__init__.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- + +from . import delivery_carrier diff --git a/shopinvader_dropoff_site_edition/models/delivery_carrier.py b/shopinvader_dropoff_site_edition/models/delivery_carrier.py new file mode 100644 index 0000000..91843eb --- /dev/null +++ b/shopinvader_dropoff_site_edition/models/delivery_carrier.py @@ -0,0 +1,16 @@ +# coding: utf-8 +# Copyright (C) 2018 - Today: GRAP (http://www.grap.coop) +# @author: Sylvain LE GAL (https://twitter.com/legalsylvain) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from odoo import fields, models + + +class DeliveryCarrier(models.Model): + _inherit = "delivery.carrier" + + allow_dropoff_site_public_edition = fields.Boolean( + string="Allow Dropoff Site Public Edition", + help="This option allow to create a dropoff site from public call " + "on a shopinvader website, this is needed for some carrier", + ) diff --git a/shopinvader_dropoff_site_edition/readme/CONTRIBUTORS.rst b/shopinvader_dropoff_site_edition/readme/CONTRIBUTORS.rst new file mode 100644 index 0000000..4be8cbf --- /dev/null +++ b/shopinvader_dropoff_site_edition/readme/CONTRIBUTORS.rst @@ -0,0 +1 @@ +* Sebastien BEAU diff --git a/shopinvader_dropoff_site_edition/readme/CREDITS.rst b/shopinvader_dropoff_site_edition/readme/CREDITS.rst new file mode 100644 index 0000000..fdc8ca1 --- /dev/null +++ b/shopinvader_dropoff_site_edition/readme/CREDITS.rst @@ -0,0 +1,3 @@ +The development of this module has been financially supported by: + +* Akretion diff --git a/shopinvader_dropoff_site_edition/readme/DESCRIPTION.rst b/shopinvader_dropoff_site_edition/readme/DESCRIPTION.rst new file mode 100644 index 0000000..c80ff66 --- /dev/null +++ b/shopinvader_dropoff_site_edition/readme/DESCRIPTION.rst @@ -0,0 +1,10 @@ +This is shopinvader the odoo module for the new generation of e-commerce. + +This module is a base module for supporting external carrier widget for selecting dropoff site. + +You must be aware that this implementation allow public user to create the dropoff site. +So information can be altered, so you should not trust at 100% the meta-information of the dropoffsite. +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. + + +.. _Shopinvader: https://shopinvader.com diff --git a/shopinvader_dropoff_site_edition/services/__init__.py b/shopinvader_dropoff_site_edition/services/__init__.py new file mode 100644 index 0000000..34405c3 --- /dev/null +++ b/shopinvader_dropoff_site_edition/services/__init__.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- + +from . import cart diff --git a/shopinvader_dropoff_site_edition/services/cart.py b/shopinvader_dropoff_site_edition/services/cart.py new file mode 100644 index 0000000..daf5e8e --- /dev/null +++ b/shopinvader_dropoff_site_edition/services/cart.py @@ -0,0 +1,86 @@ +# -*- coding: utf-8 -*- +# Copyright 2019 Akretion (http://www.akretion.com). +# @author Sébastien BEAU +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + + +from odoo.addons.component.core import Component +from odoo.exceptions import UserError +from odoo.tools.translate import _ + + +class CartService(Component): + _inherit = "shopinvader.cart.service" + + def set_public_dropoff_site(self, **params): + """ + This service will create/update apply the given dropoffsite + to the current cart + :param params: Dict containing dropoff site information + :return: + """ + cart = self._get() + if not cart: + raise UserError(_("There is not cart")) + else: + self._add_update_dropoff_site(cart, params) + self._set_dropoff_site(cart, params["code"]) + return self._to_json(cart) + + # Validator + def _validator_set_public_dropoff_site(self): + return { + "code": {"type": "string", "required": True}, + "name": {"type": "string", "required": True}, + "street": {"type": "string"}, + "street2": {"type": "string"}, + "zip": {"type": "string", "required": True}, + "city": {"type": "string", "required": True}, + "phone": {"type": "string"}, + "state_code": {"type": "string"}, + "country_code": {"type": "string", "required": True}, + } + + def _prepare_dropoff_site_params(self, cart, dropoff_site): + if not cart.carrier_id: + raise UserError(_("You must select a carrier first")) + elif not cart.carrier_id.allow_dropoff_site_public_edition: + raise UserError( + _("You can not add a dropoff site on this carrier") + ) + dropoff_site["ref"] = dropoff_site["code"] + country_code = dropoff_site.pop("country_code") + state_code = dropoff_site.pop("state_code", None) + + country = self.env["res.country"].search([("code", "=", country_code)]) + if not country: + raise UserError(_("Invalid country code %s") % country_code) + dropoff_site["country_id"] = country.id + + if state_code: + state = self.env["res.country.state"].search( + [("code", "=", state_code), ("country_id", "=", country.id)] + ) + if not state: + raise UserError( + _("Invalid state code %s for country %s") + % (state_code, country_code) + ) + dropoff_site["state_id"] = state.id + + dropoff_site["carrier_id"] = cart.carrier_id.id + return dropoff_site + + def _add_update_dropoff_site(self, cart, dropoff_site): + vals = self._prepare_dropoff_site_params(cart, dropoff_site) + dropoff_site_obj = self.env["dropoff.site"] + dropoff_site = dropoff_site_obj.search( + [ + ("carrier_id", "=", cart.carrier_id.id), + ("ref", "=", dropoff_site["ref"]), + ] + ) + if dropoff_site: + dropoff_site.write(vals) + else: + dropoff_site = dropoff_site_obj.create(vals) diff --git a/shopinvader_dropoff_site_edition/tests/__init__.py b/shopinvader_dropoff_site_edition/tests/__init__.py new file mode 100644 index 0000000..d59a501 --- /dev/null +++ b/shopinvader_dropoff_site_edition/tests/__init__.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- + +from . import test_dropoff_site diff --git a/shopinvader_dropoff_site_edition/tests/test_dropoff_site.py b/shopinvader_dropoff_site_edition/tests/test_dropoff_site.py new file mode 100644 index 0000000..a3145b3 --- /dev/null +++ b/shopinvader_dropoff_site_edition/tests/test_dropoff_site.py @@ -0,0 +1,64 @@ +# -*- coding: utf-8 -*- +# Copyright 2019 Akretion (http://www.akretion.com). +# @author Sébastien BEAU +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo.addons.shopinvader_delivery_carrier.tests.common import ( + CommonCarrierCase, +) + + +class DropOffSiteCase(CommonCarrierCase): + def setUp(self): + super(DropOffSiteCase, self).setUp() + self.final_partner = self.cart.partner_shipping_id + self.poste_carrier.write( + { + "with_dropoff_site": True, + "allow_dropoff_site_public_edition": True, + } + ) + self._set_carrier(self.poste_carrier) + self._set_dropoff_site(ref="foo", name="Bar") + + def _set_dropoff_site(self, ref, name): + self.service.dispatch( + "set_public_dropoff_site", + params={ + "code": ref, + "name": name, + "street": u"Boulevard Shopinvader", + "zip": u"69004", + "city": u"Lyon", + "country_code": u"FR", + }, + ) + + def test_setting_dropoff_site(self): + shipping = self.cart.partner_shipping_id + self.assertEqual(shipping.ref, "foo") + self.assertEqual(shipping.name, "Bar") + self.assertEqual( + self.cart.final_shipping_partner_id, self.final_partner + ) + + def test_updating_dropoff_site(self): + shipping = self.cart.partner_shipping_id + self._set_dropoff_site(ref="foo", name="Updated") + self.assertEqual(self.cart.partner_shipping_id, shipping) + self.assertEqual(shipping.ref, "foo") + self.assertEqual(shipping.name, "Updated") + self.assertEqual( + self.cart.final_shipping_partner_id, self.final_partner + ) + + def test_changing_dropoff_site(self): + previous_shipping = self.cart.partner_shipping_id + self._set_dropoff_site(ref="foo2", name="Bar2") + self.assertNotEqual(self.cart.partner_shipping_id, previous_shipping) + shipping = self.cart.partner_shipping_id + self.assertEqual(shipping.ref, "foo2") + self.assertEqual(shipping.name, "Bar2") + self.assertEqual( + self.cart.final_shipping_partner_id, self.final_partner + ) diff --git a/shopinvader_dropoff_site_edition/views/delivery_carrier_view.xml b/shopinvader_dropoff_site_edition/views/delivery_carrier_view.xml new file mode 100644 index 0000000..ce6158d --- /dev/null +++ b/shopinvader_dropoff_site_edition/views/delivery_carrier_view.xml @@ -0,0 +1,16 @@ + + + + + + delivery.carrier + + + + + + + + + + From 4f9f4c1f2bc467c0d34b835bf5926955e19c4035 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20BEAU?= Date: Tue, 22 Oct 2019 14:48:12 +0200 Subject: [PATCH 2/6] [REF] refactor code due to change in base module --- .../__init__.py | 0 .../__manifest__.py | 6 +++--- .../models/__init__.py | 0 .../models/delivery_carrier.py | 0 .../readme/CONTRIBUTORS.rst | 0 .../readme/CREDITS.rst | 0 .../readme/DESCRIPTION.rst | 0 .../services/__init__.py | 0 .../services/cart.py | 9 +++++---- .../tests/__init__.py | 3 +++ .../tests/test_pickup.py | 20 +++++++++---------- .../views/delivery_carrier_view.xml | 0 .../tests/__init__.py | 3 --- 13 files changed, 21 insertions(+), 20 deletions(-) rename {shopinvader_dropoff_site_edition => shopinvader_delivery_pickup_public_edition}/__init__.py (100%) rename {shopinvader_dropoff_site_edition => shopinvader_delivery_pickup_public_edition}/__manifest__.py (77%) rename {shopinvader_dropoff_site_edition => shopinvader_delivery_pickup_public_edition}/models/__init__.py (100%) rename {shopinvader_dropoff_site_edition => shopinvader_delivery_pickup_public_edition}/models/delivery_carrier.py (100%) rename {shopinvader_dropoff_site_edition => shopinvader_delivery_pickup_public_edition}/readme/CONTRIBUTORS.rst (100%) rename {shopinvader_dropoff_site_edition => shopinvader_delivery_pickup_public_edition}/readme/CREDITS.rst (100%) rename {shopinvader_dropoff_site_edition => shopinvader_delivery_pickup_public_edition}/readme/DESCRIPTION.rst (100%) rename {shopinvader_dropoff_site_edition => shopinvader_delivery_pickup_public_edition}/services/__init__.py (100%) rename {shopinvader_dropoff_site_edition => shopinvader_delivery_pickup_public_edition}/services/cart.py (91%) create mode 100644 shopinvader_delivery_pickup_public_edition/tests/__init__.py rename shopinvader_dropoff_site_edition/tests/test_dropoff_site.py => shopinvader_delivery_pickup_public_edition/tests/test_pickup.py (79%) rename {shopinvader_dropoff_site_edition => shopinvader_delivery_pickup_public_edition}/views/delivery_carrier_view.xml (100%) delete mode 100644 shopinvader_dropoff_site_edition/tests/__init__.py diff --git a/shopinvader_dropoff_site_edition/__init__.py b/shopinvader_delivery_pickup_public_edition/__init__.py similarity index 100% rename from shopinvader_dropoff_site_edition/__init__.py rename to shopinvader_delivery_pickup_public_edition/__init__.py diff --git a/shopinvader_dropoff_site_edition/__manifest__.py b/shopinvader_delivery_pickup_public_edition/__manifest__.py similarity index 77% rename from shopinvader_dropoff_site_edition/__manifest__.py rename to shopinvader_delivery_pickup_public_edition/__manifest__.py index 2d3da3c..1ec4086 100644 --- a/shopinvader_dropoff_site_edition/__manifest__.py +++ b/shopinvader_delivery_pickup_public_edition/__manifest__.py @@ -4,8 +4,8 @@ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). { - "name": "Shopinvader Dropoff site Public Edition", - "summary": "Shopinvader Dropoff site Public Edition", + "name": "Shopinvader Pickup Public Edition", + "summary": "Shopinvader Pickup Public Edition", "version": "10.0.0.0.0", "category": "e-commerce", "website": "https://akretion.com", @@ -14,7 +14,7 @@ "application": False, "installable": True, "external_dependencies": {"python": [], "bin": []}, - "depends": ["shopinvader_dropoff_site"], + "depends": ["shopinvader_delivery_pickup"], "data": ["views/delivery_carrier_view.xml"], "demo": [], "qweb": [], diff --git a/shopinvader_dropoff_site_edition/models/__init__.py b/shopinvader_delivery_pickup_public_edition/models/__init__.py similarity index 100% rename from shopinvader_dropoff_site_edition/models/__init__.py rename to shopinvader_delivery_pickup_public_edition/models/__init__.py diff --git a/shopinvader_dropoff_site_edition/models/delivery_carrier.py b/shopinvader_delivery_pickup_public_edition/models/delivery_carrier.py similarity index 100% rename from shopinvader_dropoff_site_edition/models/delivery_carrier.py rename to shopinvader_delivery_pickup_public_edition/models/delivery_carrier.py diff --git a/shopinvader_dropoff_site_edition/readme/CONTRIBUTORS.rst b/shopinvader_delivery_pickup_public_edition/readme/CONTRIBUTORS.rst similarity index 100% rename from shopinvader_dropoff_site_edition/readme/CONTRIBUTORS.rst rename to shopinvader_delivery_pickup_public_edition/readme/CONTRIBUTORS.rst diff --git a/shopinvader_dropoff_site_edition/readme/CREDITS.rst b/shopinvader_delivery_pickup_public_edition/readme/CREDITS.rst similarity index 100% rename from shopinvader_dropoff_site_edition/readme/CREDITS.rst rename to shopinvader_delivery_pickup_public_edition/readme/CREDITS.rst diff --git a/shopinvader_dropoff_site_edition/readme/DESCRIPTION.rst b/shopinvader_delivery_pickup_public_edition/readme/DESCRIPTION.rst similarity index 100% rename from shopinvader_dropoff_site_edition/readme/DESCRIPTION.rst rename to shopinvader_delivery_pickup_public_edition/readme/DESCRIPTION.rst diff --git a/shopinvader_dropoff_site_edition/services/__init__.py b/shopinvader_delivery_pickup_public_edition/services/__init__.py similarity index 100% rename from shopinvader_dropoff_site_edition/services/__init__.py rename to shopinvader_delivery_pickup_public_edition/services/__init__.py diff --git a/shopinvader_dropoff_site_edition/services/cart.py b/shopinvader_delivery_pickup_public_edition/services/cart.py similarity index 91% rename from shopinvader_dropoff_site_edition/services/cart.py rename to shopinvader_delivery_pickup_public_edition/services/cart.py index daf5e8e..a53d001 100644 --- a/shopinvader_dropoff_site_edition/services/cart.py +++ b/shopinvader_delivery_pickup_public_edition/services/cart.py @@ -12,7 +12,7 @@ class CartService(Component): _inherit = "shopinvader.cart.service" - def set_public_dropoff_site(self, **params): + def set_public_delivery_pickup(self, **params): """ This service will create/update apply the given dropoffsite to the current cart @@ -23,12 +23,12 @@ def set_public_dropoff_site(self, **params): if not cart: raise UserError(_("There is not cart")) else: - self._add_update_dropoff_site(cart, params) - self._set_dropoff_site(cart, params["code"]) + dropoff_site = self._add_update_dropoff_site(cart, params) + self._set_delivery_pickup(cart, dropoff_site.id) return self._to_json(cart) # Validator - def _validator_set_public_dropoff_site(self): + def _validator_set_public_delivery_pickup(self): return { "code": {"type": "string", "required": True}, "name": {"type": "string", "required": True}, @@ -84,3 +84,4 @@ def _add_update_dropoff_site(self, cart, dropoff_site): dropoff_site.write(vals) else: dropoff_site = dropoff_site_obj.create(vals) + return dropoff_site diff --git a/shopinvader_delivery_pickup_public_edition/tests/__init__.py b/shopinvader_delivery_pickup_public_edition/tests/__init__.py new file mode 100644 index 0000000..57be042 --- /dev/null +++ b/shopinvader_delivery_pickup_public_edition/tests/__init__.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- + +from . import test_pickup diff --git a/shopinvader_dropoff_site_edition/tests/test_dropoff_site.py b/shopinvader_delivery_pickup_public_edition/tests/test_pickup.py similarity index 79% rename from shopinvader_dropoff_site_edition/tests/test_dropoff_site.py rename to shopinvader_delivery_pickup_public_edition/tests/test_pickup.py index a3145b3..55a5e71 100644 --- a/shopinvader_dropoff_site_edition/tests/test_dropoff_site.py +++ b/shopinvader_delivery_pickup_public_edition/tests/test_pickup.py @@ -8,9 +8,9 @@ ) -class DropOffSiteCase(CommonCarrierCase): +class PickupCase(CommonCarrierCase): def setUp(self): - super(DropOffSiteCase, self).setUp() + super(PickupCase, self).setUp() self.final_partner = self.cart.partner_shipping_id self.poste_carrier.write( { @@ -19,11 +19,11 @@ def setUp(self): } ) self._set_carrier(self.poste_carrier) - self._set_dropoff_site(ref="foo", name="Bar") + self._set_pickup(ref="foo", name="Bar") - def _set_dropoff_site(self, ref, name): + def _set_pickup(self, ref, name): self.service.dispatch( - "set_public_dropoff_site", + "set_public_delivery_pickup", params={ "code": ref, "name": name, @@ -34,7 +34,7 @@ def _set_dropoff_site(self, ref, name): }, ) - def test_setting_dropoff_site(self): + def test_setting_pickup(self): shipping = self.cart.partner_shipping_id self.assertEqual(shipping.ref, "foo") self.assertEqual(shipping.name, "Bar") @@ -42,9 +42,9 @@ def test_setting_dropoff_site(self): self.cart.final_shipping_partner_id, self.final_partner ) - def test_updating_dropoff_site(self): + def test_updating_pickup(self): shipping = self.cart.partner_shipping_id - self._set_dropoff_site(ref="foo", name="Updated") + self._set_pickup(ref="foo", name="Updated") self.assertEqual(self.cart.partner_shipping_id, shipping) self.assertEqual(shipping.ref, "foo") self.assertEqual(shipping.name, "Updated") @@ -52,9 +52,9 @@ def test_updating_dropoff_site(self): self.cart.final_shipping_partner_id, self.final_partner ) - def test_changing_dropoff_site(self): + def test_changing_pickup(self): previous_shipping = self.cart.partner_shipping_id - self._set_dropoff_site(ref="foo2", name="Bar2") + self._set_pickup(ref="foo2", name="Bar2") self.assertNotEqual(self.cart.partner_shipping_id, previous_shipping) shipping = self.cart.partner_shipping_id self.assertEqual(shipping.ref, "foo2") diff --git a/shopinvader_dropoff_site_edition/views/delivery_carrier_view.xml b/shopinvader_delivery_pickup_public_edition/views/delivery_carrier_view.xml similarity index 100% rename from shopinvader_dropoff_site_edition/views/delivery_carrier_view.xml rename to shopinvader_delivery_pickup_public_edition/views/delivery_carrier_view.xml diff --git a/shopinvader_dropoff_site_edition/tests/__init__.py b/shopinvader_dropoff_site_edition/tests/__init__.py deleted file mode 100644 index d59a501..0000000 --- a/shopinvader_dropoff_site_edition/tests/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -# -*- coding: utf-8 -*- - -from . import test_dropoff_site From 0106c10de3c19a9dee6a8450e7c469ab4cdf2b80 Mon Sep 17 00:00:00 2001 From: "chafique.delli" Date: Fri, 17 May 2024 14:37:39 +0200 Subject: [PATCH 3/6] [16.0][MIG] shopinvader_delivery_pickup_public_edition: Migration to 16.0 (FastAPI) --- setup/.setuptools-odoo-make-default-ignore | 2 + setup/README | 2 + ...invader_api_delivery_pickup_public_edition | 1 + .../setup.py | 6 + .../README.rst | 78 ++++ .../__init__.py | 2 + .../__manifest__.py | 11 +- .../models/__init__.py | 2 - .../models/delivery_carrier.py | 2 - .../readme/CONTRIBUTORS.rst | 1 + .../readme/CREDITS.rst | 0 .../readme/DESCRIPTION.rst | 0 .../routers/__init__.py | 1 + .../routers/cart.py | 98 ++++ .../schemas/__init__.py | 1 + .../schemas/public_delivery_pickup.py | 70 +++ .../static/description/index.html | 429 ++++++++++++++++++ .../tests/__init__.py | 2 - .../tests/test_pickup.py | 69 +++ .../views/delivery_carrier_view.xml | 14 + .../__init__.py | 4 - .../services/__init__.py | 3 - .../services/cart.py | 87 ---- .../tests/test_pickup.py | 64 --- .../views/delivery_carrier_view.xml | 16 - 25 files changed, 779 insertions(+), 186 deletions(-) create mode 100644 setup/.setuptools-odoo-make-default-ignore create mode 100644 setup/README create mode 120000 setup/shopinvader_api_delivery_pickup_public_edition/odoo/addons/shopinvader_api_delivery_pickup_public_edition create mode 100644 setup/shopinvader_api_delivery_pickup_public_edition/setup.py create mode 100644 shopinvader_api_delivery_pickup_public_edition/README.rst create mode 100644 shopinvader_api_delivery_pickup_public_edition/__init__.py rename {shopinvader_delivery_pickup_public_edition => shopinvader_api_delivery_pickup_public_edition}/__manifest__.py (64%) rename {shopinvader_delivery_pickup_public_edition => shopinvader_api_delivery_pickup_public_edition}/models/__init__.py (55%) rename {shopinvader_delivery_pickup_public_edition => shopinvader_api_delivery_pickup_public_edition}/models/delivery_carrier.py (88%) rename {shopinvader_delivery_pickup_public_edition => shopinvader_api_delivery_pickup_public_edition}/readme/CONTRIBUTORS.rst (50%) rename {shopinvader_delivery_pickup_public_edition => shopinvader_api_delivery_pickup_public_edition}/readme/CREDITS.rst (100%) rename {shopinvader_delivery_pickup_public_edition => shopinvader_api_delivery_pickup_public_edition}/readme/DESCRIPTION.rst (100%) create mode 100644 shopinvader_api_delivery_pickup_public_edition/routers/__init__.py create mode 100644 shopinvader_api_delivery_pickup_public_edition/routers/cart.py create mode 100644 shopinvader_api_delivery_pickup_public_edition/schemas/__init__.py create mode 100644 shopinvader_api_delivery_pickup_public_edition/schemas/public_delivery_pickup.py create mode 100644 shopinvader_api_delivery_pickup_public_edition/static/description/index.html rename {shopinvader_delivery_pickup_public_edition => shopinvader_api_delivery_pickup_public_edition}/tests/__init__.py (50%) create mode 100644 shopinvader_api_delivery_pickup_public_edition/tests/test_pickup.py create mode 100644 shopinvader_api_delivery_pickup_public_edition/views/delivery_carrier_view.xml delete mode 100644 shopinvader_delivery_pickup_public_edition/__init__.py delete mode 100644 shopinvader_delivery_pickup_public_edition/services/__init__.py delete mode 100644 shopinvader_delivery_pickup_public_edition/services/cart.py delete mode 100644 shopinvader_delivery_pickup_public_edition/tests/test_pickup.py delete mode 100644 shopinvader_delivery_pickup_public_edition/views/delivery_carrier_view.xml diff --git a/setup/.setuptools-odoo-make-default-ignore b/setup/.setuptools-odoo-make-default-ignore new file mode 100644 index 0000000..207e615 --- /dev/null +++ b/setup/.setuptools-odoo-make-default-ignore @@ -0,0 +1,2 @@ +# addons listed in this file are ignored by +# setuptools-odoo-make-default (one addon per line) diff --git a/setup/README b/setup/README new file mode 100644 index 0000000..a63d633 --- /dev/null +++ b/setup/README @@ -0,0 +1,2 @@ +To learn more about this directory, please visit +https://pypi.python.org/pypi/setuptools-odoo diff --git a/setup/shopinvader_api_delivery_pickup_public_edition/odoo/addons/shopinvader_api_delivery_pickup_public_edition b/setup/shopinvader_api_delivery_pickup_public_edition/odoo/addons/shopinvader_api_delivery_pickup_public_edition new file mode 120000 index 0000000..961868e --- /dev/null +++ b/setup/shopinvader_api_delivery_pickup_public_edition/odoo/addons/shopinvader_api_delivery_pickup_public_edition @@ -0,0 +1 @@ +../../../../shopinvader_api_delivery_pickup_public_edition \ No newline at end of file diff --git a/setup/shopinvader_api_delivery_pickup_public_edition/setup.py b/setup/shopinvader_api_delivery_pickup_public_edition/setup.py new file mode 100644 index 0000000..28c57bb --- /dev/null +++ b/setup/shopinvader_api_delivery_pickup_public_edition/setup.py @@ -0,0 +1,6 @@ +import setuptools + +setuptools.setup( + setup_requires=['setuptools-odoo'], + odoo_addon=True, +) diff --git a/shopinvader_api_delivery_pickup_public_edition/README.rst b/shopinvader_api_delivery_pickup_public_edition/README.rst new file mode 100644 index 0000000..caa2ad8 --- /dev/null +++ b/shopinvader_api_delivery_pickup_public_edition/README.rst @@ -0,0 +1,78 @@ +================================= +Shopinvader Pickup Public Edition +================================= + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:c11b4eb95a24a33dea25c3c5f7136d2907d1facd2de388b7e2851b0d18a0053c + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-shopinvader%2Fodoo--shopinvader--carrier-lightgray.png?logo=github + :target: https://github.com/shopinvader/odoo-shopinvader-carrier/tree/16.0/shopinvader_api_delivery_pickup_public_edition + :alt: shopinvader/odoo-shopinvader-carrier + +|badge1| |badge2| |badge3| + +This is shopinvader the odoo module for the new generation of e-commerce. + +This module is a base module for supporting external carrier widget for selecting dropoff site. + +You must be aware that this implementation allow public user to create the dropoff site. +So information can be altered, so you should not trust at 100% the meta-information of the dropoffsite. +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. + + +.. _Shopinvader: https://shopinvader.com + +**Table of contents** + +.. contents:: + :local: + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* Akretion +* Shopinvader + +Contributors +~~~~~~~~~~~~ + +* Sebastien BEAU +* Chafique DELLI + +Other credits +~~~~~~~~~~~~~ + +The development of this module has been financially supported by: + +* Akretion + +Maintainers +~~~~~~~~~~~ + +This module is part of the `shopinvader/odoo-shopinvader-carrier `_ project on GitHub. + +You are welcome to contribute. diff --git a/shopinvader_api_delivery_pickup_public_edition/__init__.py b/shopinvader_api_delivery_pickup_public_edition/__init__.py new file mode 100644 index 0000000..f405eb3 --- /dev/null +++ b/shopinvader_api_delivery_pickup_public_edition/__init__.py @@ -0,0 +1,2 @@ +from . import routers +from . import models diff --git a/shopinvader_delivery_pickup_public_edition/__manifest__.py b/shopinvader_api_delivery_pickup_public_edition/__manifest__.py similarity index 64% rename from shopinvader_delivery_pickup_public_edition/__manifest__.py rename to shopinvader_api_delivery_pickup_public_edition/__manifest__.py index 1ec4086..3181875 100644 --- a/shopinvader_delivery_pickup_public_edition/__manifest__.py +++ b/shopinvader_api_delivery_pickup_public_edition/__manifest__.py @@ -1,20 +1,19 @@ -# -*- coding: utf-8 -*- -# Copyright 2019 Akretion (http://www.akretion.com) +# Copyright 2019-2024 Akretion (http://www.akretion.com) # Sébastien BEAU # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). { "name": "Shopinvader Pickup Public Edition", "summary": "Shopinvader Pickup Public Edition", - "version": "10.0.0.0.0", + "version": "16.0.1.0.0", "category": "e-commerce", - "website": "https://akretion.com", - "author": "Akretion", + "website": "https://github.com/shopinvader/odoo-shopinvader-carrier", + "author": "Akretion, Shopinvader", "license": "AGPL-3", "application": False, "installable": True, "external_dependencies": {"python": [], "bin": []}, - "depends": ["shopinvader_delivery_pickup"], + "depends": ["shopinvader_api_delivery_pickup"], "data": ["views/delivery_carrier_view.xml"], "demo": [], "qweb": [], diff --git a/shopinvader_delivery_pickup_public_edition/models/__init__.py b/shopinvader_api_delivery_pickup_public_edition/models/__init__.py similarity index 55% rename from shopinvader_delivery_pickup_public_edition/models/__init__.py rename to shopinvader_api_delivery_pickup_public_edition/models/__init__.py index dcd71fd..0a1fe29 100644 --- a/shopinvader_delivery_pickup_public_edition/models/__init__.py +++ b/shopinvader_api_delivery_pickup_public_edition/models/__init__.py @@ -1,3 +1 @@ -# -*- coding: utf-8 -*- - from . import delivery_carrier diff --git a/shopinvader_delivery_pickup_public_edition/models/delivery_carrier.py b/shopinvader_api_delivery_pickup_public_edition/models/delivery_carrier.py similarity index 88% rename from shopinvader_delivery_pickup_public_edition/models/delivery_carrier.py rename to shopinvader_api_delivery_pickup_public_edition/models/delivery_carrier.py index 91843eb..6f8a71b 100644 --- a/shopinvader_delivery_pickup_public_edition/models/delivery_carrier.py +++ b/shopinvader_api_delivery_pickup_public_edition/models/delivery_carrier.py @@ -1,4 +1,3 @@ -# coding: utf-8 # Copyright (C) 2018 - Today: GRAP (http://www.grap.coop) # @author: Sylvain LE GAL (https://twitter.com/legalsylvain) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). @@ -10,7 +9,6 @@ class DeliveryCarrier(models.Model): _inherit = "delivery.carrier" allow_dropoff_site_public_edition = fields.Boolean( - string="Allow Dropoff Site Public Edition", help="This option allow to create a dropoff site from public call " "on a shopinvader website, this is needed for some carrier", ) diff --git a/shopinvader_delivery_pickup_public_edition/readme/CONTRIBUTORS.rst b/shopinvader_api_delivery_pickup_public_edition/readme/CONTRIBUTORS.rst similarity index 50% rename from shopinvader_delivery_pickup_public_edition/readme/CONTRIBUTORS.rst rename to shopinvader_api_delivery_pickup_public_edition/readme/CONTRIBUTORS.rst index 4be8cbf..36cc592 100644 --- a/shopinvader_delivery_pickup_public_edition/readme/CONTRIBUTORS.rst +++ b/shopinvader_api_delivery_pickup_public_edition/readme/CONTRIBUTORS.rst @@ -1 +1,2 @@ * Sebastien BEAU +* Chafique DELLI diff --git a/shopinvader_delivery_pickup_public_edition/readme/CREDITS.rst b/shopinvader_api_delivery_pickup_public_edition/readme/CREDITS.rst similarity index 100% rename from shopinvader_delivery_pickup_public_edition/readme/CREDITS.rst rename to shopinvader_api_delivery_pickup_public_edition/readme/CREDITS.rst diff --git a/shopinvader_delivery_pickup_public_edition/readme/DESCRIPTION.rst b/shopinvader_api_delivery_pickup_public_edition/readme/DESCRIPTION.rst similarity index 100% rename from shopinvader_delivery_pickup_public_edition/readme/DESCRIPTION.rst rename to shopinvader_api_delivery_pickup_public_edition/readme/DESCRIPTION.rst diff --git a/shopinvader_api_delivery_pickup_public_edition/routers/__init__.py b/shopinvader_api_delivery_pickup_public_edition/routers/__init__.py new file mode 100644 index 0000000..d98a08b --- /dev/null +++ b/shopinvader_api_delivery_pickup_public_edition/routers/__init__.py @@ -0,0 +1 @@ +from . import cart diff --git a/shopinvader_api_delivery_pickup_public_edition/routers/cart.py b/shopinvader_api_delivery_pickup_public_edition/routers/cart.py new file mode 100644 index 0000000..6352c59 --- /dev/null +++ b/shopinvader_api_delivery_pickup_public_edition/routers/cart.py @@ -0,0 +1,98 @@ +# Copyright 2019 Akretion (http://www.akretion.com). +# @author Sébastien BEAU +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +from typing import Annotated + +from fastapi import Depends + +from odoo import _, api, models +from odoo.exceptions import UserError + +from odoo.addons.base.models.res_partner import Partner as ResPartner +from odoo.addons.fastapi.dependencies import ( + authenticated_partner, + authenticated_partner_env, +) +from odoo.addons.shopinvader_api_cart.routers import cart_router +from odoo.addons.shopinvader_schema_sale.schemas import Sale + +from ..schemas import PublicDeliveryPickupInput + + +@cart_router.post("/set_public_delivery_pickup") +@cart_router.post("/{uuid}/set_public_delivery_pickup") +@cart_router.post("/current/set_public_delivery_pickup") +def set_public_delivery_pickup( + env: Annotated[api.Environment, Depends(authenticated_partner_env)], + partner: Annotated["ResPartner", Depends(authenticated_partner)], + data: PublicDeliveryPickupInput, + uuid: str | None = None, +) -> Sale | None: + """ + If cart is found, set the given dropoffsite on it. + """ + cart = env["sale.order"]._find_open_cart(partner.id, uuid) + if not cart: + raise UserError(_("There is no cart")) + dropoff_site = env[ + "shopinvader_api_cart.cart_router.helper" + ]._add_update_dropoff_site(cart, data) + env["shopinvader_api_cart.cart_router.helper"]._set_delivery_pickup( + cart, dropoff_site + ) + return Sale.from_sale_order(cart) if cart else None + + +class ShopinvaderApiCartRouterHelper(models.AbstractModel): + _inherit = "shopinvader_api_cart.cart_router.helper" + + @api.model + def _prepare_dropoff_site_params(self, cart, data): + if not cart.carrier_id: + raise UserError(_("You must select a carrier first")) + elif not cart.carrier_id.allow_dropoff_site_public_edition: + raise UserError(_("You can not add a dropoff site on this carrier")) + dropoff_site = { + "ref": data.code, + "name": data.name, + "street": data.street, + "street2": data.street2, + "zip": data.zip, + "city": data.city, + "phone": data.phone, + } + country_code = data.country_code + state_code = data.state_code + + country = self.env["res.country"].search([("code", "=", country_code)]) + if not country: + raise UserError(_("Invalid country code %(country_code)s")) + dropoff_site["country_id"] = country.id + + if state_code: + state = self.env["res.country.state"].search( + [("code", "=", state_code), ("country_id", "=", country.id)] + ) + if not state: + raise UserError( + _("Invalid state code %(state_code)s for country %(country_code)s") + ) + dropoff_site["state_id"] = state.id + + dropoff_site["carrier_id"] = cart.carrier_id.id + return dropoff_site + + @api.model + def _add_update_dropoff_site(self, cart, data): + vals = self._prepare_dropoff_site_params(cart, data) + dropoff_site = self.env["dropoff.site"].search( + [ + ("carrier_id", "=", cart.carrier_id.id), + ("ref", "=", vals["ref"]), + ] + ) + if dropoff_site: + dropoff_site.write(vals) + else: + dropoff_site = self.env["dropoff.site"].create(vals) + return dropoff_site diff --git a/shopinvader_api_delivery_pickup_public_edition/schemas/__init__.py b/shopinvader_api_delivery_pickup_public_edition/schemas/__init__.py new file mode 100644 index 0000000..3c4d9ee --- /dev/null +++ b/shopinvader_api_delivery_pickup_public_edition/schemas/__init__.py @@ -0,0 +1 @@ +from . import public_delivery_pickup diff --git a/shopinvader_api_delivery_pickup_public_edition/schemas/public_delivery_pickup.py b/shopinvader_api_delivery_pickup_public_edition/schemas/public_delivery_pickup.py new file mode 100644 index 0000000..6d30df7 --- /dev/null +++ b/shopinvader_api_delivery_pickup_public_edition/schemas/public_delivery_pickup.py @@ -0,0 +1,70 @@ +# Copyright 2019 ACSONE SA/NV +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +from typing import Annotated, Field + +from extendable_pydantic import StrictExtendableBaseModel + +from odoo import api + + +class PublicDeliveryPickupInput(StrictExtendableBaseModel): + code: str + name: str + street: str | None = None + street2: str | None = None + zip: str + city: str + phone: str | None = None + state_code: str | None = None + country_code: str + + +class PublicDeliveryPickupSearch(StrictExtendableBaseModel): + name: Annotated[ + str | None, + Field( + description="When used, the search look for any delivery pickup where name " + "contains the given value case insensitively." + ), + ] = None + carrier_id: Annotated[ + int | None, + Field( + description="When used, the search look for any delivery pickup where carrier " + "contains the given value case insensitively." + ), + ] = None + + def to_odoo_domain(self, env: api.Environment): + domain = [] + if self.name: + domain.append(("name", "ilike", self.name)) + if self.carrier_id: + domain.append(("carrier_id", "ilike", self.carrier_id.id)) + return domain + + +class PublicDeliveryPickup(StrictExtendableBaseModel): + code: str + name: str + street: str | None = None + street2: str | None = None + zip: str + city: str + phone: str | None = None + state_code: str | None = None + country_code: str + + @classmethod + def from_public_delivery_pickup(cls, odoo_rec): + return cls.model_construct( + code=odoo_rec.code, + name=odoo_rec.name, + street=odoo_rec.street or None, + street2=odoo_rec.street2 or None, + zip=odoo_rec.zip, + city=odoo_rec.city, + phone=odoo_rec.phone or None, + state_code=odoo_rec.state_id.code or None, + country_code=odoo_rec.country_id.code, + ) diff --git a/shopinvader_api_delivery_pickup_public_edition/static/description/index.html b/shopinvader_api_delivery_pickup_public_edition/static/description/index.html new file mode 100644 index 0000000..c76aec6 --- /dev/null +++ b/shopinvader_api_delivery_pickup_public_edition/static/description/index.html @@ -0,0 +1,429 @@ + + + + + +Shopinvader Pickup Public Edition + + + +
+

Shopinvader Pickup Public Edition

+ + +

Beta License: AGPL-3 shopinvader/odoo-shopinvader-carrier

+

This is shopinvader the odoo module for the new generation of e-commerce.

+

This module is a base module for supporting external carrier widget for selecting dropoff site.

+

You must be aware that this implementation allow public user to create the dropoff site. +So information can be altered, so you should not trust at 100% the meta-information of the dropoffsite. +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.

+

Table of contents

+ +
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • Akretion
  • +
  • Shopinvader
  • +
+
+
+

Contributors

+ +
+
+

Other credits

+

The development of this module has been financially supported by:

+
    +
  • Akretion
  • +
+
+
+

Maintainers

+

This module is part of the shopinvader/odoo-shopinvader-carrier project on GitHub.

+

You are welcome to contribute.

+
+
+
+ + diff --git a/shopinvader_delivery_pickup_public_edition/tests/__init__.py b/shopinvader_api_delivery_pickup_public_edition/tests/__init__.py similarity index 50% rename from shopinvader_delivery_pickup_public_edition/tests/__init__.py rename to shopinvader_api_delivery_pickup_public_edition/tests/__init__.py index 57be042..eee555b 100644 --- a/shopinvader_delivery_pickup_public_edition/tests/__init__.py +++ b/shopinvader_api_delivery_pickup_public_edition/tests/__init__.py @@ -1,3 +1 @@ -# -*- coding: utf-8 -*- - from . import test_pickup diff --git a/shopinvader_api_delivery_pickup_public_edition/tests/test_pickup.py b/shopinvader_api_delivery_pickup_public_edition/tests/test_pickup.py new file mode 100644 index 0000000..cbff21a --- /dev/null +++ b/shopinvader_api_delivery_pickup_public_edition/tests/test_pickup.py @@ -0,0 +1,69 @@ +# Copyright 2019 Akretion (http://www.akretion.com). +# @author Sébastien BEAU +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +import json + +from requests import Response + +from odoo.tests.common import tagged + +from odoo.addons.shopinvader_api_cart.routers import cart_router +from odoo.addons.shopinvader_api_delivery_pickup.tests.common import ( + TestShopinvaderDeliveryPickupCommon, +) + + +@tagged("post_install", "-at_install") +class PickupCase(TestShopinvaderDeliveryPickupCommon): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.final_partner = cls.cart.partner_shipping_id + cls.poste_carrier.write( + { + "with_dropoff_site": True, + "allow_dropoff_site_public_edition": True, + } + ) + cls._set_carrier(cls.poste_carrier) + cls._set_public_pickup(ref="foo", name="Bar") + + def _set_public_pickup(self, ref, name): + with self._create_test_client(router=cart_router) as test_client: + data = { + "code": ref, + "name": name, + "street": "Boulevard Shopinvader", + "zip": "69004", + "city": "Lyon", + "country_code": "FR", + } + response: Response = test_client.post( + "/set_public_delivery_pickup", content=json.dumps(data) + ) + self.assertEqual(response.status_code, 200) + self.assertEqual(self.cart.partner_shipping_id.name, name) + return response.json() + + def test_setting_pickup(self): + shipping = self.cart.partner_shipping_id + self.assertEqual(shipping.ref, "foo") + self.assertEqual(shipping.name, "Bar") + self.assertEqual(self.cart.final_shipping_partner_id, self.final_partner) + + def test_updating_pickup(self): + shipping = self.cart.partner_shipping_id + self._set_public_pickup(ref="foo", name="Updated") + self.assertEqual(self.cart.partner_shipping_id, shipping) + self.assertEqual(shipping.ref, "foo") + self.assertEqual(shipping.name, "Updated") + self.assertEqual(self.cart.final_shipping_partner_id, self.final_partner) + + def test_changing_pickup(self): + previous_shipping = self.cart.partner_shipping_id + self._set_public_pickup(ref="foo2", name="Bar2") + self.assertNotEqual(self.cart.partner_shipping_id, previous_shipping) + shipping = self.cart.partner_shipping_id + self.assertEqual(shipping.ref, "foo2") + self.assertEqual(shipping.name, "Bar2") + self.assertEqual(self.cart.final_shipping_partner_id, self.final_partner) diff --git a/shopinvader_api_delivery_pickup_public_edition/views/delivery_carrier_view.xml b/shopinvader_api_delivery_pickup_public_edition/views/delivery_carrier_view.xml new file mode 100644 index 0000000..6d20201 --- /dev/null +++ b/shopinvader_api_delivery_pickup_public_edition/views/delivery_carrier_view.xml @@ -0,0 +1,14 @@ + + + delivery.carrier + + + + + + + + diff --git a/shopinvader_delivery_pickup_public_edition/__init__.py b/shopinvader_delivery_pickup_public_edition/__init__.py deleted file mode 100644 index 4b75472..0000000 --- a/shopinvader_delivery_pickup_public_edition/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -# -*- coding: utf-8 -*- - -from . import services -from . import models diff --git a/shopinvader_delivery_pickup_public_edition/services/__init__.py b/shopinvader_delivery_pickup_public_edition/services/__init__.py deleted file mode 100644 index 34405c3..0000000 --- a/shopinvader_delivery_pickup_public_edition/services/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -# -*- coding: utf-8 -*- - -from . import cart diff --git a/shopinvader_delivery_pickup_public_edition/services/cart.py b/shopinvader_delivery_pickup_public_edition/services/cart.py deleted file mode 100644 index a53d001..0000000 --- a/shopinvader_delivery_pickup_public_edition/services/cart.py +++ /dev/null @@ -1,87 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2019 Akretion (http://www.akretion.com). -# @author Sébastien BEAU -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). - - -from odoo.addons.component.core import Component -from odoo.exceptions import UserError -from odoo.tools.translate import _ - - -class CartService(Component): - _inherit = "shopinvader.cart.service" - - def set_public_delivery_pickup(self, **params): - """ - This service will create/update apply the given dropoffsite - to the current cart - :param params: Dict containing dropoff site information - :return: - """ - cart = self._get() - if not cart: - raise UserError(_("There is not cart")) - else: - dropoff_site = self._add_update_dropoff_site(cart, params) - self._set_delivery_pickup(cart, dropoff_site.id) - return self._to_json(cart) - - # Validator - def _validator_set_public_delivery_pickup(self): - return { - "code": {"type": "string", "required": True}, - "name": {"type": "string", "required": True}, - "street": {"type": "string"}, - "street2": {"type": "string"}, - "zip": {"type": "string", "required": True}, - "city": {"type": "string", "required": True}, - "phone": {"type": "string"}, - "state_code": {"type": "string"}, - "country_code": {"type": "string", "required": True}, - } - - def _prepare_dropoff_site_params(self, cart, dropoff_site): - if not cart.carrier_id: - raise UserError(_("You must select a carrier first")) - elif not cart.carrier_id.allow_dropoff_site_public_edition: - raise UserError( - _("You can not add a dropoff site on this carrier") - ) - dropoff_site["ref"] = dropoff_site["code"] - country_code = dropoff_site.pop("country_code") - state_code = dropoff_site.pop("state_code", None) - - country = self.env["res.country"].search([("code", "=", country_code)]) - if not country: - raise UserError(_("Invalid country code %s") % country_code) - dropoff_site["country_id"] = country.id - - if state_code: - state = self.env["res.country.state"].search( - [("code", "=", state_code), ("country_id", "=", country.id)] - ) - if not state: - raise UserError( - _("Invalid state code %s for country %s") - % (state_code, country_code) - ) - dropoff_site["state_id"] = state.id - - dropoff_site["carrier_id"] = cart.carrier_id.id - return dropoff_site - - def _add_update_dropoff_site(self, cart, dropoff_site): - vals = self._prepare_dropoff_site_params(cart, dropoff_site) - dropoff_site_obj = self.env["dropoff.site"] - dropoff_site = dropoff_site_obj.search( - [ - ("carrier_id", "=", cart.carrier_id.id), - ("ref", "=", dropoff_site["ref"]), - ] - ) - if dropoff_site: - dropoff_site.write(vals) - else: - dropoff_site = dropoff_site_obj.create(vals) - return dropoff_site diff --git a/shopinvader_delivery_pickup_public_edition/tests/test_pickup.py b/shopinvader_delivery_pickup_public_edition/tests/test_pickup.py deleted file mode 100644 index 55a5e71..0000000 --- a/shopinvader_delivery_pickup_public_edition/tests/test_pickup.py +++ /dev/null @@ -1,64 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2019 Akretion (http://www.akretion.com). -# @author Sébastien BEAU -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). - -from odoo.addons.shopinvader_delivery_carrier.tests.common import ( - CommonCarrierCase, -) - - -class PickupCase(CommonCarrierCase): - def setUp(self): - super(PickupCase, self).setUp() - self.final_partner = self.cart.partner_shipping_id - self.poste_carrier.write( - { - "with_dropoff_site": True, - "allow_dropoff_site_public_edition": True, - } - ) - self._set_carrier(self.poste_carrier) - self._set_pickup(ref="foo", name="Bar") - - def _set_pickup(self, ref, name): - self.service.dispatch( - "set_public_delivery_pickup", - params={ - "code": ref, - "name": name, - "street": u"Boulevard Shopinvader", - "zip": u"69004", - "city": u"Lyon", - "country_code": u"FR", - }, - ) - - def test_setting_pickup(self): - shipping = self.cart.partner_shipping_id - self.assertEqual(shipping.ref, "foo") - self.assertEqual(shipping.name, "Bar") - self.assertEqual( - self.cart.final_shipping_partner_id, self.final_partner - ) - - def test_updating_pickup(self): - shipping = self.cart.partner_shipping_id - self._set_pickup(ref="foo", name="Updated") - self.assertEqual(self.cart.partner_shipping_id, shipping) - self.assertEqual(shipping.ref, "foo") - self.assertEqual(shipping.name, "Updated") - self.assertEqual( - self.cart.final_shipping_partner_id, self.final_partner - ) - - def test_changing_pickup(self): - previous_shipping = self.cart.partner_shipping_id - self._set_pickup(ref="foo2", name="Bar2") - self.assertNotEqual(self.cart.partner_shipping_id, previous_shipping) - shipping = self.cart.partner_shipping_id - self.assertEqual(shipping.ref, "foo2") - self.assertEqual(shipping.name, "Bar2") - self.assertEqual( - self.cart.final_shipping_partner_id, self.final_partner - ) diff --git a/shopinvader_delivery_pickup_public_edition/views/delivery_carrier_view.xml b/shopinvader_delivery_pickup_public_edition/views/delivery_carrier_view.xml deleted file mode 100644 index ce6158d..0000000 --- a/shopinvader_delivery_pickup_public_edition/views/delivery_carrier_view.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - delivery.carrier - - - - - - - - - - From 3e89544d8b15dae396678422c308e49278027afb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20BEAU?= Date: Wed, 4 Sep 2024 10:55:07 +0200 Subject: [PATCH 4/6] shopinvader_api_delivery_pickup_public_edition: fix import --- .../schemas/public_delivery_pickup.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/shopinvader_api_delivery_pickup_public_edition/schemas/public_delivery_pickup.py b/shopinvader_api_delivery_pickup_public_edition/schemas/public_delivery_pickup.py index 6d30df7..8ad1da6 100644 --- a/shopinvader_api_delivery_pickup_public_edition/schemas/public_delivery_pickup.py +++ b/shopinvader_api_delivery_pickup_public_edition/schemas/public_delivery_pickup.py @@ -1,8 +1,9 @@ # Copyright 2019 ACSONE SA/NV # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -from typing import Annotated, Field +from typing import Annotated from extendable_pydantic import StrictExtendableBaseModel +from pydantic import Field from odoo import api From 72037afd7c35276ed99ce5fd75fc62ac1c0a27c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20BEAU?= Date: Wed, 4 Sep 2024 11:13:17 +0200 Subject: [PATCH 5/6] hopinvader_api_delivery_pickup_public_edition: fix schema import --- .../schemas/__init__.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/shopinvader_api_delivery_pickup_public_edition/schemas/__init__.py b/shopinvader_api_delivery_pickup_public_edition/schemas/__init__.py index 3c4d9ee..e96b26d 100644 --- a/shopinvader_api_delivery_pickup_public_edition/schemas/__init__.py +++ b/shopinvader_api_delivery_pickup_public_edition/schemas/__init__.py @@ -1 +1,5 @@ -from . import public_delivery_pickup +from .public_delivery_pickup import ( + PublicDeliveryPickup, + PublicDeliveryPickupInput, + PublicDeliveryPickupSearch, +) From e656365a3de48a60a2cdec3c8e681760ad34ecd6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20BEAU?= Date: Thu, 5 Sep 2024 09:11:54 +0200 Subject: [PATCH 6/6] shopinvader_api_delivery_pickup_public_edition: fix setting dropoff site --- shopinvader_api_delivery_pickup_public_edition/routers/cart.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shopinvader_api_delivery_pickup_public_edition/routers/cart.py b/shopinvader_api_delivery_pickup_public_edition/routers/cart.py index 6352c59..9803f23 100644 --- a/shopinvader_api_delivery_pickup_public_edition/routers/cart.py +++ b/shopinvader_api_delivery_pickup_public_edition/routers/cart.py @@ -38,7 +38,7 @@ def set_public_delivery_pickup( "shopinvader_api_cart.cart_router.helper" ]._add_update_dropoff_site(cart, data) env["shopinvader_api_cart.cart_router.helper"]._set_delivery_pickup( - cart, dropoff_site + cart, dropoff_site.id ) return Sale.from_sale_order(cart) if cart else None