diff options
| author | stephanchrst <stephanchrst@gmail.com> | 2022-05-10 21:51:50 +0700 |
|---|---|---|
| committer | stephanchrst <stephanchrst@gmail.com> | 2022-05-10 21:51:50 +0700 |
| commit | 3751379f1e9a4c215fb6eb898b4ccc67659b9ace (patch) | |
| tree | a44932296ef4a9b71d5f010906253d8c53727726 /addons/pos_cache/models | |
| parent | 0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff) | |
initial commit 2
Diffstat (limited to 'addons/pos_cache/models')
| -rw-r--r-- | addons/pos_cache/models/__init__.py | 3 | ||||
| -rw-r--r-- | addons/pos_cache/models/pos_cache.py | 91 |
2 files changed, 94 insertions, 0 deletions
diff --git a/addons/pos_cache/models/__init__.py b/addons/pos_cache/models/__init__.py new file mode 100644 index 00000000..b914c8e1 --- /dev/null +++ b/addons/pos_cache/models/__init__.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. +from . import pos_cache diff --git a/addons/pos_cache/models/pos_cache.py b/addons/pos_cache/models/pos_cache.py new file mode 100644 index 00000000..d2937f1a --- /dev/null +++ b/addons/pos_cache/models/pos_cache.py @@ -0,0 +1,91 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. +import base64 +import json +from ast import literal_eval + +from odoo import models, fields, api +from odoo.tools import date_utils + + +class pos_cache(models.Model): + _name = 'pos.cache' + _description = 'Point of Sale Cache' + + cache = fields.Binary(attachment=True) + product_domain = fields.Text(required=True) + product_fields = fields.Text(required=True) + + config_id = fields.Many2one('pos.config', ondelete='cascade', required=True) + compute_user_id = fields.Many2one('res.users', 'Cache compute user', required=True) + + @api.model + def refresh_all_caches(self): + self.env['pos.cache'].search([]).refresh_cache() + + def refresh_cache(self): + for cache in self: + Product = self.env['product.product'].with_user(cache.compute_user_id.id) + products = Product.search(cache.get_product_domain()) + prod_ctx = products.with_context(pricelist=cache.config_id.pricelist_id.id, + display_default_code=False, lang=cache.compute_user_id.lang) + res = prod_ctx.read(cache.get_product_fields()) + cache.write({ + 'cache': base64.encodebytes(json.dumps(res, default=date_utils.json_default).encode('utf-8')), + }) + + @api.model + def get_product_domain(self): + return literal_eval(self.product_domain) + + @api.model + def get_product_fields(self): + return literal_eval(self.product_fields) + + def cache2json(self): + return json.loads(base64.decodebytes(self.cache).decode('utf-8')) + + +class pos_config(models.Model): + _inherit = 'pos.config' + + @api.depends('cache_ids') + def _get_oldest_cache_time(self): + for cache in self: + pos_cache = self.env['pos.cache'] + oldest_cache = pos_cache.search([('config_id', '=', cache.id)], order='write_date', limit=1) + cache.oldest_cache_time = oldest_cache.write_date + + cache_ids = fields.One2many('pos.cache', 'config_id') + oldest_cache_time = fields.Datetime(compute='_get_oldest_cache_time', string='Oldest cache time', readonly=True) + limit_products_per_request = fields.Integer(compute='_compute_limit_products_per_request') + + def _compute_limit_products_per_request(self): + limit = self.env['ir.config_parameter'].sudo().get_param('pos_cache.limit_products_per_request', 0) + self.update({'limit_products_per_request': int(limit)}) + + def get_products_from_cache(self, fields, domain): + fields_str = str(fields) + domain_str = str(domain) + pos_cache = self.env['pos.cache'] + cache_for_user = pos_cache.search([ + ('id', 'in', self.cache_ids.ids), + ('compute_user_id', '=', self.env.uid), + ('product_domain', '=', domain_str), + ('product_fields', '=', fields_str), + ]) + + if not cache_for_user: + cache_for_user = pos_cache.create({ + 'config_id': self.id, + 'product_domain': domain_str, + 'product_fields': fields_str, + 'compute_user_id': self.env.uid + }) + cache_for_user.refresh_cache() + + return cache_for_user.cache2json() + + def delete_cache(self): + # throw away the old caches + self.cache_ids.unlink() |
