diff --git a/pos_longpolling/__manifest__.py b/pos_longpolling/__manifest__.py index 2dacc30324..0ed7cc5b9d 100644 --- a/pos_longpolling/__manifest__.py +++ b/pos_longpolling/__manifest__.py @@ -3,7 +3,7 @@ "summary": """Technical module to implement instant updates in POS""", "category": "Point of Sale", "images": [], - "version": "11.0.2.1.2", + "version": "11.0.2.1.3", "application": False, "author": "IT-Projects LLC, Dinar Gabbasov", diff --git a/pos_longpolling/doc/changelog.rst b/pos_longpolling/doc/changelog.rst index 82f0168795..eb8628c5cf 100644 --- a/pos_longpolling/doc/changelog.rst +++ b/pos_longpolling/doc/changelog.rst @@ -1,3 +1,8 @@ +`2.1.3` +------- + + - **FIX:** Removed block screen during updating longpolling connection request + `2.1.2` ------- diff --git a/pos_longpolling/static/src/js/pos_longpolling.js b/pos_longpolling/static/src/js/pos_longpolling.js index 4deb36a265..412db34795 100644 --- a/pos_longpolling/static/src/js/pos_longpolling.js +++ b/pos_longpolling/static/src/js/pos_longpolling.js @@ -281,7 +281,7 @@ odoo.define('pos_longpolling', function(require){ if (self.pos.debug){ console.log('POS LONGPOLLING', self.bus.name, self.pos.config.name, "PING"); } - return session.rpc(serv_adr + "/pos_longpolling/update", {message: "PING", pos_id: self.pos.config.id, db_name: session.db},{timeout:30000}).then(function(){ + return session.rpc(serv_adr + "/pos_longpolling/update", {message: "PING", pos_id: self.pos.config.id, db_name: session.db},{shadow:true, timeout:30000}).then(function(){ /* If the value "response_status" is true, then the poll message came earlier if the value is false you need to start the response timer*/ self.set_is_online(true); diff --git a/pos_multi_session/__manifest__.py b/pos_multi_session/__manifest__.py index 8676ef45ba..fcddcf711b 100644 --- a/pos_multi_session/__manifest__.py +++ b/pos_multi_session/__manifest__.py @@ -9,7 +9,7 @@ "category": "Point Of Sale", # "live_test_url": 'http://apps.it-projects.info/shop/product/pos-multi-session?version=11.0', "images": ["images/pos-multi-session.png"], - "version": "11.0.4.2.10", + "version": "11.0.4.2.12", "application": False, "author": "IT-Projects LLC, Ivan Yelizariev", @@ -28,7 +28,8 @@ "data/pos_multi_session_data.xml", "security/ir.model.access.csv", "views/pos_multi_session_views.xml", - "multi_session_view.xml" + "multi_session_view.xml", + "security/ir_rule.xml", ], "qweb": [ "static/src/xml/pos_multi_session.xml", diff --git a/pos_multi_session/data/pos_multi_session_data.xml b/pos_multi_session/data/pos_multi_session_data.xml index 6eb62f7085..4479e1c284 100644 --- a/pos_multi_session/data/pos_multi_session_data.xml +++ b/pos_multi_session/data/pos_multi_session_data.xml @@ -1,19 +1,10 @@ - - - Default Multi Session - False - - - - - - - - + + diff --git a/pos_multi_session/demo/demo.xml b/pos_multi_session/demo/demo.xml index 3dbb931b6b..d4ca99f2cd 100644 --- a/pos_multi_session/demo/demo.xml +++ b/pos_multi_session/demo/demo.xml @@ -1,6 +1,6 @@ @@ -19,14 +19,12 @@ POS3 - - + Demo User2 - demo2@yourcompany.example.com Avenue des Dessus-de-Lives2, 2 @@ -38,7 +36,6 @@ demo2 demo2 --Mr Demo2 - 0410100000013 diff --git a/pos_multi_session/doc/changelog.rst b/pos_multi_session/doc/changelog.rst index 9e1e6e53b5..6bdc2d7211 100644 --- a/pos_multi_session/doc/changelog.rst +++ b/pos_multi_session/doc/changelog.rst @@ -1,3 +1,15 @@ +`4.2.12` +------- + +- **Fix:** Expected singleton error on adding POSes to a multisession + +`4.2.11` +-------- + +- **Fix:** Access error for poses created for different companies +- **Fix:** Error during installation in multi-company mode +- **Improvement:** Company rule for multi-session model + `4.2.10` -------- diff --git a/pos_multi_session/models/pos_multi_session_models.py b/pos_multi_session/models/pos_multi_session_models.py index eca87fa79e..0dfec3fe1d 100644 --- a/pos_multi_session/models/pos_multi_session_models.py +++ b/pos_multi_session/models/pos_multi_session_models.py @@ -1,13 +1,12 @@ # Copyright 2015-2016 Ivan Yelizariev # Copyright 2016 Ilyas Rakhimkulov -# Copyright 2017 Kolushov Alexandr -# Copyright 2016-2018 Dinar Gabbasov +# Copyright 2017,2019 Kolushov Alexandr +# Copyright 2016-2019 Dinar Gabbasov # License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html). import logging -from odoo import api -from odoo import fields -from odoo import models +from odoo import api, fields, models, _ +from odoo.exceptions import ValidationError _logger = logging.getLogger(__name__) @@ -18,8 +17,7 @@ class PosConfig(models.Model): multi_session_id = fields.Many2one('pos.multi_session', 'Multi-session', help='Set the same value for POSes where orders should be synced.' 'Uncheck the box "Active" if the POS should not use syncing.' - 'Before updating you need to close active session', - default=lambda self: self.env.ref('pos_multi_session.default_multi_session', raise_if_not_found=False)) + 'Before updating you need to close active session') multi_session_accept_incoming_orders = fields.Boolean('Accept incoming orders', default=True) multi_session_replace_empty_order = fields.Boolean('Replace empty order', default=True, help='Empty order is deleted whenever new order is come from another POS') multi_session_deactivate_empty_order = fields.Boolean('Deactivate empty order', default=False, help='POS is switched to new foreign Order, if current order is empty') @@ -27,7 +25,6 @@ class PosConfig(models.Model): sync_server = fields.Char(related='multi_session_id.sync_server') autostart_longpolling = fields.Boolean(default=False) fiscal_position_ids = fields.Many2many(related='multi_session_id.fiscal_position_ids') - company_id = fields.Many2one(related='multi_session_id.company_id') def _search_current_session_state(self, operator, value): ids = map(lambda x: x.id, self.env["pos.config"].search([])) @@ -41,10 +38,33 @@ def _search_current_session_state(self, operator, value): else: return [('id', 'in', [])] + @api.multi + def _write(self, vals): + # made to prevent 'expected singleton' errors in *pos.config* constraints + result = False + if 'multi_session_id' in vals: + multi_session_id = vals.get('multi_session_id') + if multi_session_id: + multi_session_id = self.multi_session_id.browse(multi_session_id) + vals['company_id'] = multi_session_id.company_id.id + else: + vals['company_id'] = self.env.user.company_id.id + for config in self: + result = super(PosConfig, config)._write(vals) + return result + + @api.multi + def open_session_cb(self): + if not self.multi_session_id: + raise ValidationError(_("The Multi-Session is not defined for point of sale") + ' ' + self.name) + return super(PosConfig, self).open_session_cb() class PosMultiSession(models.Model): _name = 'pos.multi_session' + def _get_default_location(self): + return self.env['stock.warehouse'].search([('company_id', '=', self.env.user.company_id.id)], limit=1).lot_stock_id + name = fields.Char('Name') multi_session_active = fields.Boolean(string="Active", help="Select the checkbox to enable synchronization for POSes", default=True) pos_ids = fields.One2many('pos.config', 'multi_session_id', string='POSes in Multi-session') @@ -57,17 +77,29 @@ class PosMultiSession(models.Model): fiscal_position_ids = fields.Many2many('account.fiscal.position', string='Fiscal Positions', ondelete="restrict") company_id = fields.Many2one('res.company', string='Company', required=True, default=lambda self: self.env.user.company_id) - @api.multi + @api.model def action_set_default_multi_session(self): """ - during installation of the module set default multi-session - for all POSes for which multi_session_id is not specified + during installation of the module set default multi-sessions + (separate default multi-session for each company) + for all POSes with not set multi_session_id """ - self.ensure_one() - configs = self.env['pos.config'].search([('multi_session_id', '=', False)]) - configs.write({ - 'multi_session_id': self.id - }) + companies = self.env['res.company'].search([]) + for company in companies: + configs = self.env['pos.config'].search([('multi_session_id', '=', False), ('company_id', '=', company.id)]) + # If there are POSes with the company then we need to create default multi-session + if configs: + # Create default multi-session for current company + multi_session = self.create({ + 'name': 'Default Multi Session (%s)' % company.name, + 'multi_session_active': False, + 'company_id': company.id, + }) + # odoo.exceptions.ValidationError: ('Error while validating constraint\n\nExpected singleton: pos.config(1, 2, 3)', None) + for c in configs: + c.write({ + 'multi_session_id': multi_session.id + }) @api.multi def name_get(self): diff --git a/pos_multi_session/security/ir_rule.xml b/pos_multi_session/security/ir_rule.xml new file mode 100644 index 0000000000..b015d13664 --- /dev/null +++ b/pos_multi_session/security/ir_rule.xml @@ -0,0 +1,12 @@ + + + + + Multi Session Rule + + + + [('company_id','child_of',[user.company_id.id])] + + diff --git a/pos_multi_session/static/src/js/pos_multi_session.js b/pos_multi_session/static/src/js/pos_multi_session.js index d5264e5175..4d8b1c7348 100644 --- a/pos_multi_session/static/src/js/pos_multi_session.js +++ b/pos_multi_session/static/src/js/pos_multi_session.js @@ -928,7 +928,10 @@ odoo.define('pos_multi_session', function(require){ message: message, dbname: session.db, user_ID: self.pos.user.id - },{timeout:30000}); + }, { + shadow: true, + timeout:30000 + }); }; return send_it().fail(function (error, e) { if (self.pos.debug){ diff --git a/pos_multi_session/views/pos_multi_session_views.xml b/pos_multi_session/views/pos_multi_session_views.xml index 16f1df3656..0e11d409e8 100644 --- a/pos_multi_session/views/pos_multi_session_views.xml +++ b/pos_multi_session/views/pos_multi_session_views.xml @@ -45,7 +45,7 @@