summaryrefslogtreecommitdiff
path: root/addons/pos_cache/models
diff options
context:
space:
mode:
Diffstat (limited to 'addons/pos_cache/models')
-rw-r--r--addons/pos_cache/models/__init__.py3
-rw-r--r--addons/pos_cache/models/pos_cache.py91
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()