summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorent de Labarre <florent.mirieu@gmail.com>2021-05-11 13:37:22 +0000
committerFlorent de Labarre <florent.mirieu@gmail.com>2021-05-11 13:37:22 +0000
commitd0db984990679a63714ca62e6b605d94af7d5c28 (patch)
tree342db485558fd604f46b7bdbc9857f81949994e6
parentd1e49723349cb5a44cf353f4dd12a1d55e076155 (diff)
[FIX] website : prevent bad query
In database with front end, there are lot of bad query like this: bad query: UPDATE "website_visitor" SET "timezone"='Europe/Paris',"write_uid"=116,"write_date"=(now() at time zone 'UTC') WHERE id IN (15414) closes odoo/odoo#70507 Error: Could not serialize access due to concurrent update Signed-off-by: Thibault Delavallee (tde) <tde@openerp.com>
-rw-r--r--addons/website/models/website_visitor.py13
1 files changed, 12 insertions, 1 deletions
diff --git a/addons/website/models/website_visitor.py b/addons/website/models/website_visitor.py
index a8db8bc4a0e..6b242808195 100644
--- a/addons/website/models/website_visitor.py
+++ b/addons/website/models/website_visitor.py
@@ -192,7 +192,7 @@ class WebsiteVisitor(models.Model):
if visitor and not visitor.timezone:
tz = self._get_visitor_timezone()
if tz:
- visitor.timezone = tz
+ visitor._update_visitor_timezone(tz)
if not visitor and force_create:
visitor = self._create_visitor()
@@ -291,6 +291,17 @@ class WebsiteVisitor(models.Model):
deadline = datetime.now() - timedelta(days=delay_days)
visitors_to_archive = self.env['website.visitor'].sudo().search([('last_connection_datetime', '<', deadline)])
visitors_to_archive.write({'active': False})
+
+ def _update_visitor_timezone(self, timezone):
+ """ We need to do this part here to avoid concurrent updates error. """
+ try:
+ with self.env.cr.savepoint():
+ query_lock = "SELECT * FROM website_visitor where id = %s FOR NO KEY UPDATE NOWAIT"
+ self.env.cr.execute(query_lock, (self.id,), log_exceptions=False)
+ query = "UPDATE website_visitor SET timezone = %s WHERE id = %s"
+ self.env.cr.execute(query, (timezone, self.id), log_exceptions=False)
+ except Exception:
+ pass
def _update_visitor_last_visit(self):
""" We need to do this part here to avoid concurrent updates error. """