Skip to content

Commit

Permalink
[MIG] website_sale_coupon_selection_wizard: Migration to version 16.0
Browse files Browse the repository at this point in the history
TT44379
  • Loading branch information
pilarvargas-tecnativa committed Jul 15, 2024
1 parent c389439 commit df6beeb
Show file tree
Hide file tree
Showing 20 changed files with 673 additions and 247 deletions.

This file was deleted.

32 changes: 17 additions & 15 deletions website_sale_loyalty_suggestion_wizard/README.rst
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
===============================
Coupons Selection for eCommerce
===============================
======================================
Website Sale Loyalty Suggestion Wizard
======================================

..
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:94c44400c8e0661ca641d2c4de75be1950d9d1107237aa4189128911a9d1b019
!! source digest: sha256:8c11a0d3f2c9fac24b5e452a5da349a41d86d34df86fa10b103b47acd0babf25
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
Expand All @@ -17,19 +17,20 @@ Coupons Selection for eCommerce
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fsale--promotion-lightgray.png?logo=github
:target: https://github.com/OCA/sale-promotion/tree/15.0/website_sale_coupon_selection_wizard
:target: https://github.com/OCA/sale-promotion/tree/16.0/website_sale_loyalty_suggestion_wizard
:alt: OCA/sale-promotion
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/sale-promotion-15-0/sale-promotion-15-0-website_sale_coupon_selection_wizard
:target: https://translation.odoo-community.org/projects/sale-promotion-16-0/sale-promotion-16-0-website_sale_loyalty_suggestion_wizard
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png
:target: https://runboat.odoo-community.org/builds?repo=OCA/sale-promotion&target_branch=15.0
:target: https://runboat.odoo-community.org/builds?repo=OCA/sale-promotion&target_branch=16.0
:alt: Try me on Runboat

|badge1| |badge2| |badge3| |badge4| |badge5|

This module allows to apply multi-gift mult-criteria promotion with a fancy wizard on
the eCommerce.
This module makes suggestions for promotions whose rules include a product added to the
cart. It also allows you to configure and apply these promotions with an elegant eCommerce
wizard.

**Table of contents**

Expand All @@ -49,22 +50,22 @@ Option 1:

Option 2:

#. Add a product in the promotion criteria.
#. A cart hint will show up.
#. Add a product in the promotion rules.
#. A cart suggestion will appear.
#. Add the promotion and configure the options.

Option 3:

#. Add a promotion code.
#. If the promotion needs to be configured (i.e.: select the present)
#. Select a suggested promotion in the shopping cart from a list of "Suggested promotions".
#. Add the promotion and configure the options.

Bug Tracker
===========

Bugs are tracked on `GitHub Issues <https://github.com/OCA/sale-promotion/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 <https://github.com/OCA/sale-promotion/issues/new?body=module:%20website_sale_coupon_selection_wizard%0Aversion:%2015.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
`feedback <https://github.com/OCA/sale-promotion/issues/new?body=module:%20website_sale_loyalty_suggestion_wizard%0Aversion:%2016.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.

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

Expand All @@ -82,6 +83,7 @@ Contributors
* `Tecnativa <https://www.tecnativa.com>`_:

* David Vidal
* Pilar Vargas

Maintainers
~~~~~~~~~~~
Expand All @@ -104,6 +106,6 @@ Current `maintainer <https://odoo-community.org/page/maintainer-role>`__:

|maintainer-chienandalu|

