mirror of
https://github.com/OCA/stock-logistics-reporting.git
synced 2025-02-16 17:13:21 +02:00
[IMP] stock_average_daily_sale: avoid concurrent update
This commit is contained in:
committed by
twalter-c2c
parent
fb2cee485b
commit
93fafe8cbd
@@ -2,6 +2,7 @@
|
|||||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
import logging
|
import logging
|
||||||
|
from contextlib import closing
|
||||||
|
|
||||||
from psycopg2.errors import ObjectNotInPrerequisiteState
|
from psycopg2.errors import ObjectNotInPrerequisiteState
|
||||||
from psycopg2.extensions import AsIs
|
from psycopg2.extensions import AsIs
|
||||||
@@ -99,22 +100,34 @@ class StockAverageDailySale(models.Model):
|
|||||||
required=True,
|
required=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def _check_materialize_view_populated(cls, cr):
|
||||||
|
"""
|
||||||
|
Check if the materialized view is populated
|
||||||
|
|
||||||
|
:param cr: database cursor
|
||||||
|
:return: True if the materialized view is populated, False otherwise
|
||||||
|
"""
|
||||||
|
cr.execute(
|
||||||
|
"SELECT ispopulated FROM pg_matviews WHERE matviewname = %s;",
|
||||||
|
(cls._table,),
|
||||||
|
)
|
||||||
|
records = cr.fetchone()
|
||||||
|
return records and records[0]
|
||||||
|
|
||||||
@api.model
|
@api.model
|
||||||
def _check_view(self):
|
def _check_view(self):
|
||||||
try:
|
cr = registry(self._cr.dbname).cursor()
|
||||||
cr = registry(self._cr.dbname).cursor()
|
with closing(cr):
|
||||||
new_self = self.with_env(self.env(cr=cr)) # TDE FIXME
|
try:
|
||||||
new_self.env.cr.execute("SELECT COUNT(1) FROM %s", (AsIs(self._table),))
|
return self._check_materialize_view_populated(cr)
|
||||||
return True
|
except ObjectNotInPrerequisiteState:
|
||||||
except ObjectNotInPrerequisiteState:
|
_logger.warning(
|
||||||
_logger.warning(
|
_("The materialized view has not been populated. Launch the cron.")
|
||||||
_("The materialized view has not been populated. Launch the cron.")
|
)
|
||||||
)
|
return False
|
||||||
return False
|
except Exception as e:
|
||||||
except Exception as e:
|
raise e
|
||||||
raise e
|
|
||||||
finally:
|
|
||||||
new_self.env.cr.close()
|
|
||||||
|
|
||||||
# pylint: disable=redefined-outer-name
|
# pylint: disable=redefined-outer-name
|
||||||
@api.model
|
@api.model
|
||||||
@@ -141,7 +154,16 @@ class StockAverageDailySale(models.Model):
|
|||||||
|
|
||||||
@api.model
|
@api.model
|
||||||
def refresh_view(self):
|
def refresh_view(self):
|
||||||
self.env.cr.execute("refresh materialized view %s", (AsIs(self._table),))
|
concurrently = ""
|
||||||
|
if self._check_materialize_view_populated(self.env.cr):
|
||||||
|
concurrently = "CONCURRENTLY"
|
||||||
|
self.env.cr.execute(
|
||||||
|
"refresh materialized view %s %s",
|
||||||
|
(
|
||||||
|
AsIs(concurrently),
|
||||||
|
AsIs(self._table),
|
||||||
|
),
|
||||||
|
)
|
||||||
self.set_refresh_date()
|
self.set_refresh_date()
|
||||||
|
|
||||||
def _create_materialized_view(self):
|
def _create_materialized_view(self):
|
||||||
|
|||||||
Reference in New Issue
Block a user