From dc9f88e299c05f16848356443e263518cba009b8 Mon Sep 17 00:00:00 2001 From: Ihsan Ullah Date: Tue, 17 Jun 2025 20:52:16 +0500 Subject: [PATCH 1/3] fix to run result sbmission(with copy to predictions dir) --- compute_worker/compute_worker.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/compute_worker/compute_worker.py b/compute_worker/compute_worker.py index 85a2cbe06..e2edafc10 100644 --- a/compute_worker/compute_worker.py +++ b/compute_worker/compute_worker.py @@ -588,7 +588,7 @@ async def _run_program_directory(self, program_dir, kind): Function responsible for running program directory Args: - - program_dir : can be either ingestion program or program/submission + - program_dir : can be either ingestion program or program(submission or scoring) - kind : either `program` or `ingestion` """ # If the directory doesn't even exist, move on @@ -609,6 +609,9 @@ async def _run_program_directory(self, program_dir, kind): logger.info( "Program directory missing metadata, assuming it's going to be handled by ingestion" ) + # Copy program dir content to output directory because in case of only result submission, + # we need to copy the result submission files because the scoring program will use these as predictions + shutil.copytree(program_dir, self.output_dir) return else: raise SubmissionException("Program directory missing 'metadata.yaml/metadata'") From 9fbbd329cdbee0f094bec8e7d041d1b636bd093f Mon Sep 17 00:00:00 2001 From: Ihsan Ullah Date: Wed, 18 Jun 2025 17:32:21 +0500 Subject: [PATCH 2/3] task added to delete non activated users who have not activated their accounts for more than 3 days of creation --- src/apps/profiles/tasks.py | 27 ++++++++++++++++++++++++++- src/settings/base.py | 4 ++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/src/apps/profiles/tasks.py b/src/apps/profiles/tasks.py index 4dabbf2f6..92dbdf56a 100644 --- a/src/apps/profiles/tasks.py +++ b/src/apps/profiles/tasks.py @@ -3,7 +3,7 @@ from datetime import timedelta from django.utils.timezone import now from celery_config import app - +from django.contrib.auth import get_user_model from profiles.models import DeletedUser logger = logging.getLogger() @@ -26,3 +26,28 @@ def clean_deleted_users(): logger.info( "Task clean_deleted_users Completed. Duration = {:.3f} seconds".format(elapsed_time) ) + + +@app.task(queue="site-worker") +def clean_non_activated_users(): + try: + starting_time = time.process_time() + logger.info("Task clean_non_activated_users Started") + + # Get User model + User = get_user_model() + + # Calculate the threshold date (3 days ago) + three_days_ago = now() - timedelta(days=3) + + # Delete users who have not activated their accounts in 3 days + deleted_count, _ = User.objects.filter(is_active=False, is_deleted=False, date_joined__lt=three_days_ago).delete() + + logger.info(f"Deleted {deleted_count} non activated users from User table.") + + elapsed_time = time.process_time() - starting_time + logger.info( + "Task clean_non_activated_users Completed. Duration = {:.3f} seconds".format(elapsed_time) + ) + except Exception as e: + logger.exception(f"Failed to clean non-activated users\n{e}") diff --git a/src/settings/base.py b/src/settings/base.py index 50d1616e2..dba14455c 100644 --- a/src/settings/base.py +++ b/src/settings/base.py @@ -240,6 +240,10 @@ 'task': 'profiles.tasks.clean_deleted_users', 'schedule': timedelta(days=1), # Run every 24 hours }, + 'clean_non_activated_users': { + 'task': 'profiles.tasks.clean_non_activated_users', + 'schedule': timedelta(days=1), # Run every 24 hours + }, } CELERY_TIMEZONE = 'UTC' CELERY_WORKER_PREFETCH_MULTIPLIER = 1 From a574721380169df26815da525056dbe184e02cb8 Mon Sep 17 00:00:00 2001 From: Ihsan Ullah Date: Sat, 21 Jun 2025 12:41:37 +0500 Subject: [PATCH 3/3] additional checks added before deletion, compute worker changes reverted --- compute_worker/compute_worker.py | 5 +---- src/apps/profiles/tasks.py | 19 +++++++++++++++++-- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/compute_worker/compute_worker.py b/compute_worker/compute_worker.py index e2edafc10..85a2cbe06 100644 --- a/compute_worker/compute_worker.py +++ b/compute_worker/compute_worker.py @@ -588,7 +588,7 @@ async def _run_program_directory(self, program_dir, kind): Function responsible for running program directory Args: - - program_dir : can be either ingestion program or program(submission or scoring) + - program_dir : can be either ingestion program or program/submission - kind : either `program` or `ingestion` """ # If the directory doesn't even exist, move on @@ -609,9 +609,6 @@ async def _run_program_directory(self, program_dir, kind): logger.info( "Program directory missing metadata, assuming it's going to be handled by ingestion" ) - # Copy program dir content to output directory because in case of only result submission, - # we need to copy the result submission files because the scoring program will use these as predictions - shutil.copytree(program_dir, self.output_dir) return else: raise SubmissionException("Program directory missing 'metadata.yaml/metadata'") diff --git a/src/apps/profiles/tasks.py b/src/apps/profiles/tasks.py index 92dbdf56a..c8c752adc 100644 --- a/src/apps/profiles/tasks.py +++ b/src/apps/profiles/tasks.py @@ -5,6 +5,7 @@ from celery_config import app from django.contrib.auth import get_user_model from profiles.models import DeletedUser +from competitions.models import Competition, Submission logger = logging.getLogger() @@ -40,8 +41,22 @@ def clean_non_activated_users(): # Calculate the threshold date (3 days ago) three_days_ago = now() - timedelta(days=3) - # Delete users who have not activated their accounts in 3 days - deleted_count, _ = User.objects.filter(is_active=False, is_deleted=False, date_joined__lt=three_days_ago).delete() + # Filter users who are inactive, not deleted and created more than 3 days ago + users_to_delete = User.objects.filter( + is_active=False, + is_deleted=False, + date_joined__lt=three_days_ago + ) + + # Exclude users who have created any competitions or made submissions + users_to_delete = users_to_delete.exclude( + id__in=Competition.objects.values_list('created_by_id', flat=True) + ).exclude( + id__in=Submission.objects.values_list('owner_id', flat=True) + ) + + # Delete users + deleted_count, _ = users_to_delete.delete() logger.info(f"Deleted {deleted_count} non activated users from User table.")