diff --git a/tryton/trytond/trytond/pool.py b/trytond/trytond/pool.py index a21e9e63e8..bd22d3b073 100644 --- a/tryton/trytond/trytond/pool.py +++ b/tryton/trytond/trytond/pool.py @@ -197,6 +197,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/tryton/trytond/trytond/model/modelsql.py index a21e9e63e8..e767d2e9ae 100644 --- a/tryton/trytond/trytond/model/modelsql.py +++ b/tryton/trytond/trytond/model/modelsql.py @@ -747,13 +747,21 @@ class ModelSQL(ModelStorage): extra_fields = set() if 'write_date' not in fields_names: extra_fields.add('write_date') + fields_names = fields_names[:] for field_name in fields_names: if field_name in {'_timestamp', '_write', '_delete'}: continue if '.' in field_name: field_name, field_related = field_name.split('.', 1) fields_related[field_name].add(field_related) - field = cls._fields[field_name] + try: + field = cls._fields[field_name] + except KeyError as err: + if 'babi_' in str(err): + fields_names.remove(field_name) + continue + else: + raise if hasattr(field, 'datetime_field') and field.datetime_field: extra_fields.add(field.datetime_field) if field.context: @@ -1209,8 +1217,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 transaction.set_context(active_test=False): 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 = {