2
2
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
3
3
4
4
import logging
5
+ from contextlib import closing
5
6
6
7
from psycopg2 .errors import ObjectNotInPrerequisiteState
7
8
from psycopg2 .extensions import AsIs
@@ -99,22 +100,34 @@ class StockAverageDailySale(models.Model):
99
100
required = True ,
100
101
)
101
102
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
+
102
118
@api .model
103
119
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
118
131
119
132
# pylint: disable=redefined-outer-name
120
133
@api .model
@@ -141,7 +154,16 @@ def set_refresh_date(self, date=None):
141
154
142
155
@api .model
143
156
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
+ )
145
167
self .set_refresh_date ()
146
168
147
169
def _create_materialized_view (self ):
0 commit comments