summaryrefslogtreecommitdiff
path: root/addons/web/static/src/js/views/basic/basic_controller.js
diff options
context:
space:
mode:
authorNicolas Martinelli <nim@odoo.com>2018-11-09 15:22:25 +0000
committerNicolas Martinelli <nim@odoo.com>2018-11-13 08:10:18 +0000
commit22b979533a54f957c69a0495583fc824171e7305 (patch)
treec5a218bc862cf976551283b2953780c677e47bae /addons/web/static/src/js/views/basic/basic_controller.js
parent95ceedb7fae707582b881873f7b3230878e76626 (diff)
[FIX] product: dynamic variant creation
The new product configurator introduces the possibility to create variants dynamically. One of the main goal is to be able to create product templates with **many** attributes and values, but not generate all variants automatically. Only the necessary variants are created on-the-fly. However, it turns out that **many** dynamic attributes and values still fails. For example, create a product with 10 attributes, 10 values for each. This allows 10^10 theoretical combinations; although the variants are not created, the creation of the product template fails. The reason is that the `variant_matrix` contains the list of all combinations, which causes a `MemoryError`. An easy modification to improve the process is to keep an iterator instead of generating the list. This avoids the `MemoryError`, but it remains necessary to go through all combinations three times, which would take too much time. Therefore, some refactoring is necessary in order to keep the same logic, but avoid going through any huge list. Here are the improvements: 1. Skip the creation part if nothing will be created. If any attribute is dynamic, no variant is created. Therefore, we can perform the check upfront and skip the variant creation part if possible. 2. Stop the creation loop as soon as possible. There is an hardcoded limit of maximum 1000 variants to create. We can perform this check along with the list creation instead of checking at the end. 3. Determine if a product has valid attributes in a different way. The existing logic is safe but expensive: we check that all attribute values of a product are part of the possible combinations. This can be simplified by checking if (1) all attribute values of a variant are part of the accepted attribute values of the template and (2) a variant uses all attributes of the template. The second check is mandatory to delete existing variants when an attribute is added to the template. Thanks to these modifications, we at worst go through 1000 possible attribute values combinations. It might still be possible to optimize step 3 with a fancy SQL query which would retrieve all (in)valid products at once. Hopefully this won't be necessary and the optimized logic will be enough. opw-1902392 closes odoo/odoo#28530
Diffstat (limited to 'addons/web/static/src/js/views/basic/basic_controller.js')
0 files changed, 0 insertions, 0 deletions