diff --git a/addons/mail/models/ir_model.py b/addons/mail/models/ir_model.py index d2a296e6849..30084eb1a7b 100644 --- a/addons/mail/models/ir_model.py +++ b/addons/mail/models/ir_model.py @@ -20,26 +20,35 @@ class IrModel(models.Model): ) def unlink(self): + """ Delete mail data (followers, messages, activities) associated with + the models being deleted. + """ if not self: return True # Delete followers, messages and attachments for models that will be unlinked. + mail_models = self.search([ + ('model', 'in', ('mail.activity', 'mail.activity.type', 'mail.followers', 'mail.message')) + ], order='id') + + if not (self & mail_models): + models = tuple(self.mapped('model')) + model_ids = tuple(self.ids) + + query = "DELETE FROM mail_activity WHERE res_model_id IN %s" + self.env.cr.execute(query, [model_ids]) + + query = "DELETE FROM mail_activity_type WHERE res_model IN %s" + self.env.cr.execute(query, [models]) + + query = "DELETE FROM mail_followers WHERE res_model IN %s" + self.env.cr.execute(query, [models]) + + query = "DELETE FROM mail_message WHERE model in %s" + self.env.cr.execute(query, [models]) + + # Get files attached solely to the models being deleted (and none other) models = tuple(self.mapped('model')) - model_ids = tuple(self.ids) - - query = "DELETE FROM mail_activity WHERE res_model_id IN %s" - self.env.cr.execute(query, [model_ids]) - - query = "DELETE FROM mail_activity_type WHERE res_model IN %s" - self.env.cr.execute(query, [models]) - - query = "DELETE FROM mail_followers WHERE res_model IN %s" - self.env.cr.execute(query, [models]) - - query = "DELETE FROM mail_message WHERE model in %s" - self.env.cr.execute(query, [models]) - - # Get files attached solely by the models query = """ SELECT DISTINCT store_fname FROM ir_attachment