Skip to content

Commit f4041de

Browse files
committed
[FIX] website: use proper env in model methods
Using `request.env` should be reserved for code that lies outside of model methods (typically: controllers). Model methods have to use the appropriate `self.env`. This particular case caused frequent Python-PostgreSQL undetected deadlocks during installations of website-related modules in 12.0. One way to reproduce it was to trigger the installation of both `website` and `website_form` in a single transaction, with neither pre-installed. Installing Apps that depend on both would do the job, such as `website_sale`, provided that GEOIP is available on the system. In details: During installation of `website`, new attachments creation would call get_current_website (see 602807a and 4f6ec1c), using the wrong database cursor: the one from the request instead of the one for the installation, as provided by `ir.module.module._button_immediate_function`. This would acquire database locks on `res.country` and `ir.model` in the wrong transaction, later blocking alterations to `ir.model` in the installation transaction, e.g. for website_form's 'website_form_access' column. This combination of events was possible before 12.0, but more difficult to reproduce as module installations used to happen with a super-user account, ignoring ACL checks and therefore not locking `ir.model`.
1 parent a362d0e commit f4041de

File tree

1 file changed

+2
-2
lines changed

1 file changed

+2
-2
lines changed

addons/website/models/website.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -462,7 +462,7 @@ def get_current_website(self, fallback=True):
462462
country = request.session.geoip.get('country_code') if request and request.session.geoip else False
463463
country_id = False
464464
if country:
465-
country_id = request.env['res.country'].search([('code', '=', country)], limit=1).id
465+
country_id = self.env['res.country'].search([('code', '=', country)], limit=1).id
466466

467467
website_id = self._get_current_website_id(domain_name, country_id, fallback=fallback)
468468
return self.browse(website_id)
@@ -644,7 +644,7 @@ def enumerate_pages(self, query_string=None, force=False):
644644
@api.multi
645645
def get_website_pages(self, domain=[], order='name', limit=None):
646646
domain += self.get_current_website().website_domain()
647-
pages = request.env['website.page'].search(domain, order='name', limit=limit)
647+
pages = self.env['website.page'].search(domain, order='name', limit=limit)
648648
return pages
649649

650650
@api.multi

0 commit comments

Comments
 (0)