This module is part of the `OCA/sale-promotion <https://github.com/OCA/sale-promotion/tree/15.0/website_sale_coupon_selection_wizard>`_ project on GitHub.
This module is part of the `OCA/sale-promotion <https://github.com/OCA/sale-promotion/tree/16.0/website_sale_loyalty_suggestion_wizard>`_ project on GitHub.

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
24 changes: 11 additions & 13 deletions website_sale_loyalty_suggestion_wizard/__manifest__.py
Original file line number Diff line number Diff line change
@@ -1,29 +1,27 @@
# Copyright 2021 Tecnativa - David Vidal
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
{
"name": "Coupons Selection for eCommerce",
"summary": "Allows to apply and configure promotions directly from the website",
"version": "15.0.1.0.0",
"name": "Website Sale Loyalty Suggestion Wizard",
"summary": "Suggests promotions and allows you to configure and apply these "
"promotions directly from the website",
"version": "16.0.1.0.0",
"development_status": "Beta",
"category": "eCommerce",
"website": "https://github.com/OCA/sale-promotion",
"author": "Tecnativa, Odoo Community Association (OCA)",
"maintainers": ["chienandalu"],
"license": "AGPL-3",
"depends": [
"sale_coupon_selection_wizard",
"sale_coupon_order_suggestion",
"website_sale_coupon_page",
"sale_loyalty",
"sale_loyalty_order_suggestion",
"website_sale_loyalty_page",
],
"data": ["templates/promotion_templates.xml"],
"data": ["templates/promotion_templates.xml", "templates/wizard_templates.xml"],
"assets": {
"web.assets_frontend": [
"/website_sale_coupon_selection_wizard/static/src/scss/"
"website_sale_coupon_selection.scss",
"/sale_coupon_selection_wizard/static/src/js/"
"coupon_selection_wizard_mixin.js",
"/website_sale_coupon_selection_wizard/static/src/js/"
"website_sale_coupon_selection_wizard.js",
"/website_sale_loyalty_suggestion_wizard/static/src/scss/"
"website_sale_loyalty_suggestion_wizard.scss",
"/website_sale_loyalty_suggestion_wizard/static/src/js/*",
]
},
}
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
from . import coupon_page
from . import promotion_page
from . import main
from . import promotion_wizard
61 changes: 32 additions & 29 deletions website_sale_loyalty_suggestion_wizard/controllers/main.py
Original file line number Diff line number Diff line change
@@ -1,63 +1,66 @@
# Copyright 2021 Tecnativa - David Vidal
# Copyright 2024 Tecnativa - Pilar Vargas
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
from odoo.http import request, route

from odoo.addons.website_sale.controllers.main import WebsiteSale


class WebsiteSaleCouponWizard(WebsiteSale):
class WebsiteSaleLoyaltySuggestionWizard(WebsiteSale):
def _get_sale_loyalty_reward_wizard(self, order, program):
wizard = (

Check warning on line 11 in website_sale_loyalty_suggestion_wizard/controllers/main.py

View check run for this annotation

Codecov / codecov/patch

website_sale_loyalty_suggestion_wizard/controllers/main.py#L11

Added line #L11 was not covered by tests
request.env["sale.loyalty.reward.wizard"]
.with_context(active_id=order.id)
.sudo()
.create({"selected_reward_id": program.reward_ids[:1].id})
)
return wizard

Check warning on line 17 in website_sale_loyalty_suggestion_wizard/controllers/main.py

View check run for this annotation

Codecov / codecov/patch

website_sale_loyalty_suggestion_wizard/controllers/main.py#L17

Added line #L17 was not covered by tests

@route(
["/promotions/<int:program_id>/apply"], type="http", auth="public", website=True
)
def promotion_program_apply(self, program_id, **kwargs):
program = request.env["coupon.program"].sudo().browse(program_id).exists()
program = request.env["loyalty.program"].sudo().browse(program_id).exists()
request.session.pop("wizard_id", None)

Check warning on line 24 in website_sale_loyalty_suggestion_wizard/controllers/main.py

View check run for this annotation

Codecov / codecov/patch

website_sale_loyalty_suggestion_wizard/controllers/main.py#L23-L24

Added lines #L23 - L24 were not covered by tests
if not program or not program.active or not program.is_published:
return
return request.redirect("/shop/cart")

Check warning on line 26 in website_sale_loyalty_suggestion_wizard/controllers/main.py

View check run for this annotation

Codecov / codecov/patch

website_sale_loyalty_suggestion_wizard/controllers/main.py#L26

Added line #L26 was not covered by tests
# Prevent to apply a promotion to a processed order
order = request.website.sale_get_order()

Check warning on line 28 in website_sale_loyalty_suggestion_wizard/controllers/main.py

View check run for this annotation

Codecov / codecov/patch

website_sale_loyalty_suggestion_wizard/controllers/main.py#L28

Added line #L28 was not covered by tests
if order and order.state != "draft":
request.session["sale_order_id"] = None
order = request.website.sale_get_order()

Check warning on line 31 in website_sale_loyalty_suggestion_wizard/controllers/main.py

View check run for this annotation

Codecov / codecov/patch

