Initial import from Docker volume

This commit is contained in:
root
2025-12-26 13:11:43 +00:00
commit 4998dc066a
13336 changed files with 1767801 additions and 0 deletions

View File

@@ -0,0 +1,17 @@
# This file is part of Tryton. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.
from trytond.pool import Pool
from . import ir, product
__all__ = ['register']
def register():
Pool.register(
ir.Cron,
product.Product,
product.PriceList,
product.PriceListCache,
module='product_price_list_cache', type_='model')

View File

@@ -0,0 +1,14 @@
# This file is part of Tryton. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.
from trytond.pool import PoolMeta
class Cron(metaclass=PoolMeta):
__name__ = 'ir.cron'
@classmethod
def __setup__(cls):
super().__setup__()
cls.method.selection.append(
('product.price_list|fill_cache', "Fill Product Price List Cache"))

View File

@@ -0,0 +1,39 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:product.price_list.cache,pattern:"
msgid "Pattern"
msgstr ""
msgctxt "field:product.price_list.cache,price_list:"
msgid "Price List"
msgstr ""
msgctxt "field:product.price_list.cache,product:"
msgid "Product"
msgstr ""
msgctxt "field:product.price_list.cache,raw_unit_prices:"
msgid "Unit Prices"
msgstr ""
msgctxt "field:product.price_list.cache,uom:"
msgid "UoM"
msgstr ""
msgctxt "field:product.product,cached_price_lists:"
msgid "Cached Price Lists"
msgstr ""
msgctxt "help:product.price_list.cache,uom:"
msgid "The Unit of Measure."
msgstr ""
msgctxt "model:product.price_list.cache,name:"
msgid "Price List Cache"
msgstr ""
msgctxt "selection:ir.cron,method:"
msgid "Fill Product Price List Cache"
msgstr ""

View File

@@ -0,0 +1,40 @@
#
#, fuzzy
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:product.price_list.cache,pattern:"
msgid "Pattern"
msgstr "Patró"
msgctxt "field:product.price_list.cache,price_list:"
msgid "Price List"
msgstr "Tarifa"
msgctxt "field:product.price_list.cache,product:"
msgid "Product"
msgstr "Producte"
msgctxt "field:product.price_list.cache,raw_unit_prices:"
msgid "Unit Prices"
msgstr "Preus unitaris"
msgctxt "field:product.price_list.cache,uom:"
msgid "UoM"
msgstr "UdM"
msgctxt "field:product.product,cached_price_lists:"
msgid "Cached Price Lists"
msgstr "Tarifes en cache"
msgctxt "help:product.price_list.cache,uom:"
msgid "The Unit of Measure."
msgstr "La unitat de mesura."
msgctxt "model:product.price_list.cache,name:"
msgid "Price List Cache"
msgstr "Cache de tarifes"
msgctxt "selection:ir.cron,method:"
msgid "Fill Product Price List Cache"
msgstr "Actualitza la cache de tarifes"

View File

@@ -0,0 +1,39 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:product.price_list.cache,pattern:"
msgid "Pattern"
msgstr ""
msgctxt "field:product.price_list.cache,price_list:"
msgid "Price List"
msgstr ""
msgctxt "field:product.price_list.cache,product:"
msgid "Product"
msgstr ""
msgctxt "field:product.price_list.cache,raw_unit_prices:"
msgid "Unit Prices"
msgstr ""
msgctxt "field:product.price_list.cache,uom:"
msgid "UoM"
msgstr ""
msgctxt "field:product.product,cached_price_lists:"
msgid "Cached Price Lists"
msgstr ""
msgctxt "help:product.price_list.cache,uom:"
msgid "The Unit of Measure."
msgstr ""
msgctxt "model:product.price_list.cache,name:"
msgid "Price List Cache"
msgstr ""
msgctxt "selection:ir.cron,method:"
msgid "Fill Product Price List Cache"
msgstr ""

View File

