Skip to content

Commit c923886

Browse files
committed
feat: add notification for the each day for expired evidences
1 parent a900747 commit c923886

File tree

2 files changed

+63
-0
lines changed

2 files changed

+63
-0
lines changed

backend/core/tasks.py

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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"))
199228
def 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()
509560
def send_evidence_expiring_soon_notification(owner_email, evidences, days):
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
subject: "CISO Assistant: Evidence is expired since ${expired_since} ${days_text}"
2+
body: |
3+
Hello,
4+
5+
You have ${evidence_count} evidence(s) expired since ${expired_since} ${days_text}:
6+
7+
${evidence_list}
8+
9+
Please log in to your CISO Assistant portal to review and update these evidences:
10+
${ciso_assistant_url}
11+
12+
Thank you.

0 commit comments

Comments
 (0)