Files
Barış Keserandgoogle-labs-jules[bot] 5f9fbd0c5a feat(users): Move badge calculation to async Celery tasks (#365)
- Created asynchronous tasks `calculate_badges_task`, `calculate_chat_badges_task`, and `reevaluate_all_badges_task` in `users/tasks.py`.
- Updated `users/signals.py` to invoke Celery tasks asynchronously via `.delay()` rather than running synchronous functions.
- Added `flower` for monitoring in `requirements.txt`.
- Configured Celery Result Backend to use Redis instead of `django-db` in `aniscrap_core/settings.py`.
- Scheduled `reevaluate_all_badges_task` to run daily via Celery Beat in `aniscrap_core/celery.py`.
- Updated `.jules/development-plan.md` to reflect completed Celery optimizations.

Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com>
2026-08-01 20:56:30 +00:00

44 lines
1.5 KiB
Python

from celery import shared_task
from django.contrib.auth import get_user_model
import logging
from .services import check_badges, check_chat_badges
logger = logging.getLogger(__name__)
User = get_user_model()
@shared_task(bind=True, max_retries=3)
def calculate_badges_task(self, user_id):
try:
user = User.objects.get(id=user_id)
check_badges(user)
return f"Badges checked for user {user_id}"
except User.DoesNotExist:
return f"User {user_id} not found"
except Exception as e:
logger.exception(f"Badge calculation failed for user {user_id}")
self.retry(exc=e, countdown=60)
@shared_task(bind=True, max_retries=3)
def calculate_chat_badges_task(self, user_id):
try:
user = User.objects.get(id=user_id)
check_chat_badges(user)
return f"Chat badges checked for user {user_id}"
except User.DoesNotExist:
return f"User {user_id} not found"
except Exception as e:
logger.exception(f"Chat badge calculation failed for user {user_id}")
self.retry(exc=e, countdown=60)
@shared_task(bind=True, max_retries=3)
def reevaluate_all_badges_task(self):
try:
user_ids = User.objects.values_list('id', flat=True)
for user_id in user_ids:
calculate_badges_task.delay(user_id)
calculate_chat_badges_task.delay(user_id)
return f"Triggered re-evaluation for {len(user_ids)} users."
except Exception as e:
logger.exception("Failed to reevaluate all badges.")
self.retry(exc=e, countdown=60)