product/populate/product_pricelist.py

114 lines
4.9 KiB
Python

# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import models
from odoo.tools import populate
from datetime import timedelta, date
class Pricelist(models.Model):
_inherit = "product.pricelist"
_populate_sizes = {"small": 20, "medium": 100, "large": 1_500}
_populate_dependencies = ["res.company"]
def _populate(self, size):
# Reflect the settings with data created
self.env['res.config.settings'].create({
'group_product_pricelist': True, # Activate pricelist
'group_sale_pricelist': True, # Activate advanced pricelist
}).execute()
return super()._populate(size)
def _populate_factories(self):
company_ids = self.env.registry.populated_models["res.company"]
return [
("company_id", populate.iterate(company_ids + [False for i in range(len(company_ids))])),
("name", populate.constant('product_pricelist_{counter}')),
("currency_id", populate.randomize(self.env["res.currency"].search([("active", "=", True)]).ids)),
("sequence", populate.randomize([False] + [i for i in range(1, 101)])),
("discount_policy", populate.randomize(["with_discount", "without_discount"])),
("active", populate.randomize([True, False], [0.8, 0.2])),
]
class PricelistItem(models.Model):
_inherit = "product.pricelist.item"
_populate_sizes = {"small": 500, "medium": 5_000, "large": 50_000}
_populate_dependencies = ["product.product", "product.template", "product.pricelist"]
def _populate_factories(self):
pricelist_ids = self.env.registry.populated_models["product.pricelist"]
product_ids = self.env.registry.populated_models["product.product"]
p_tmpl_ids = self.env.registry.populated_models["product.template"]
categ_ids = self.env.registry.populated_models["product.category"]
def get_target_info(iterator, field_name, model_name):
random = populate.Random("pricelist_target")
for values in iterator:
# If product population is updated to consider multi company
# the company of product would have to be considered
# for product_id & product_tmpl_id
applied_on = values["applied_on"]
if applied_on == "0_product_variant":
values["product_id"] = random.choice(product_ids)
elif applied_on == "1_product":
values["product_tmpl_id"] = random.choice(p_tmpl_ids)
elif applied_on == "2_product_category":
values["categ_id"] = random.choice(categ_ids)
yield values
def get_prices(iterator, field_name, model_name):
random = populate.Random("pricelist_prices")
for values in iterator:
# Fixed price, percentage, formula
compute_price = values["compute_price"]
if compute_price == "fixed":
# base = "list_price" = default
# fixed_price
values["fixed_price"] = random.randint(1, 1000)
elif compute_price == "percentage":
# base = "list_price" = default
# percent_price
values["percent_price"] = random.randint(1, 100)
else: # formula
# pricelist base not considered atm.
values["base"] = random.choice(["list_price", "standard_price"])
values["price_discount"] = random.randint(0, 100)
# price_min_margin, price_max_margin
# price_round ??? price_discount, price_surcharge
yield values
now = date.today()
def get_date_start(values, counter, random):
if random.random() > 0.5: # 50 % of chance to have validation dates
return now + timedelta(days=random.randint(-20, 20))
else:
False
def get_date_end(values, counter, random):
if values['date_start']: # 50 % of chance to have validation dates
return values['date_start'] + timedelta(days=random.randint(5, 100))
else:
False
return [
("pricelist_id", populate.randomize(pricelist_ids)),
("applied_on", populate.randomize(
["3_global", "2_product_category", "1_product", "0_product_variant"],
[5, 3, 2, 1],
)),
("compute_price", populate.randomize(
["fixed", "percentage", "formula"],
[5, 3, 1],
)),
("_price", get_prices),
("_target", get_target_info),
("min_quantity", populate.randint(0, 50)),
("date_start", populate.compute(get_date_start)),
("date_end", populate.compute(get_date_end)),
]