Skip to content

Commit 2ccc230

Browse files
feat: send_apikey_usage_emails_task() (ietf-tools#7486)
* feat: send_apikey_usage_emails_task * chore: update test to use task instead of cmd * chore: add PeriodicTask * chore: remove old command + empty management dir * chore: remove now-empty bin/weekly * refactor: only consider keys that might have events --------- Co-authored-by: Robert Sparks <rjsparks@nostrum.com>
1 parent 020bdeb commit 2ccc230

7 files changed

Lines changed: 54 additions & 81 deletions

File tree

bin/weekly

Lines changed: 0 additions & 22 deletions
This file was deleted.

ietf/ietfauth/management/__init__.py

Whitespace-only changes.

ietf/ietfauth/management/commands/__init__.py

Whitespace-only changes.

ietf/ietfauth/management/commands/send_apikey_usage_emails.py

Lines changed: 0 additions & 52 deletions
This file was deleted.

ietf/ietfauth/tests.py

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
from ietf.nomcom.factories import NomComFactory
4242
from ietf.person.factories import PersonFactory, EmailFactory, UserFactory, PersonalApiKeyFactory
4343
from ietf.person.models import Person, Email, PersonalApiKey
44+
from ietf.person.tasks import send_apikey_usage_emails_task
4445
from ietf.review.factories import ReviewRequestFactory, ReviewAssignmentFactory
4546
from ietf.review.models import ReviewWish, UnavailablePeriod
4647
from ietf.stats.models import MeetingRegistration
@@ -853,9 +854,6 @@ def test_apikey_errors(self):
853854
key2.delete()
854855

855856
def test_send_apikey_report(self):
856-
from ietf.ietfauth.management.commands.send_apikey_usage_emails import Command
857-
from ietf.utils.mail import outbox, empty_outbox
858-
859857
person = RoleFactory(name_id='secr', group__acronym='secretariat').person
860858

861859
url = urlreverse('ietf.ietfauth.views.apikey_create')
@@ -880,9 +878,8 @@ def test_send_apikey_report(self):
880878
date = str(date_today())
881879

882880
empty_outbox()
883-
cmd = Command()
884-
cmd.handle(verbosity=0, days=7)
885-
881+
send_apikey_usage_emails_task(days=7)
882+
886883
self.assertEqual(len(outbox), len(endpoints))
887884
for mail in outbox:
888885
body = get_payload_text(mail)

ietf/person/tasks.py

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,50 @@
55
import datetime
66

77
from celery import shared_task
8+
9+
from django.conf import settings
810
from django.utils import timezone
911

1012
from ietf.utils import log
11-
from .models import PersonApiKeyEvent
13+
from ietf.utils.mail import send_mail
14+
from .models import PersonalApiKey, PersonApiKeyEvent
15+
1216

17+
@shared_task
18+
def send_apikey_usage_emails_task(days):
19+
"""Send usage emails to Persons who have API keys"""
20+
earliest = timezone.now() - datetime.timedelta(days=days)
21+
keys = PersonalApiKey.objects.filter(
22+
valid=True,
23+
personapikeyevent__time__gt=earliest,
24+
).distinct()
25+
for key in keys:
26+
events = PersonApiKeyEvent.objects.filter(key=key, time__gt=earliest)
27+
count = events.count()
28+
events = events[:32]
29+
if count:
30+
key_name = key.hash()[:8]
31+
subject = "API key usage for key '%s' for the last %s days" % (
32+
key_name,
33+
days,
34+
)
35+
to = key.person.email_address()
36+
frm = settings.DEFAULT_FROM_EMAIL
37+
send_mail(
38+
None,
39+
to,
40+
frm,
41+
subject,
42+
"utils/apikey_usage_report.txt",
43+
{
44+
"person": key.person,
45+
"days": days,
46+
"key": key,
47+
"key_name": key_name,
48+
"count": count,
49+
"events": events,
50+
},
51+
)
1352

1453
@shared_task
1554
def purge_personal_api_key_events_task(keep_days):

ietf/utils/management/commands/periodic_tasks.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,17 @@ def create_default_tasks(self):
241241
),
242242
)
243243

244+
PeriodicTask.objects.get_or_create(
245+
name="Send personal API key usage emails",
246+
task="ietf.person.tasks.send_apikey_usage_emails_task",
247+
kwargs=json.dumps(dict(days=7)),
248+
defaults=dict(
249+
enabled=False,
250+
crontab=self.crontabs["weekly"],
251+
description="Send personal API key usage summary emails for the past week",
252+
),
253+
)
254+
244255
PeriodicTask.objects.get_or_create(
245256
name="Purge old personal API key events",
246257
task="ietf.person.tasks.purge_personal_api_key_events_task",

0 commit comments

Comments
 (0)