@@ -0,0 +1,39 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:product.price_list.cache,pattern:"
msgid "Pattern"
msgstr "Schema"
msgctxt "field:product.price_list.cache,price_list:"
msgid "Price List"
msgstr "Preisliste"
msgctxt "field:product.price_list.cache,product:"
msgid "Product"
msgstr "Artikel"
msgctxt "field:product.price_list.cache,raw_unit_prices:"
msgid "Unit Prices"
msgstr "Einzelpreise"
msgctxt "field:product.price_list.cache,uom:"
msgid "UoM"
msgstr "Maßeinheit"
msgctxt "field:product.product,cached_price_lists:"
msgid "Cached Price Lists"
msgstr "Preislisten Cache"
msgctxt "help:product.price_list.cache,uom:"
msgid "The Unit of Measure."
msgstr "Die Maßeinheit."
msgctxt "model:product.price_list.cache,name:"
msgid "Price List Cache"
msgstr "Preisliste Cache"
msgctxt "selection:ir.cron,method:"
msgid "Fill Product Price List Cache"
msgstr "Artikel Preislisten Cache aktualisieren"

View File

@@ -0,0 +1,40 @@
#
#, fuzzy
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:product.price_list.cache,pattern:"
msgid "Pattern"
msgstr "Patrón"
msgctxt "field:product.price_list.cache,price_list:"
msgid "Price List"
msgstr "Tarifa"
msgctxt "field:product.price_list.cache,product:"
msgid "Product"
msgstr "Producto"
msgctxt "field:product.price_list.cache,raw_unit_prices:"
msgid "Unit Prices"
msgstr "Precios unitarios"
msgctxt "field:product.price_list.cache,uom:"
msgid "UoM"
msgstr "UdM"
msgctxt "field:product.product,cached_price_lists:"
msgid "Cached Price Lists"
msgstr "Tarifas en cache"
msgctxt "help:product.price_list.cache,uom:"
msgid "The Unit of Measure."
msgstr "La unidad de medida."
msgctxt "model:product.price_list.cache,name:"
msgid "Price List Cache"
msgstr "Cache de tarifas"
msgctxt "selection:ir.cron,method:"
msgid "Fill Product Price List Cache"
msgstr "Actualizar la cache de tarifas"

View File

@@ -0,0 +1,39 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:product.price_list.cache,pattern:"
msgid "Pattern"
msgstr ""
msgctxt "field:product.price_list.cache,price_list:"
msgid "Price List"
msgstr ""
msgctxt "field:product.price_list.cache,product:"
msgid "Product"
msgstr ""
msgctxt "field:product.price_list.cache,raw_unit_prices:"
msgid "Unit Prices"
msgstr ""
msgctxt "field:product.price_list.cache,uom:"
msgid "UoM"
msgstr ""
msgctxt "field:product.product,cached_price_lists:"
msgid "Cached Price Lists"
msgstr ""
msgctxt "help:product.price_list.cache,uom:"
msgid "The Unit of Measure."
msgstr ""
msgctxt "model:product.price_list.cache,name:"
msgid "Price List Cache"
msgstr ""
msgctxt "selection:ir.cron,method:"
msgid "Fill Product Price List Cache"
msgstr ""

View File

@@ -0,0 +1,39 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:product.price_list.cache,pattern:"
msgid "Pattern"
msgstr ""
msgctxt "field:product.price_list.cache,price_list:"
msgid "Price List"
msgstr ""
msgctxt "field:product.price_list.cache,product:"
msgid "Product"
msgstr ""
msgctxt "field:product.price_list.cache,raw_unit_prices:"
msgid "Unit Prices"
msgstr ""
msgctxt "field:product.price_list.cache,uom:"
msgid "UoM"
msgstr ""
msgctxt "field:product.product,cached_price_lists:"
msgid "Cached Price Lists"
msgstr ""
msgctxt "help:product.price_list.cache,uom:"
msgid "The Unit of Measure."
msgstr ""
msgctxt "model:product.price_list.cache,name:"
msgid "Price List Cache"
msgstr ""
msgctxt "selection:ir.cron,method:"
msgid "Fill Product Price List Cache"
msgstr ""

View File

@@ -0,0 +1,39 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:product.price_list.cache,pattern:"
msgid "Pattern"
msgstr ""
msgctxt "field:product.price_list.cache,price_list:"
msgid "Price List"
msgstr ""
msgctxt "field:product.price_list.cache,product:"
msgid "Product"
msgstr ""
msgctxt "field:product.price_list.cache,raw_unit_prices:"
msgid "Unit Prices"
msgstr ""
msgctxt "field:product.price_list.cache,uom:"
msgid "UoM"
msgstr ""
msgctxt "field:product.product,cached_price_lists:"
msgid "Cached Price Lists"
msgstr ""
msgctxt "help:product.price_list.cache,uom:"
msgid "The Unit of Measure."
msgstr ""
msgctxt "model:product.price_list.cache,name:"
msgid "Price List Cache"
msgstr ""
msgctxt "selection:ir.cron,method:"
msgid "Fill Product Price List Cache"
msgstr ""

