Browse Source
Add module pos_default_empty_image
Add module pos_default_empty_image
Big perf improvement for loading POS if you have thousand of products without imagepull/263/merge
Hparfr
9 years ago
committed by
Sylvain LE GAL
6 changed files with 181 additions and 0 deletions
-
72pos_default_empty_image/README.rst
-
1pos_default_empty_image/__init__.py
-
44pos_default_empty_image/__openerp__.py
-
20pos_default_empty_image/product.py
-
34pos_default_empty_image/static/src/js/pos_default_empty_image.js
-
10pos_default_empty_image/view/view.xml
@ -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 |
||||
|
|
||||
|
<img src="'/web/binary/image?model=product.product&field=image_medium&id='+product.id;"> |
||||
|
|
||||
|
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 <https://github.com/OCA/web/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 <https://github.com/OCA/web/issues/new?body=module:%20web_switch_company_warning%0Aversion:%200.1%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_. |
||||
|
|
||||
|
|
||||
|
Credits |
||||
|
======= |
||||
|
|
||||
|
Contributors |
||||
|
------------ |
||||
|
|
||||
|
* Hparfr <https://github.com/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. |
@ -0,0 +1 @@ |
|||||
|
# -*- coding: utf-8 -*- |
@ -0,0 +1,44 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
# © <2015> <Akretion, OCA> |
||||
|
# 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 |
||||
|
<img src="/web/.... + imageId"> 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': [], |
||||
|
} |
@ -0,0 +1,20 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
# © <2015> <Akretion, OCA> |
||||
|
# 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) |
@ -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); |
||||
|
}; |
||||
|
}; |
@ -0,0 +1,10 @@ |
|||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||
|
<openerp> |
||||
|
<data> |
||||
|
<template id="assets_backend" name="pos_default_empty_image assets" inherit_id="web.assets_backend"> |
||||
|
<xpath expr="." position="inside"> |
||||
|
<script type="text/javascript" src="/pos_default_empty_image/static/src/js/pos_default_empty_image.js"></script> |
||||
|
</xpath> |
||||
|
</template> |
||||
|
</data> |
||||
|
</openerp> |
Write
Preview
Loading…
Cancel
Save
Reference in new issue