114 lines
4.9 KiB
Python
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)),
|
|
]
|