View File

@@ -0,0 +1,39 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:product.price_list.cache,pattern:"
msgid "Pattern"
msgstr ""
msgctxt "field:product.price_list.cache,price_list:"
msgid "Price List"
msgstr ""
msgctxt "field:product.price_list.cache,product:"
msgid "Product"
msgstr ""
msgctxt "field:product.price_list.cache,raw_unit_prices:"
msgid "Unit Prices"
msgstr ""
msgctxt "field:product.price_list.cache,uom:"
msgid "UoM"
msgstr ""
msgctxt "field:product.product,cached_price_lists:"
msgid "Cached Price Lists"
msgstr ""
msgctxt "help:product.price_list.cache,uom:"
msgid "The Unit of Measure."
msgstr ""
msgctxt "model:product.price_list.cache,name:"
msgid "Price List Cache"
msgstr ""
msgctxt "selection:ir.cron,method:"
msgid "Fill Product Price List Cache"
msgstr ""

View File

@@ -0,0 +1,40 @@
#
#, fuzzy
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:product.price_list.cache,pattern:"
msgid "Pattern"
msgstr "Motif"
msgctxt "field:product.price_list.cache,price_list:"
msgid "Price List"
msgstr "Liste de prix"
msgctxt "field:product.price_list.cache,product:"
msgid "Product"
msgstr "Produit"
msgctxt "field:product.price_list.cache,raw_unit_prices:"
msgid "Unit Prices"
msgstr "Prix unitaires"
msgctxt "field:product.price_list.cache,uom:"
msgid "UoM"
msgstr "UDM"
msgctxt "field:product.product,cached_price_lists:"
msgid "Cached Price Lists"
msgstr "Listes de prix mises en cache"
msgctxt "help:product.price_list.cache,uom:"
msgid "The Unit of Measure."
msgstr "L'unité de mesure."
msgctxt "model:product.price_list.cache,name:"
msgid "Price List Cache"
msgstr "Cache de liste de prix"
msgctxt "selection:ir.cron,method:"
msgid "Fill Product Price List Cache"
msgstr "Remplir le cache des listes de prix des produits"

View File

@@ -0,0 +1,39 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:product.price_list.cache,pattern:"
msgid "Pattern"
msgstr ""
msgctxt "field:product.price_list.cache,price_list:"
msgid "Price List"
msgstr ""
msgctxt "field:product.price_list.cache,product:"
msgid "Product"
msgstr ""
msgctxt "field:product.price_list.cache,raw_unit_prices:"
msgid "Unit Prices"
msgstr ""
msgctxt "field:product.price_list.cache,uom:"
msgid "UoM"
msgstr ""
msgctxt "field:product.product,cached_price_lists:"
msgid "Cached Price Lists"
msgstr ""
msgctxt "help:product.price_list.cache,uom:"
msgid "The Unit of Measure."
msgstr ""
msgctxt "model:product.price_list.cache,name:"
msgid "Price List Cache"
msgstr ""
msgctxt "selection:ir.cron,method:"
msgid "Fill Product Price List Cache"
msgstr ""

View File

@@ -0,0 +1,39 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:product.price_list.cache,pattern:"
msgid "Pattern"
msgstr ""
msgctxt "field:product.price_list.cache,price_list:"
msgid "Price List"
msgstr ""
msgctxt "field:product.price_list.cache,product:"
msgid "Product"
msgstr ""
msgctxt "field:product.price_list.cache,raw_unit_prices:"
msgid "Unit Prices"
msgstr ""
msgctxt "field:product.price_list.cache,uom:"
msgid "UoM"
msgstr ""
msgctxt "field:product.product,cached_price_lists:"
msgid "Cached Price Lists"
msgstr ""
msgctxt "help:product.price_list.cache,uom:"
msgid "The Unit of Measure."
msgstr ""
msgctxt "model:product.price_list.cache,name:"
msgid "Price List Cache"
msgstr ""
msgctxt "selection:ir.cron,method:"
msgid "Fill Product Price List Cache"
msgstr ""

