@@ -118,8 +118,7 @@ class MailTrackingEmail(models.Model):
118
118
@api .depends ("mail_message_id" )
119
119
def _compute_message_id (self ):
120
120
"""This helper field will allow us to map the message_id from either the linked
121
- mail.message or a mass.mailing mail.trace.
122
- """
121
+ mail.message or a mass.mailing mail.trace."""
123
122
self .message_id = False
124
123
for tracking in self .filtered ("mail_message_id" ):
125
124
tracking .message_id = tracking .mail_message_id .message_id
@@ -462,3 +461,40 @@ def event_process(self, request, post, metadata, event_type=None):
462
461
# - return 'NONE' if this request is not for you
463
462
# - return 'ERROR' if any error
464
463
return "NONE" # pragma: no cover
464
+
465
+ def _get_old_mail_tracking_email_domain (self , max_age_days ):
466
+ target_write_date = fields .Datetime .subtract (
467
+ fields .Datetime .now (), days = max_age_days
468
+ )
469
+ return [("write_date" , "<" , target_write_date )]
470
+
471
+ @api .autovacuum
472
+ def _gc_mail_tracking_email (self , limit = 5000 ):
473
+ config_max_age_days = (
474
+ self .env ["ir.config_parameter" ]
475
+ .sudo ()
476
+ .get_param ("mail_tracking.mail_tracking_email_max_age_days" )
477
+ )
478
+ try :
479
+ max_age_days = int (config_max_age_days )
480
+ except ValueError :
481
+ max_age_days = 0
482
+
483
+ if not max_age_days > 0 :
484
+ return False
485
+
486
+ domain = self ._get_old_mail_tracking_email_domain (max_age_days )
487
+ records_to_delete = self .search (domain , limit = limit ).exists ()
488
+ if records_to_delete :
489
+ _logger .info (
490
+ "Deleting %s mail.tracking.email records" , len (records_to_delete )
491
+ )
492
+ records_to_delete .flush_recordset ()
493
+ # Using a direct query to avoid ORM as it causes an issue with
494
+ # a related field mass_mailing_id in customer DB when deleting
495
+ # the records. This might be 14.0 specific, so changing to
496
+ # .unlink() should be tested when forward porting.
497
+ query = "DELETE FROM mail_tracking_email WHERE id IN %s"
498
+ args = (tuple (records_to_delete .ids ),)
499
+ self .env .cr .execute (query , args )
500
+ self .invalidate_model ()
0 commit comments