website_sale_loyalty_suggestion_wizard/controllers/main.py#L30-L31

Added lines #L30 - L31 were not covered by tests
# We won't apply it twice
if program in (order.no_code_promo_program_ids | order.code_promo_program_id):
return
# If the promotion is directly applicable (promotion code), just apply without
# further ado.
if program.promo_code_usage == "code_needed" and (
program not in order.sudo()._available_multi_criteria_multi_gift_programs()
):
return self.pricelist(program.promo_code)
if program in order._get_reward_programs():
return request.redirect("/shop/cart")

Check warning on line 34 in website_sale_loyalty_suggestion_wizard/controllers/main.py

View check run for this annotation

Codecov / codecov/patch

website_sale_loyalty_suggestion_wizard/controllers/main.py#L34

Added line #L34 was not covered by tests
# Let's inject some context into the view
request.session["promotion_id"] = program.id
request.session["order_id"] = order.id
return request.redirect("/shop/cart")

Check warning on line 38 in website_sale_loyalty_suggestion_wizard/controllers/main.py

View check run for this annotation

Codecov / codecov/patch

website_sale_loyalty_suggestion_wizard/controllers/main.py#L36-L38

Added lines #L36 - L38 were not covered by tests

@route()
def pricelist(self, promo, **post):
"""When applying a configurable promotion code, we'll offer the customer
to configure it."""
if promo:
order = request.website.sale_get_order()
program = (
request.env["coupon.program"]
.sudo()
.search([("promo_code", "=", promo)])
)
if program in order.sudo()._available_multi_criteria_multi_gift_programs():
request.session["promotion_id"] = program.id
return request.redirect("/shop/cart")
return super().pricelist(promo)

@route()
def cart(self, **post):
error = request.session.get("error_promo_code")
response = super().cart(**post)
promotion = request.session.get("promotion_id")
order = request.session.get("sale_order_id")

Check warning on line 45 in website_sale_loyalty_suggestion_wizard/controllers/main.py

View check run for this annotation

Codecov / codecov/patch

website_sale_loyalty_suggestion_wizard/controllers/main.py#L42-L45