View File

@@ -0,0 +1,39 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:product.price_list.cache,pattern:"
msgid "Pattern"
msgstr ""
msgctxt "field:product.price_list.cache,price_list:"
msgid "Price List"
msgstr ""
msgctxt "field:product.price_list.cache,product:"
msgid "Product"
msgstr ""
msgctxt "field:product.price_list.cache,raw_unit_prices:"
msgid "Unit Prices"
msgstr ""
msgctxt "field:product.price_list.cache,uom:"
msgid "UoM"
msgstr ""
msgctxt "field:product.product,cached_price_lists:"
msgid "Cached Price Lists"
msgstr ""
msgctxt "help:product.price_list.cache,uom:"
msgid "The Unit of Measure."
msgstr ""
msgctxt "model:product.price_list.cache,name:"
msgid "Price List Cache"
msgstr ""
msgctxt "selection:ir.cron,method:"
msgid "Fill Product Price List Cache"
msgstr ""

View File

@@ -0,0 +1,39 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:product.price_list.cache,pattern:"
msgid "Pattern"
msgstr ""
msgctxt "field:product.price_list.cache,price_list:"
msgid "Price List"
msgstr ""
msgctxt "field:product.price_list.cache,product:"
msgid "Product"
msgstr ""
msgctxt "field:product.price_list.cache,raw_unit_prices:"
msgid "Unit Prices"
msgstr ""
msgctxt "field:product.price_list.cache,uom:"
msgid "UoM"
msgstr ""
msgctxt "field:product.product,cached_price_lists:"
msgid "Cached Price Lists"
msgstr ""
msgctxt "help:product.price_list.cache,uom:"
msgid "The Unit of Measure."
msgstr ""
msgctxt "model:product.price_list.cache,name:"
msgid "Price List Cache"
msgstr ""
msgctxt "selection:ir.cron,method:"
msgid "Fill Product Price List Cache"
msgstr ""

View File

@@ -0,0 +1,39 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:product.price_list.cache,pattern:"
msgid "Pattern"
msgstr ""
msgctxt "field:product.price_list.cache,price_list:"
msgid "Price List"
msgstr ""
msgctxt "field:product.price_list.cache,product:"
msgid "Product"
msgstr ""
msgctxt "field:product.price_list.cache,raw_unit_prices:"
msgid "Unit Prices"
msgstr ""
msgctxt "field:product.price_list.cache,uom:"
msgid "UoM"
msgstr ""
msgctxt "field:product.product,cached_price_lists:"
msgid "Cached Price Lists"
msgstr ""
msgctxt "help:product.price_list.cache,uom:"
msgid "The Unit of Measure."
msgstr ""
msgctxt "model:product.price_list.cache,name:"
msgid "Price List Cache"
msgstr ""
msgctxt "selection:ir.cron,method:"
msgid "Fill Product Price List Cache"
msgstr ""

View File

@@ -0,0 +1,40 @@
#
#, fuzzy
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:product.price_list.cache,pattern:"
msgid "Pattern"
msgstr "Patroon"
msgctxt "field:product.price_list.cache,price_list:"
msgid "Price List"
msgstr "Prijslijst"
msgctxt "field:product.price_list.cache,product:"
msgid "Product"
msgstr "Product"
msgctxt "field:product.price_list.cache,raw_unit_prices:"
msgid "Unit Prices"
msgstr "Eenheidsprijzen"
msgctxt "field:product.price_list.cache,uom:"
msgid "UoM"
msgstr "Maateenheid"
msgctxt "field:product.product,cached_price_lists:"
msgid "Cached Price Lists"
msgstr "In cache opgeslagen prijslijsten"
msgctxt "help:product.price_list.cache,uom:"
msgid "The Unit of Measure."
msgstr "De maateenheid."
msgctxt "model:product.price_list.cache,name:"
msgid "Price List Cache"
msgstr "Prijslijstcache"
msgctxt "selection:ir.cron,method:"
msgid "Fill Product Price List Cache"
msgstr "Vul de cache van de product prijslijst"

View File

