diff --git a/odex30_base/ctp_database_clean_up/models/ctp_database_clean_up.py b/odex30_base/ctp_database_clean_up/models/ctp_database_clean_up.py index fb3be12..1e7ded2 100644 --- a/odex30_base/ctp_database_clean_up/models/ctp_database_clean_up.py +++ b/odex30_base/ctp_database_clean_up/models/ctp_database_clean_up.py @@ -12,40 +12,39 @@ class CtpDatabaseCleanUp(models.TransientModel): def remove_data(self, o, s=[]): for line in o: try: - model = self.env['ir.model']._get(line) - if not model: - _logger.warning('Model %s not found, skipping.', line) - continue + with self.env.cr.savepoint(): + model_obj = self.env['ir.model']._get(line) + if not model_obj: + _logger.warning('Model %s not found, skipping.', line) + continue - t_name = self.env[line]._table - sql = "delete from %s" % t_name + if self.env[line]._abstract: + _logger.warning('Model %s is abstract, skipping as it has no table.', line) + continue - try: + table_name = self.env[line]._table + _logger.info('Attempting to TRUNCATE table for model: %s (table: %s)', line, table_name) + + safe_table_name = table_name.replace('"', '""') + sql = 'TRUNCATE TABLE "%s" RESTART IDENTITY CASCADE' % safe_table_name self._cr.execute(sql) - _logger.info('Successfully deleted data from %s', t_name) - self._cr.commit() - except Exception as e: - _logger.warning('Database Clean up error on table %s: %s', t_name, e) - self._cr.rollback() except Exception as e: - _logger.warning('General error processing model %s: %s', line, e) - self._cr.rollback() + _logger.error('--> FAILED to clean data for model [%s]. Error: %s', line, e, exc_info=True) - for line in s: - domain = ['|', ('code', '=ilike', line + '%'), ('prefix', '=ilike', line + '%')] + for seq_code in s: try: - seqs = self.env['ir.sequence'].sudo().search(domain) - if seqs.exists(): - seqs.write({ - 'number_next': 1, - }) - _logger.info('Reset sequence for %s', line) + with self.env.cr.savepoint(): + domain = ['|', ('code', '=ilike', seq_code + '%'), ('prefix', '=ilike', seq_code + '%')] + seqs = self.env['ir.sequence'].sudo().search(domain) + if seqs: + seqs.write({'number_next': 1}) + _logger.info('Reset sequence for %s', seq_code) except Exception as e: - _logger.warning('Reset Sequence Data error: %s, %s', line, e) + _logger.warning('Failed to reset sequence for %s: %s', seq_code, e) return True - + def remove_sales(self): to_removes = [ 'sale.order.line',