diff --git a/pos_default_empty_image/README.rst b/pos_default_empty_image/README.rst new file mode 100644 index 00000000..9f49d1a9 --- /dev/null +++ b/pos_default_empty_image/README.rst @@ -0,0 +1,72 @@ +.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 + +=========================== +POS Default Empty Image +=========================== + +In the point of sale, trying to load known inexistant images is a waste of time. + + +When you have 8000 products in your Point of Sale and most of them don't have images, +you are happy to save thousands of useless requests : the POS load way faster. + +Technical information +===================== + +Each time the pos instantiate a product, it will add an + + + +The browser will trigger as many requests than there is different url. + + +If you have many products, the browser will soon reach his limit of network connections to Odoo server and +will wait for free slots instead of loading other valuable contents. Then the POS is then very slow to work with. + + +This module adds a field _has_image_ in product.template and will change the product image url to his default placeholder directly in the POS. + +Because there is only one url for this placeholder, you will have only one request for all the products with no images. + +Indeed, if the product has an image, it will load normally. + +Known issues +============ + + +Updates +======= + * Feb 2016 : First version + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed feedback `here `_. + + +Credits +======= + +Contributors +------------ + +* Hparfr (Akretion)[https://akretion.com] + +Maintainer +---------- + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +This module is maintained by the OCA. + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +To contribute to this module, please visit http://odoo-community.org. diff --git a/pos_default_empty_image/__init__.py b/pos_default_empty_image/__init__.py new file mode 100644 index 00000000..7c68785e --- /dev/null +++ b/pos_default_empty_image/__init__.py @@ -0,0 +1 @@ +# -*- coding: utf-8 -*- \ No newline at end of file diff --git a/pos_default_empty_image/__openerp__.py b/pos_default_empty_image/__openerp__.py new file mode 100644 index 00000000..29526f77 --- /dev/null +++ b/pos_default_empty_image/__openerp__.py @@ -0,0 +1,44 @@ +# -*- coding: utf-8 -*- +# © <2015> +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +{ + 'name': 'POS Default empty image', + 'version': '8.0.0.1.0', + 'category': 'Point Of Sale', + 'summary': 'Optimise load time for products with no image', + 'description': """ +POS Default empty Image +======================= + +In the point of sale, trying to load known inexistant images is a waste of time. + + +When you have 8000 products in your Point of Sale and most of them don't have images, +you are happy to save thousands of useless requests : the POS load way faster. + +Technical information +===================== + +Each time the pos instantiate a product, it will add an + to DOM. +The browser will trigger as many requests than there is different url. +If you have many products, the browser will soon reach his limit of network connections to Odoo server and +will wait for free slots instead of loading other valuable contents. +The POS is then very slow to work with. + + +This module adds a field _has_image_ in product.template and will change +the product image url to his default placeholder directly in the POS. +Because there is only one url for this placeholder, you will have only one request for all the products with +no images. + +Indeed, if the product has an image, it will load normally. + + """, + 'author': "Akretion / Odoo Community Association (OCA)", + 'website': "https://akretion.com", + 'license': 'AGPL-3', + 'depends': ['point_of_sale'], + 'data': [ 'view/view.xml'], + 'qweb': [], +} diff --git a/pos_default_empty_image/product.py b/pos_default_empty_image/product.py new file mode 100644 index 00000000..03384a3b --- /dev/null +++ b/pos_default_empty_image/product.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# © <2015> +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from openerp import models, fields, api + +class ProductTemplate(models.Model): + _inherit = ['product.template'] + _name = 'product.template' + + @api.multi + @api.depends('field.image') + def _has_image(self): + for record in self: + record.has_image = bool(record.image) + + has_image = fields.Boolean( + compute='_has_image', + store=True, + readonly=True) diff --git a/pos_default_empty_image/static/src/js/pos_default_empty_image.js b/pos_default_empty_image/static/src/js/pos_default_empty_image.js new file mode 100644 index 00000000..10d65a9f --- /dev/null +++ b/pos_default_empty_image/static/src/js/pos_default_empty_image.js @@ -0,0 +1,34 @@ +'use strict'; + +openerp.pos_default_empty_image = function (instance) { + var module = instance.point_of_sale; + var _t = instance.web._t; + + //don't try to get an image if we know the product ain't one + module.ProductListWidget = module.ProductListWidget.extend({ + get_product_image_url: function(product){ + if (product.has_image) + return this._super(product); + + return '/web/static/src/img/placeholder.png'; + } + }); + + //we can't extend it because self.pos not ready yet + var _initializePosModel_ = module.PosModel.prototype.initialize; + module.PosModel.prototype.initialize = function(session, attributes){ + //add has_image to the request of product product + this.models.some(function (m, idx) { + if (m.model !== "product.product") + return false; + + //check if not already done by someone else + if (m.fields.indexOf('has_image') === -1) { + m.fields.push('has_image'); + } + + return true; //no need to continue + }); + return _initializePosModel_.call(this, session, attributes); + }; +}; diff --git a/pos_default_empty_image/view/view.xml b/pos_default_empty_image/view/view.xml new file mode 100644 index 00000000..b3de3a4b --- /dev/null +++ b/pos_default_empty_image/view/view.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file