@@ -0,0 +1,39 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:product.price_list.cache,pattern:"
msgid "Pattern"
msgstr ""
msgctxt "field:product.price_list.cache,price_list:"
msgid "Price List"
msgstr ""
msgctxt "field:product.price_list.cache,product:"
msgid "Product"
msgstr ""
msgctxt "field:product.price_list.cache,raw_unit_prices:"
msgid "Unit Prices"
msgstr ""
msgctxt "field:product.price_list.cache,uom:"
msgid "UoM"
msgstr ""
msgctxt "field:product.product,cached_price_lists:"
msgid "Cached Price Lists"
msgstr ""
msgctxt "help:product.price_list.cache,uom:"
msgid "The Unit of Measure."
msgstr ""
msgctxt "model:product.price_list.cache,name:"
msgid "Price List Cache"
msgstr ""
msgctxt "selection:ir.cron,method:"
msgid "Fill Product Price List Cache"
msgstr ""

View File

@@ -0,0 +1,39 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:product.price_list.cache,pattern:"
msgid "Pattern"
msgstr ""
msgctxt "field:product.price_list.cache,price_list:"
msgid "Price List"
msgstr ""
msgctxt "field:product.price_list.cache,product:"
msgid "Product"
msgstr ""
msgctxt "field:product.price_list.cache,raw_unit_prices:"
msgid "Unit Prices"
msgstr ""
msgctxt "field:product.price_list.cache,uom:"
msgid "UoM"
msgstr ""
msgctxt "field:product.product,cached_price_lists:"
msgid "Cached Price Lists"
msgstr ""
msgctxt "help:product.price_list.cache,uom:"
msgid "The Unit of Measure."
msgstr ""
msgctxt "model:product.price_list.cache,name:"
msgid "Price List Cache"
msgstr ""
msgctxt "selection:ir.cron,method:"
msgid "Fill Product Price List Cache"
msgstr ""

View File

@@ -0,0 +1,39 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:product.price_list.cache,pattern:"
msgid "Pattern"
msgstr ""
msgctxt "field:product.price_list.cache,price_list:"
msgid "Price List"
msgstr ""
msgctxt "field:product.price_list.cache,product:"
msgid "Product"
msgstr ""
msgctxt "field:product.price_list.cache,raw_unit_prices:"
msgid "Unit Prices"
msgstr ""
msgctxt "field:product.price_list.cache,uom:"
msgid "UoM"
msgstr ""
msgctxt "field:product.product,cached_price_lists:"
msgid "Cached Price Lists"
msgstr ""
msgctxt "help:product.price_list.cache,uom:"
msgid "The Unit of Measure."
msgstr ""
msgctxt "model:product.price_list.cache,name:"
msgid "Price List Cache"
msgstr ""
msgctxt "selection:ir.cron,method:"
msgid "Fill Product Price List Cache"
msgstr ""

View File

@@ -0,0 +1,39 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:product.price_list.cache,pattern:"
msgid "Pattern"
msgstr ""
msgctxt "field:product.price_list.cache,price_list:"
msgid "Price List"
msgstr ""
msgctxt "field:product.price_list.cache,product:"
msgid "Product"
msgstr ""
msgctxt "field:product.price_list.cache,raw_unit_prices:"
msgid "Unit Prices"
msgstr ""
msgctxt "field:product.price_list.cache,uom:"
msgid "UoM"
msgstr ""
msgctxt "field:product.product,cached_price_lists:"
msgid "Cached Price Lists"
msgstr ""
msgctxt "help:product.price_list.cache,uom:"
msgid "The Unit of Measure."
msgstr ""
msgctxt "model:product.price_list.cache,name:"
msgid "Price List Cache"
msgstr ""
msgctxt "selection:ir.cron,method:"
msgid "Fill Product Price List Cache"
msgstr ""

View File

@@ -0,0 +1,39 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:product.price_list.cache,pattern:"
msgid "Pattern"
msgstr ""
msgctxt "field:product.price_list.cache,price_list:"
msgid "Price List"
msgstr ""
msgctxt "field:product.price_list.cache,product:"
msgid "Product"
msgstr ""
msgctxt "field:product.price_list.cache,raw_unit_prices:"
msgid "Unit Prices"
msgstr ""
msgctxt "field:product.price_list.cache,uom:"
msgid "UoM"
msgstr ""
msgctxt "field:product.product,cached_price_lists:"
msgid "Cached Price Lists"
msgstr ""
msgctxt "help:product.price_list.cache,uom:"
msgid "The Unit of Measure."
msgstr ""
msgctxt "model:product.price_list.cache,name:"
msgid "Price List Cache"
msgstr ""
msgctxt "selection:ir.cron,method:"
msgid "Fill Product Price List Cache"
msgstr ""

