Skip to content

Commit d46c24f

Browse files
committed
[IMP] stock_average_daily_sale: avoid concurrent update
1 parent 90c0aff commit d46c24f

File tree

1 file changed

+37
-15
lines changed

1 file changed

+37
-15
lines changed

stock_average_daily_sale/models/stock_average_daily_sale.py

+37-15
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
33

44
import logging
5+
from contextlib import closing
56

67
from psycopg2.errors import ObjectNotInPrerequisiteState
78
from psycopg2.extensions import AsIs
@@ -99,22 +100,34 @@ class StockAverageDailySale(models.Model):
99100
required=True,
100101
)
101102

103+
@classmethod
104+
def _check_materialize_view_populated(cls, cr):
105+
"""
106+
Check if the materialized view is populated
107+
108+
:param cr: database cursor
109+
:return: True if the materialized view is populated, False otherwise
110+
"""
111+
cr.execute(
112+
"SELECT ispopulated FROM pg_matviews WHERE matviewname = %s;",
113+
(cls._table,),
114+
)
115+
records = cr.fetchone()
116+
return records and records[0]
117+
102118
@api.model
103119
def _check_view(self):
104-
try:
105-
cr = registry(self._cr.dbname).cursor()
106-
new_self = self.with_env(self.env(cr=cr)) # TDE FIXME
107-
new_self.env.cr.execute("SELECT COUNT(1) FROM %s", (AsIs(self._table),))
108-
return True
109-
except ObjectNotInPrerequisiteState:
110-
_logger.warning(
111-
_("The materialized view has not been populated. Launch the cron.")
112-
)
113-
return False
114-
except Exception as e:
115-
raise e
116-
finally:
117-
new_self.env.cr.close()
120+
cr = registry(self._cr.dbname).cursor()
121+
with closing(cr):
122+
try:
123+
return self._check_materialize_view_populated(cr)
124+
except ObjectNotInPrerequisiteState:
125+
_logger.warning(
126+
_("The materialized view has not been populated. Launch the cron.")
127+
)
128+
return False
129+
except Exception as e:
130+
raise e
118131

119132
# pylint: disable=redefined-outer-name
120133
@api.model
@@ -141,7 +154,16 @@ def set_refresh_date(self, date=None):
141154

142155
@api.model
143156
def refresh_view(self):
144-
self.env.cr.execute("refresh materialized view %s", (AsIs(self._table),))
157+
concurrently = ""
158+
if self._check_materialize_view_populated(self.env.cr):
159+
concurrently = "CONCURRENTLY"
160+
self.env.cr.execute(
161+
"refresh materialized view %s %s",
162+
(
163+
AsIs(concurrently),
164+
AsIs(self._table),
165+
),
166+
)
145167
self.set_refresh_date()
146168

147169
def _create_materialized_view(self):

0 commit comments

Comments
 (0)