Added lines #L42 - L45 were not covered by tests
if promotion:
response.qcontext["promotion_id"] = (
request.env["coupon.program"].sudo().browse(promotion)
program_id = request.env["loyalty.program"].sudo().browse(promotion)
order_id = request.env["sale.order"].browse(order)
wizard_id = self._get_sale_loyalty_reward_wizard(order_id, program_id)
mandatory_program_options = (

Check warning on line 50 in website_sale_loyalty_suggestion_wizard/controllers/main.py

View check run for this annotation

Codecov / codecov/patch

website_sale_loyalty_suggestion_wizard/controllers/main.py#L47-L50

Added lines #L47 - L50 were not covered by tests
response.qcontext.get("mandatory_program_options")
or wizard_id.loyalty_rule_line_ids
)
response.qcontext["promotion_id"] = program_id
response.qcontext["order_id"] = order_id
response.qcontext["mandatory_program_options"] = mandatory_program_options

Check warning on line 56 in website_sale_loyalty_suggestion_wizard/controllers/main.py

View check run for this annotation

Codecov / codecov/patch

website_sale_loyalty_suggestion_wizard/controllers/main.py#L54-L56

Added lines #L54 - L56 were not covered by tests
if error:
request.session["error_promo_code"] = error
return response

Check warning on line 59 in website_sale_loyalty_suggestion_wizard/controllers/main.py

View check run for this annotation

Codecov / codecov/patch

website_sale_loyalty_suggestion_wizard/controllers/main.py#L58-L59

Added lines #L58 - L59 were not covered by tests

@route(["/promotions/dismiss"], type="http", auth="public", website=True)
def promotion_in_cart_dismiss(self, **kw):
request.session.pop("promotion_id", None)
request.session.pop("error_promo_code", None)
request.session.pop("wizard_id", None)
return request.redirect("/shop/cart")

Check warning on line 66 in website_sale_loyalty_suggestion_wizard/controllers/main.py

View check run for this annotation

Codecov / codecov/patch

website_sale_loyalty_suggestion_wizard/controllers/main.py#L63-L66

Added lines #L63 - L66 were not covered by tests
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
from odoo.http import request, route

from odoo.addons.website_sale_coupon_page.controllers.main import WebsiteSale
from odoo.addons.website_sale_loyalty_page.controllers.main import WebsiteSale


class CouponPage(WebsiteSale):
class LoyaltyPage(WebsiteSale):
@route()
def promotion(self, **post):
"""Rules to render the 'Apply promotion' button"""
Expand All @@ -16,13 +16,8 @@ def promotion(self, **post):
promo_values = response.qcontext.get("promos", [])
for promo_dict in promo_values:
promo_dict["applicable"] = False
promo = request.env["coupon.program"].sudo().browse(promo_dict["id"])
if (
promo in (order.no_code_promo_program_ids | order.code_promo_program_id)
) or (
promo
not in order.sudo()._available_multi_criteria_multi_gift_programs()
):
promo = request.env["loyalty.program"].sudo().browse(promo_dict["id"])
if promo not in order.sudo()._filter_programs_by_rules_with_products():
continue
promo_dict["applicable"] = True

Check warning on line 22 in website_sale_loyalty_suggestion_wizard/controllers/promotion_page.py

View check run for this annotation

Codecov / codecov/patch

website_sale_loyalty_suggestion_wizard/controllers/promotion_page.py#L22

Added line #L22 was not covered by tests
return response
Original file line number Diff line number Diff line change
@@ -1,42 +1,79 @@
# Copyright 2021 Tecnativa - David Vidal
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
from odoo import _
from odoo.exceptions import ValidationError
from odoo.http import request, route

from odoo.addons.sale_coupon_selection_wizard.controllers.main import (
CouponSelectionWizardController,
)
from odoo.addons.website_sale_loyalty.controllers.main import WebsiteSale


class CouponSelectionWizardController(CouponSelectionWizardController):
class WebsiteSaleLoyaltySuggestionWizardController(WebsiteSale):
def _process_promotion_lines(self, wizard_id, promotion_lines):
for product, qty in promotion_lines.items():
line = wizard_id.loyalty_rule_line_ids.filtered(
lambda x: x.product_id.id == int(product)
)
if len(promotion_lines) == 1:
qty = line.units_required - line.units_included

Check warning on line 16 in website_sale_loyalty_suggestion_wizard/controllers/promotion_wizard.py

View check run for this annotation

Codecov / codecov/patch

website_sale_loyalty_suggestion_wizard/controllers/promotion_wizard.py#L16

Added line #L16 was not covered by tests
if not qty:
continue
line.units_to_include = qty

Check warning on line 19 in website_sale_loyalty_suggestion_wizard/controllers/promotion_wizard.py

View check run for this annotation

Codecov / codecov/patch

website_sale_loyalty_suggestion_wizard/controllers/promotion_wizard.py#L18-L19

Added lines #L18 - L19 were not covered by tests

def _process_reward_line_options(self, wizard_id, reward_line_options):
reward_id = wizard_id.selected_reward_id

Check warning on line 22 in website_sale_loyalty_suggestion_wizard/controllers/promotion_wizard.py

View check run for this annotation

Codecov / codecov/patch

website_sale_loyalty_suggestion_wizard/controllers/promotion_wizard.py#L22

Added line #L22 was not covered by tests
if reward_id.reward_type == "product":
reward_products = reward_id.reward_product_ids

Check warning on line 24 in website_sale_loyalty_suggestion_wizard/controllers/promotion_wizard.py

View check run for this annotation

Codecov / codecov/patch

website_sale_loyalty_suggestion_wizard/controllers/promotion_wizard.py#L24

Added line #L24 was not covered by tests
if len(reward_products) == 1:
wizard_id.selected_product_id = reward_products.id

Check warning on line 26 in website_sale_loyalty_suggestion_wizard/controllers/promotion_wizard.py

View check run for this annotation

Codecov / codecov/patch

website_sale_loyalty_suggestion_wizard/controllers/promotion_wizard.py#L26

Added line #L26 was not covered by tests
else:
wizard_id.selected_product_id = (

Check warning on line 28 in website_sale_loyalty_suggestion_wizard/controllers/promotion_wizard.py

View check run for this annotation

Codecov / codecov/patch

website_sale_loyalty_suggestion_wizard/controllers/promotion_wizard.py#L28

Added line #L28 was not covered by tests
int(reward_line_options.get("selected_product_ids", False)[0])
or wizard_id.selected_product_id.id
)

@route(
"/website_sale_loyalty_suggestion_wizard/get_defaults",
type="json",
auth="public",
methods=["POST"],
)
def get_default_products(self):
program_id = (

Check warning on line 40 in website_sale_loyalty_suggestion_wizard/controllers/promotion_wizard.py

View check run for this annotation

Codecov / codecov/patch

website_sale_loyalty_suggestion_wizard/controllers/promotion_wizard.py#L40

Added line #L40 was not covered by tests
request.env["loyalty.program"]
.sudo()
.browse(request.session.get("promotion_id"))
)
order_id = request.env["sale.order"].browse(

Check warning on line 45 in website_sale_loyalty_suggestion_wizard/controllers/promotion_wizard.py

View check run for this annotation

Codecov / codecov/patch

website_sale_loyalty_suggestion_wizard/controllers/promotion_wizard.py#L45

Added line #L45 was not covered by tests
request.session.get("sale_order_id")
)
wiz = self._get_sale_loyalty_reward_wizard(order_id, program_id)
return wiz.selected_product_id.ids

Check warning on line 49 in website_sale_loyalty_suggestion_wizard/controllers/promotion_wizard.py

View check run for this annotation

Codecov / codecov/patch

website_sale_loyalty_suggestion_wizard/controllers/promotion_wizard.py#L48-L49

Added lines #L48 - L49 were not covered by tests

@route(
"/website_sale_coupon_selection_wizard/apply",
"/website_sale_loyalty_suggestion_wizard/apply",
type="json",
auth="public",
methods=["POST"],
)
def apply_promotion_public(
self, program_id, sale_order_id, promotion_lines, reward_line_options, **kw
self, program_id, promotion_lines, reward_line_options, **kw
):
"""Frontend controller that wraps common methods and handles errors properly"""
error, sale_form, program = self._try_to_apply_promotion(
program_id, sale_order_id, promotion_lines, reward_line_options, **kw
order_id = request.env["sale.order"].browse(

Check warning on line 61 in website_sale_loyalty_suggestion_wizard/controllers/promotion_wizard.py

View check run for this annotation

Codecov / codecov/patch

website_sale_loyalty_suggestion_wizard/controllers/promotion_wizard.py#L61

Added line #L61 was not covered by tests
request.session.get("sale_order_id")
)
if error:
request.session["error_promo_code"] = error
program_id = request.env["loyalty.program"].sudo().browse(program_id)
wiz = self._get_sale_loyalty_reward_wizard(order_id, program_id)
reward_id = reward_line_options.get("reward_id", False)
wiz.selected_reward_id = int(reward_id) or (

Check warning on line 67 in website_sale_loyalty_suggestion_wizard/controllers/promotion_wizard.py

View check run for this annotation

Codecov / codecov/patch

website_sale_loyalty_suggestion_wizard/controllers/promotion_wizard.py#L64-L67

Added lines #L64 - L67 were not covered by tests
program_id.reward_ids.id if len(program_id.reward_ids) == 1 else False
)
if wiz.selected_reward_id:
self._process_promotion_lines(wiz, promotion_lines)
self._process_reward_line_options(wiz, reward_line_options)
try:
wiz.action_apply()
except ValidationError as e:
request.session["error_promo_code"] = str(e)
return
# Once checked write the new lines and force the code if the promo has one
order = sale_form.save()
promo_applied = self._apply_promotion(order, program, reward_line_options)
if not promo_applied:
request.session["error_promo_code"] = _(
"This promotion can't be applied to this order"
)
request.session.pop("promotion_id", None)
request.session.pop("error_promo_code", None)

Check warning on line 79 in website_sale_loyalty_suggestion_wizard/controllers/promotion_wizard.py

View check run for this annotation

Codecov / codecov/patch

website_sale_loyalty_suggestion_wizard/controllers/promotion_wizard.py#L71-L79

Added lines #L71 - L79 were not covered by tests

@route(website=True)
def configure_promotion(self, program_id, **kw):
if not self._get_order(kw.get("sale_order_id")):
kw["sale_order_id"] = request.website.sale_get_order(force_create=True)
return super().configure_promotion(program_id, **kw)
Loading

0 comments on commit df6beeb

Please sign in to comment.