View File

@@ -0,0 +1,39 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:product.price_list.cache,pattern:"
msgid "Pattern"
msgstr ""
msgctxt "field:product.price_list.cache,price_list:"
msgid "Price List"
msgstr ""
msgctxt "field:product.price_list.cache,product:"
msgid "Product"
msgstr ""
msgctxt "field:product.price_list.cache,raw_unit_prices:"
msgid "Unit Prices"
msgstr ""
msgctxt "field:product.price_list.cache,uom:"
msgid "UoM"
msgstr ""
msgctxt "field:product.product,cached_price_lists:"
msgid "Cached Price Lists"
msgstr ""
msgctxt "help:product.price_list.cache,uom:"
msgid "The Unit of Measure."
msgstr ""
msgctxt "model:product.price_list.cache,name:"
msgid "Price List Cache"
msgstr ""
msgctxt "selection:ir.cron,method:"
msgid "Fill Product Price List Cache"
msgstr ""

View File

@@ -0,0 +1,39 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:product.price_list.cache,pattern:"
msgid "Pattern"
msgstr ""
msgctxt "field:product.price_list.cache,price_list:"
msgid "Price List"
msgstr ""
msgctxt "field:product.price_list.cache,product:"
msgid "Product"
msgstr ""
msgctxt "field:product.price_list.cache,raw_unit_prices:"
msgid "Unit Prices"
msgstr ""
msgctxt "field:product.price_list.cache,uom:"
msgid "UoM"
msgstr ""
msgctxt "field:product.product,cached_price_lists:"
msgid "Cached Price Lists"
msgstr ""
msgctxt "help:product.price_list.cache,uom:"
msgid "The Unit of Measure."
msgstr ""
msgctxt "model:product.price_list.cache,name:"
msgid "Price List Cache"
msgstr ""
msgctxt "selection:ir.cron,method:"
msgid "Fill Product Price List Cache"
msgstr ""

View File

@@ -0,0 +1,39 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:product.price_list.cache,pattern:"
msgid "Pattern"
msgstr ""
msgctxt "field:product.price_list.cache,price_list:"
msgid "Price List"
msgstr ""
msgctxt "field:product.price_list.cache,product:"
msgid "Product"
msgstr ""
msgctxt "field:product.price_list.cache,raw_unit_prices:"
msgid "Unit Prices"
msgstr ""
msgctxt "field:product.price_list.cache,uom:"
msgid "UoM"
msgstr ""
msgctxt "field:product.product,cached_price_lists:"
msgid "Cached Price Lists"
msgstr ""
msgctxt "help:product.price_list.cache,uom:"
msgid "The Unit of Measure."
msgstr ""
msgctxt "model:product.price_list.cache,name:"
msgid "Price List Cache"
msgstr ""
msgctxt "selection:ir.cron,method:"
msgid "Fill Product Price List Cache"
msgstr ""

View File

