From 47996bec344c65fe16265b95b10ee4cad9c2be93 Mon Sep 17 00:00:00 2001 From: Stefan Rijnhart Date: Thu, 20 Feb 2014 14:12:16 +0100 Subject: [PATCH] [ADD] Allow purging of dangling data entries --- database_cleanup/__openerp__.py | 1 + database_cleanup/model/__init__.py | 1 + database_cleanup/model/purge_data.py | 105 +++++++++++++++++++++++++++ database_cleanup/view/menu.xml | 9 ++- database_cleanup/view/purge_data.xml | 37 ++++++++++ 5 files changed, 152 insertions(+), 1 deletion(-) create mode 100644 database_cleanup/model/purge_data.py create mode 100644 database_cleanup/view/purge_data.xml diff --git a/database_cleanup/__openerp__.py b/database_cleanup/__openerp__.py index c752ae48e..abc2f7ab4 100644 --- a/database_cleanup/__openerp__.py +++ b/database_cleanup/__openerp__.py @@ -31,6 +31,7 @@ 'view/purge_models.xml', 'view/purge_columns.xml', 'view/purge_tables.xml', + 'view/purge_data.xml', 'view/menu.xml', ], 'description': """\ diff --git a/database_cleanup/model/__init__.py b/database_cleanup/model/__init__.py index 9b366b62b..77faf891c 100644 --- a/database_cleanup/model/__init__.py +++ b/database_cleanup/model/__init__.py @@ -3,3 +3,4 @@ from . import purge_modules from . import purge_models from . import purge_columns from . import purge_tables +from . import purge_data diff --git a/database_cleanup/model/purge_data.py b/database_cleanup/model/purge_data.py new file mode 100644 index 000000000..4aa80c886 --- /dev/null +++ b/database_cleanup/model/purge_data.py @@ -0,0 +1,105 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# This module copyright (C) 2014 Therp BV (). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + +from openerp.osv import orm, fields +from openerp.tools.translate import _ + + +class CleanupPurgeLineData(orm.TransientModel): + _inherit = 'cleanup.purge.line' + _name = 'cleanup.purge.line.data' + + _columns = { + 'model_id': fields.many2one( + 'ir.model', 'Model', + required=True, ondelete='CASCADE'), + 'wizard_id': fields.many2one( + 'cleanup.purge.wizard.data', 'Purge Wizard', readonly=True), + } + + def purge(self, cr, uid, ids, context=None): + """ + Unlink columns upon manual confirmation. + """ + data_ids = [] + for line in self.browse(cr, uid, ids, context=context): + if line.purged or not line.data_id: + continue + data_ids.append(line.data_id.id) + self.logger.info('Purging data entry: %s', line.name) + self.pool['ir.model.data'].unlink(cr, uid, data_ids, context=context) + return self.write(cr, uid, ids, {'purged': True}, context=context) + +class CleanupPurgeWizardData(orm.TransientModel): + _inherit = 'cleanup.purge.wizard' + _name = 'cleanup.purge.wizard.data' + + def default_get(self, cr, uid, fields, context=None): + res = super(CleanupPurgeWizardData, self).default_get( + cr, uid, fields, context=context) + if 'name' in fields: + res['name'] = _('Purge data') + return res + + def find(self, cr, uid, context=None): + """ + """ + res = [] + data_pool = self.pool['ir.model.data'] + data_ids = [] + unknown_models = [] + cr.execute("""SELECT DISTINCT(model) FROM ir_model_data""") + for (model,) in cr.fetchall(): + if not model: + continue + if not self.pool.get(model): + unknown_models.append(model) + continue + cr.execute( + """ + SELECT id FROM ir_model_data + WHERE model = %%s + AND res_id IS NOT NULL + AND res_id NOT IN ( + SELECT id FROM %s) + """ % self.pool[model]._table, (model,)) + data_ids += [data_row[0] for data_row in cr.fetchall()] + data_ids += data_pool.search( + cr, uid, [('model', 'in', unknown_models)], context=context) + for data in data_pool.browse(cr, uid, data_ids, context=context): + res.append((0, 0, { + 'data_id': data.id, + 'name': "%s.%s, object of type %s" % ( + data.module, data.name, data.model)})) + if not res: + raise orm.except_orm( + _('Nothing to do'), + _('No orphaned data entries found')) + return res + + _columns = { + 'purge_line_ids': fields.one2many( + 'cleanup.purge.line.data', + 'wizard_id', 'Data to purge'), + 'data_id': fields.many2one( + 'ir.model.data', 'Data entry', + ondelete='SET NULL'), + } diff --git a/database_cleanup/view/menu.xml b/database_cleanup/view/menu.xml index ff6a1694b..9d770ea03 100644 --- a/database_cleanup/view/menu.xml +++ b/database_cleanup/view/menu.xml @@ -32,10 +32,17 @@ Purge obsolete tables - + + + Purge obsolete data entries + + + + + diff --git a/database_cleanup/view/purge_data.xml b/database_cleanup/view/purge_data.xml new file mode 100644 index 000000000..d45422027 --- /dev/null +++ b/database_cleanup/view/purge_data.xml @@ -0,0 +1,37 @@ + + + + + + Form view for purge data wizard + cleanup.purge.wizard.data + +
+

+ +

+