trytond-patches/babi_multiprocess.diff

64 lines
3.0 KiB
Diff

diff --git a/tryton/trytond/trytond/pool.py b/trytond/trytond/pool.py
index 407ff358..0be2a41a 100644
--- a/tryton/trytond/trytond/pool.py
+++ b/tryton/trytond/trytond/pool.py
@@ -195,6 +195,16 @@ class Pool(object):
self.add(cls, type)
self.setup_mixin(self._modules, type='report', name=name)
return self.get(name, type=type)
+ elif name[:15] == 'babi_execution_':
+ import sys
+ # Do not reload if babi model is accessed during update.
+ if not sys.argv[0].endswith('trytond-admin'):
+ with Transaction(new=True).start(self.database_name, 0,
+ readonly=False):
+ Execution = self.get('babi.report.execution')
+ execution = Execution(int(name[15:]))
+ execution.validate_model(avoid_registration=True)
+ return self._pool[self.database_name][type][name]
raise
def add(self, cls, type='model'):
diff --git a/tryton/trytond/trytond/model/modelsql.py b/trytond/trytond/model/modelsql.py
index d762a27a..5ca47c34 100644
--- a/tryton/trytond/trytond/model/modelsql.py
+++ b/tryton/trytond/trytond/model/modelsql.py
@@ -1429,8 +1429,14 @@ class ModelSQL(ModelStorage):
foreign_table = Model.__table__()
foreign_red_sql = reduce_ids(
Column(foreign_table, field_name), sub_ids)
- cursor.execute(*foreign_table.select(foreign_table.id,
- where=foreign_red_sql))
+ import psycopg2
+ try:
+ cursor.execute(*foreign_table.select(foreign_table.id,
+ where=foreign_red_sql))
+ except psycopg2.errors.UndefinedTable as ex:
+ if ex.args and (len(ex.args) > 0) and 'babi_execution' in ex.args[0]:
+ return []
+ raise
related_records = Model.browse([x[0] for x in cursor])
else:
with inactive_records():
diff --git a/tryton/trytond/trytond/ir/model.py b/tryton/trytond/trytond/ir/model.py
index 6304018f24..1ea08d8be5 100644
--- a/tryton/trytond/trytond/ir/model.py
+++ b/tryton/trytond/trytond/ir/model.py
@@ -555,8 +555,14 @@ class ModelAccess(DeactivableMixin, ModelSQL, ModelView):
fill_models(field.get_target(), models)
model2models = defaultdict(list)
for model in models:
- fill_models(pool.get(model), model2models[model])
-
+ try:
+ fill_models(pool.get(model), model2models[model])
+ except KeyError as err:
+ if 'babi_execution_' in str(err):
+ models.remove(model)
+ continue
+ else:
+ raise
all_models = list(set(sum(model2models.values(), [])))
default = {'read': True, 'write': True, 'create': True, 'delete': True}
default_singleton = {