@@ -0,0 +1,196 @@
# This file is part of Tryton. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.
import json
from functools import partial
from sql import Null
from trytond.cache import Cache, freeze
from trytond.model import ModelSQL, dualmethod, fields
from trytond.pool import Pool, PoolMeta
from trytond.protocols.jsonrpc import JSONDecoder, JSONEncoder
from trytond.tools import grouped_slice, reduce_ids
from trytond.transaction import Transaction
dumps = partial(
json.dumps, cls=JSONEncoder, separators=(',', ':'), sort_keys=True,
ensure_ascii=False)
loads = partial(json.loads, object_hook=JSONDecoder())
class Product(metaclass=PoolMeta):
__name__ = 'product.product'
cached_price_lists = fields.One2Many(
'product.price_list.cache', 'product',
"Cached Price Lists", readonly=True)
class PriceList(metaclass=PoolMeta):
__name__ = 'product.price_list'
@dualmethod
def fill_cache(cls, price_lists=None, products=None):
pool = Pool()
Product = pool.get('product.product')
Line = pool.get('product.price_list.line')
Cache = pool.get('product.price_list.cache')
line = Line.__table__()
cursor = Transaction().connection.cursor()
Cache.clear(price_lists=price_lists, products=products)
if price_lists is None:
price_lists = cls.search([])
if products is None:
products = Product.search([])
cursor.execute(*line.select(
line.quantity, distinct=True,
where=line.quantity != Null))
quantities = sorted({0} | {q for q, in cursor})
for price_list in price_lists:
caches = []
with Transaction().set_context(Cache.context(price_list)):
for product in Product.browse(products):
uom = price_list.get_uom(product)
for pattern in Cache.patterns(price_list, product):
unit_prices = []
for quantity in quantities:
unit_price = price_list.compute(
product, quantity, uom, pattern=pattern)
if (unit_prices
and unit_prices[-1][1] == unit_price):
continue
else:
unit_prices.append((quantity, unit_price))
caches.append(Cache(
price_list=price_list,
product=product,
uom=uom,
raw_unit_prices=dumps(unit_prices),
pattern=pattern))
Cache.save(caches)
def compute(self, product, quantity, uom, pattern=None):
pool = Pool()
Cache = pool.get('product.price_list.cache')
cache = Cache.get(self, product, pattern=pattern)
unit_price = None
if cache:
unit_price = cache.get_unit_price(quantity, uom)
if unit_price is None:
unit_price = super().compute(
product, quantity, uom, pattern=pattern)
return unit_price
class PriceListCache(ModelSQL):
"Price List Cache"
__name__ = 'product.price_list.cache'
price_list = fields.Many2One(
'product.price_list', "Price List", required=True, ondelete='CASCADE')
product = fields.Many2One(
'product.product', "Product", required=True, ondelete='CASCADE')
uom = fields.Many2One(
'product.uom', "UoM", required=True, ondelete='CASCADE',
help="The Unit of Measure.")
raw_unit_prices = fields.Char("Unit Prices")
pattern = fields.Dict(None, "Pattern")
_get_cache = Cache('product.price_list.cache.get', context=False)
_unit_prices_cache = Cache(
'product.price_list.cache.unit_prices', context=False)
@classmethod
def context(cls, price_list):
return {
'company': price_list.company.id,
}
@classmethod
def patterns(cls, price_list, product):
yield None
@property
def unit_prices(self):
unit_prices = self._unit_prices_cache.get(self.raw_unit_prices)
if unit_prices is None:
unit_prices = loads(self.raw_unit_prices)
self._unit_prices_cache.set(self.raw_unit_prices, unit_prices)
return unit_prices
@classmethod
def get(cls, price_list, product, pattern=None):
if not price_list or not product:
return
if not pattern:
pattern = None
key = (price_list.id, product.id, freeze(pattern))
try:
cache_id, uom, raw_unit_prices = cls._get_cache.get(key)
except TypeError:
for cache in product.cached_price_lists:
if (cache.price_list == price_list
and cache.pattern == pattern):
cls._get_cache.set(
key, (cache.id, cache.uom.id, cache.raw_unit_prices))
return cache
else:
return cls(cache_id, uom=uom, raw_unit_prices=raw_unit_prices)
def get_unit_price(self, quantity, uom):
pool = Pool()
UoM = pool.get('product.uom')
quantity = UoM.compute_qty(uom, quantity, self.uom)
quantity = abs(quantity)
unit_price = None
for qty, cur_unit_price in self.unit_prices:
if qty > quantity:
return unit_price
unit_price = cur_unit_price
return unit_price
@classmethod
def clear(cls, price_lists=None, products=None):
cache = cls.__table__()
cursor = Transaction().connection.cursor()
cls._get_cache.clear()
if price_lists is None and products is None:
cursor.execute(*cache.delete())
elif price_lists and products is None:
for sub_price_lists in grouped_slice(price_lists):
cursor.execute(*cache.delete(where=reduce_ids(
cache.price_list, [
p.id for p in sub_price_lists])))
elif price_lists is None and products:
for sub_products in grouped_slice(products):
cursor.execute(*cache.delete(where=reduce_ids(
cache.product, [p.id for p in sub_products])))
else:
for sub_products in grouped_slice(products):
for sub_price_lists in grouped_slice(price_lists):
cursor.execute(*cache.delete(where=reduce_ids(
cache.price_list, [
p.id for p in sub_price_lists])
& reduce_ids(
cache.product, [p.id for p in sub_products])))
@classmethod
def create(cls, vlist):
cls._get_cache.clear()
return super().create(vlist)
@classmethod
def write(cls, *args):
cls._get_cache.clear()
return super().write(*args)
@classmethod
def delete(cls, records):
cls._get_cache.clear()
return super().delete(records)

