From 1275fe4e45d83b458c0b3a6fb88c4dd0859f56ae Mon Sep 17 00:00:00 2001 From: spwoodcock Date: Tue, 4 Feb 2025 23:49:50 +0000 Subject: [PATCH] feat: add scheduling scripts for task and user inactivity --- src/backend/scheduler/inactive_users.py | 35 ++++++++++++++++++++++++ src/backend/scheduler/unlock_tasks.py | 36 +++++++++++++++++++++++++ 2 files changed, 71 insertions(+) create mode 100755 src/backend/scheduler/inactive_users.py create mode 100755 src/backend/scheduler/unlock_tasks.py diff --git a/src/backend/scheduler/inactive_users.py b/src/backend/scheduler/inactive_users.py new file mode 100755 index 0000000000..92f932c59b --- /dev/null +++ b/src/backend/scheduler/inactive_users.py @@ -0,0 +1,35 @@ +#!/usr/bin/env python + +"""Warn users and delete inactive accounts. + +Runs on a schedule once per week Sunday 00:00 + +- Warning: 21, 14, 7 days before deletion. +- Deletion: 2yrs of inactivity. +""" + +import asyncio +import logging + +from psycopg import AsyncConnection + +from app.config import settings +from app.users.user_crud import process_inactive_users + +logging.basicConfig(level=logging.INFO) +log = logging.getLogger(__name__) + + +async def scheduled_process_inactive_users(): + """Process inactive users.""" + try: + async with await AsyncConnection.connect(settings.FMTM_DB_URL) as db: + log.info("Starting processing inactive users") + await process_inactive_users(db) + log.info("Finished processing inactive users") + except Exception as e: + log.error(f"Error during processing: {e}") + + +if __name__ == "__main__": + asyncio.run(scheduled_process_inactive_users()) diff --git a/src/backend/scheduler/unlock_tasks.py b/src/backend/scheduler/unlock_tasks.py new file mode 100755 index 0000000000..637a6be6af --- /dev/null +++ b/src/backend/scheduler/unlock_tasks.py @@ -0,0 +1,36 @@ +#!/usr/bin/env python + +"""Unlock tasks with no recent activity. + +Runs on a schedule every three hours. + +- If latest event is ASSIGN, then unlock if it was three days ago. +- If latest event was MAP and there has been no progress, + then unlock within an three hours. +""" + +import asyncio +import logging + +from psycopg import AsyncConnection + +from app.config import settings +from app.tasks.task_crud import trigger_unlock_tasks + +logging.basicConfig(level=logging.INFO) +log = logging.getLogger(__name__) + + +async def scheduled_unlock_inactive_tasks(): + """Process inactive tasks.""" + try: + async with await AsyncConnection.connect(settings.FMTM_DB_URL) as db: + log.info("Starting processing inactive tasks") + await trigger_unlock_tasks(db) + log.info("Finished processing inactive tasks") + except Exception as e: + log.error(f"Error during processing: {e}") + + +if __name__ == "__main__": + asyncio.run(scheduled_unlock_inactive_tasks())