Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
76 changes: 76 additions & 0 deletions product_alias_multi_link/README.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
===========================
Product Multi Links (Alias)
===========================

..
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:ddf35c12f07cae4e2a5a9e8c9c1f4ded8355d2fd623484f854b033b52ceba29c
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

.. |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-OCA%2Fe--commerce-lightgray.png?logo=github
:target: https://github.com/OCA/e-commerce/tree/18.0/product_alias_multi_link
:alt: OCA/e-commerce
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/e-commerce-18-0/e-commerce-18-0-product_alias_multi_link
: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/e-commerce&target_branch=18.0
:alt: Try me on Runboat

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

Extends product links to support linking products through their aliases.

**Table of contents**

.. contents::
:local:

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

Bugs are tracked on `GitHub Issues <https://github.com/OCA/e-commerce/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/e-commerce/issues/new?body=module:%20product_alias_multi_link%0Aversion:%2018.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.

Credits
=======

Authors
-------

* Akretion

Contributors
------------

- Florian Mounier <florian.mounier@akretion.com>

Maintainers
-----------

This module is maintained by the OCA.

.. image:: https://odoo-community.org/logo.png
:alt: Odoo Community Association
:target: https://odoo-community.org

OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.

This module is part of the `OCA/e-commerce <https://github.com/OCA/e-commerce/tree/18.0/product_alias_multi_link>`_ project on GitHub.

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
1 change: 1 addition & 0 deletions product_alias_multi_link/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from . import models
20 changes: 20 additions & 0 deletions product_alias_multi_link/__manifest__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# Copyright 2025 Akretion (http://www.akretion.com).
# @author Florian Mounier <florian.mounier@akretion.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).

{
"name": "Product Multi Links (Alias)",
"version": "18.0.1.0.0",
"author": "Akretion, Odoo Community Association (OCA)",
"website": "https://github.com/OCA/e-commerce",
"license": "AGPL-3",
"depends": [
# OCA/e-commerce
"product_alias",
"product_variant_multi_link",
],
"data": [
"views/product_template_link_view.xml",
],
"installable": True,
}
2 changes: 2 additions & 0 deletions product_alias_multi_link/models/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
from . import product_alias
from . import product_template_link
28 changes: 28 additions & 0 deletions product_alias_multi_link/models/product_alias.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# Copyright 2025 Akretion (http://www.akretion.com).
# @author Florian Mounier <florian.mounier@akretion.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).

from odoo import fields, models


class ProductAlias(models.Model):
_inherit = "product.alias"

product_alias_link_ids = fields.One2many(
string="Product Alias Links",
comodel_name="product.template.link",
compute="_compute_product_link_ids",
)

def _compute_product_link_ids(self):
for record in self:
record.product_alias_link_ids = record._get_alias_links()

def _get_alias_links(self):
return self.env["product.template.link"].search(
[
"|",
("left_product_alias_id", "=", self.id),
("right_product_alias_id", "=", self.id),
]
)
72 changes: 72 additions & 0 deletions product_alias_multi_link/models/product_template_link.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
# Copyright 2025 Akretion (http://www.akretion.com).
# @author Florian Mounier <florian.mounier@akretion.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).

from odoo import api, fields, models


class ProductTemplateLink(models.Model):
_inherit = "product.template.link"

left_product_alias_id = fields.Many2one(
string="Source Alias",
comodel_name="product.alias",
ondelete="cascade",
)
right_product_alias_id = fields.Many2one(
string="Linked Alias",
comodel_name="product.alias",
ondelete="cascade",
)

def _product_variant_check_enabled(self):
# Do not force alias or variants, do with what you have
return False

@api.constrains(
"left_product_tmpl_id",
"right_product_tmpl_id",
"type_id",
"left_product_id",
"right_product_id",
"left_product_alias_id",
"right_product_alias_id",
)
def _check_products(self):
return super()._check_products()

def _check_product_not_different(self):
res = super()._check_product_not_different()
# Link is identical if everything is the same
return (
res
and self.left_product_id == self.right_product_id
and self.left_product_alias_id == self.right_product_alias_id
)

def _check_products_query_params(self):
params = super()._check_products_query_params()
# Link is identical if everything is the same on both sides
params["main_select_columns"] += (
", right_product_id, left_product_id"
", right_product_alias_id, left_product_alias_id"
)
# Use "is not distinct from" to handle NULL values
params["l2_join_where_clause"] += """
AND right_product_id is not distinct from l1.left_product_id
AND left_product_id is not distinct from l1.right_product_id
AND right_product_alias_id is not distinct from l1.left_product_alias_id
AND left_product_alias_id is not distinct from l1.right_product_alias_id
"""
params["l3_join_where_clause"] += """
AND left_product_id is not distinct from l1.left_product_id
AND right_product_id is not distinct from l1.right_product_id
AND left_product_alias_id is not distinct from l1.left_product_alias_id
AND right_product_alias_id is not distinct from l1.right_product_alias_id
"""
return params

def _invalidate_links(self):
res = super()._invalidate_links()
self.env["product.alias"].invalidate_model(["product_alias_link_ids"])
return res
3 changes: 3 additions & 0 deletions product_alias_multi_link/pyproject.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
[build-system]
requires = ["whool"]
build-backend = "whool.buildapi"
1 change: 1 addition & 0 deletions product_alias_multi_link/readme/CONTRIBUTORS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
- Florian Mounier \<florian.mounier@akretion.com\>
1 change: 1 addition & 0 deletions product_alias_multi_link/readme/DESCRIPTION.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Extends product links to support linking products through their aliases.
Loading
Loading