@@ -194,6 +194,35 @@ def check_evidences_expiring_tomorrow():
194194 send_evidence_expiring_soon_notification (owner_email , evidences , days = 1 )
195195
196196
197+ # @db_periodic_task(crontab(minute="*/1")) # for testing
198+ @db_periodic_task (crontab (hour = "6" , minute = "40" ))
199+ def check_evidences_expired ():
200+ """Check for expired Evidences"""
201+ expired_evidences = (
202+ Evidence .objects .filter (expiry_date__lt = date .today ())
203+ .prefetch_related ("owner" )
204+ )
205+
206+ # Group by individual owner
207+ owner_evidences = {}
208+ for evidence in expired_evidences :
209+ for owner in evidence .owner .all ():
210+ if owner .email not in owner_evidences :
211+ owner_evidences [owner .email ] = []
212+ owner_evidences [owner .email ].append (evidence )
213+
214+ # Send personalized email to each owner
215+ for owner_email , evidences in owner_evidences .items ():
216+ days = 0
217+ days_list = [
218+ (date .today () - ev .expiry_date ).days
219+ for ev in evidences
220+ ]
221+ if days_list :
222+ days = max (days_list )
223+
224+ send_notification_email_expired_evidence (owner_email , evidences , days = days )
225+
197226# @db_periodic_task(crontab(minute="*/1")) # for testing
198227@db_periodic_task (crontab (hour = "6" , minute = "40" ))
199228def check_validation_flows_deadline_in_week ():
@@ -504,6 +533,28 @@ def send_applied_control_expiring_soon_notification(owner_email, controls, days)
504533 f"Failed to render { template_name } email template for { owner_email } "
505534 )
506535
536+ @task ()
537+ def send_notification_email_expired_evidence (owner_email , evidences , days = 0 ):
538+ if not check_email_configuration (owner_email , evidences ):
539+ return
540+
541+ from .email_utils import render_email_template , format_evidence_list
542+
543+ context = {
544+ "evidence_count" : len (evidences ),
545+ "evidence_list" : format_evidence_list (evidences ),
546+ "expired_since" : days ,
547+ "days_text" : "day" if days == 1 else "days" ,
548+ }
549+
550+ rendered = render_email_template ("expired_evidences" , context )
551+ if rendered :
552+ send_notification_email (rendered ["subject" ], rendered ["body" ], owner_email )
553+ else :
554+ logger .error (
555+ f"Failed to render expired_evidences email template for { owner_email } "
556+ )
557+
507558
508559@task ()
509560def send_evidence_expiring_soon_notification (owner_email , evidences , days ):
0 commit comments