* refactor: Change import style for clarity * feat: Add iana_changes_updates_task() * chore: Squelch lint warning My linter does not like variables defined outside of __init__() * feat: Add PeriodicTask for iana_changes_updates_task * refactor: tasks instead of scripts on sync.views.notify() * test: Test iana_changes_updates_task * refactor: rename task for consistency * feat: Add iana_protocols_update_task * feat: Add PeriodicTask for iana protocols sync * refactor: Use protocol sync task instead of script in view * refactor: itertools.batched() not available until py312 * test: test iana_protocols_update_task * feat: Add idindex_update_task() Calls idindex generation functions and does the file update dance to put them in place. * chore: Add comments to bin/hourly * fix: annotate types and fix bug * feat: Create PeriodicTask for idindex_update_task * refactor: Move helpers into a class More testable this way * refactor: Make TempFileManager a context mgr * test: Test idindex_update_task * test: Test TempFileManager * fix: Fix bug in TestFileManager yay testing * feat: Add expire_ids_task() * feat: Create PeriodicTask for expire_ids_task * test: Test expire_ids_task * test: Test request timeout in iana_protocols_update_task * refactor: do not re-raise timeout exception Not sure this is the right thing to do, but it's the same as rfc_editor_index_update_task * feat: Add notify_expirations_task * feat: Add "weekly" celery beat crontab * refactor: Reorder crontab fields This matches the crontab file field order * feat: Add PeriodicTask for notify_expirations * test: Test notify_expirations_task * test: Add annotation to satisfy mypy
57 lines
1.9 KiB
Python
57 lines
1.9 KiB
Python
# Copyright The IETF Trust 2024, All Rights Reserved
|
|
#
|
|
# Celery task definitions
|
|
#
|
|
import datetime
|
|
import debug # pyflakes:ignore
|
|
|
|
from celery import shared_task
|
|
|
|
from ietf.utils import log
|
|
from ietf.utils.timezone import datetime_today
|
|
|
|
from .expire import (
|
|
in_draft_expire_freeze,
|
|
get_expired_drafts,
|
|
expirable_drafts,
|
|
send_expire_notice_for_draft,
|
|
expire_draft,
|
|
clean_up_draft_files,
|
|
get_soon_to_expire_drafts,
|
|
send_expire_warning_for_draft,
|
|
)
|
|
from .models import Document
|
|
|
|
|
|
@shared_task
|
|
def expire_ids_task():
|
|
try:
|
|
if not in_draft_expire_freeze():
|
|
log.log("Expiring drafts ...")
|
|
for doc in get_expired_drafts():
|
|
# verify expirability -- it might have changed after get_expired_drafts() was run
|
|
# (this whole loop took about 2 minutes on 04 Jan 2018)
|
|
# N.B., re-running expirable_drafts() repeatedly is fairly expensive. Where possible,
|
|
# it's much faster to run it once on a superset query of the objects you are going
|
|
# to test and keep its results. That's not desirable here because it would defeat
|
|
# the purpose of double-checking that a document is still expirable when it is actually
|
|
# being marked as expired.
|
|
if expirable_drafts(
|
|
Document.objects.filter(pk=doc.pk)
|
|
).exists() and doc.expires < datetime_today() + datetime.timedelta(1):
|
|
send_expire_notice_for_draft(doc)
|
|
expire_draft(doc)
|
|
log.log(f" Expired draft {doc.name}-{doc.rev}")
|
|
|
|
log.log("Cleaning up draft files")
|
|
clean_up_draft_files()
|
|
except Exception as e:
|
|
log.log("Exception in expire-ids: %s" % e)
|
|
raise
|
|
|
|
|
|
@shared_task
|
|
def notify_expirations_task(notify_days=14):
|
|
for doc in get_soon_to_expire_drafts(notify_days):
|
|
send_expire_warning_for_draft(doc)
|