View File

@@ -0,0 +1,12 @@
<?xml version="1.0"?>
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
this repository contains the full copyright notices and license terms. -->
<tryton>
<data>
<record model="ir.cron" id="cron_fill_cache">
<field name="method">product.price_list|fill_cache</field>
<field name="interval_number" eval="1"/>
<field name="interval_type">days</field>
</record>
</data>
</tryton>

View File

@@ -0,0 +1,2 @@
# This file is part of Tryton. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.

View File

@@ -0,0 +1,131 @@
# This file is part of Tryton. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.
from decimal import Decimal
from unittest.mock import patch
from trytond.modules.company.tests import create_company, set_company
from trytond.pool import Pool
from trytond.tests.test_tryton import ModuleTestCase, with_transaction
class ProductPriceListCacheTestCase(ModuleTestCase):
"Test Product Price List Cache module"
module = 'product_price_list_cache'
@with_transaction()
def test_price_list_cache(self):
"Test caching price list"
pool = Pool()
Cache = pool.get('product.price_list.cache')
PriceList = pool.get('product.price_list')
Product = pool.get('product.product')
Template = pool.get('product.template')
Uom = pool.get('product.uom')
company = create_company()
with set_company(company):
kilogram, = Uom.search([
('name', '=', 'Kilogram'),
])
gram, = Uom.search([
('name', '=', 'Gram'),
])
template = Template(
name='Test Lot Sequence',
list_price=Decimal(10),
default_uom=kilogram,
)
template.save()
product = Product(template=template)
product.save()
price_list, = PriceList.create([{
'name': "Price List",
'price': 'list_price',
'lines': [('create', [{
'quantity': 10.0,
'formula': 'unit_price * 0.9',
}, {
'quantity': 5,
'formula': 'unit_price',
}, {
'formula': 'unit_price',
}])],
}])
# Test filling cache
price_list.fill_cache()
self.assertEqual(Cache.search([], count=True), 1)
price_list.fill_cache(products=[product])
self.assertEqual(Cache.search([], count=True), 1)
PriceList.fill_cache(products=[product])
self.assertEqual(Cache.search([], count=True), 1)
PriceList.fill_cache()
self.assertEqual(Cache.search([], count=True), 1)
cache, = Cache.search([])
self.assertEqual(cache.price_list, price_list)
self.assertEqual(cache.product, product)
self.assertEqual(cache.uom, kilogram)
self.assertEqual(
cache.unit_prices, [[0, Decimal(10)], [10, Decimal(9)]])
self.assertEqual(cache.pattern, None)
# Test cached compute
with patch.object(
Cache, 'get',
side_effect=Cache.get) as get, \
patch.object(
Cache, 'get_unit_price',
autospec=True,
side_effect=Cache.get_unit_price) as get_unit_price:
self.assertEqual(
price_list.compute(product, 1, kilogram),
Decimal(10))
get.assert_called_once()
get_unit_price.assert_called_once()
get_unit_price.return_value = None
get_unit_price.reset_mock()
self.assertEqual(
price_list.compute(product, 1, kilogram),
Decimal(10))
get_unit_price.assert_called_once()
get.return_value = None
get.side_effect = None
get.reset_mock()
get_unit_price.reset_mock()
self.assertEqual(
price_list.compute(product, 1, kilogram),
Decimal(10))
get.assert_called_once()
get_unit_price.assert_not_called()
# test get
self.assertEqual(Cache.get(price_list, product), cache)
self.assertEqual(
Cache.get(price_list, product, pattern={'foo': 'bar'}), None)
# Test get_unit_price
for quantity, uom, result in [
(1, kilogram, Decimal(10)),
(1_000, gram, Decimal(10)),
(2, kilogram, Decimal(10)),
(2_000, gram, Decimal(10)),
(10, kilogram, Decimal(9)),
(10_000, gram, Decimal(9)),
(11, kilogram, Decimal(9)),
(11_000, gram, Decimal(9)),
]:
with self.subTest(quantity=quantity, uom=uom.rec_name):
self.assertEqual(
cache.get_unit_price(quantity, uom), result)
del ModuleTestCase

View File

@@ -0,0 +1,8 @@
[tryton]
version=7.2.0
depends:
ir
product
product_price_list
xml:
product.xml