From f732bb65f4e2f35211b50139f7da04fdeacd7adc Mon Sep 17 00:00:00 2001 From: Priyansh Garg Date: Mon, 29 Jan 2024 02:40:07 +0530 Subject: [PATCH] Setup celery. --- AlumniConnect/__init__.py | 7 ++++-- AlumniConnect/celery.py | 33 ++++++++++++++++++++++------- AlumniConnect/settings/common.py | 5 +++-- applications/alumniprofile/tasks.py | 15 +++++-------- 4 files changed, 38 insertions(+), 22 deletions(-) diff --git a/AlumniConnect/__init__.py b/AlumniConnect/__init__.py index ba875009..d42315d5 100644 --- a/AlumniConnect/__init__.py +++ b/AlumniConnect/__init__.py @@ -1,2 +1,5 @@ -from __future__ import absolute_import -from .celery import app as celery_app \ No newline at end of file +# This will make sure the Celery app is always imported when +# Django starts so that @shared_task decorator will use this app. +from .celery import app as celery_app + +__all__ = ('celery_app',) diff --git a/AlumniConnect/celery.py b/AlumniConnect/celery.py index c6272ca9..ffd0fa45 100644 --- a/AlumniConnect/celery.py +++ b/AlumniConnect/celery.py @@ -1,16 +1,33 @@ -# Refer Here : https://realpython.com/asynchronous-tasks-with-django-and-celery/ +# Refer Here : https://docs.celeryq.dev/en/stable/django/first-steps-with-django.html -from __future__ import absolute_import import os + from celery import Celery -from django.conf import settings +from celery.schedules import crontab + +# Set the default Django settings module for the 'celery' program. +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'AlumniConnect.settings.development') + +app = Celery('AlumniConnect') + +# Using a string here means the worker doesn't have to serialize +# the configuration object to child processes (no need to convert +# configuration object to byte stream since it can just pass the +# `django.conf:settings` string to child processes). +# - namespace='CELERY' means all celery-related configuration keys +# should have a `CELERY_` prefix. +app.config_from_object('django.conf:settings', namespace='CELERY') -os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'AlumniConnect.settings.production') -app = Celery("AlumniConnect") +# Load task modules from all registered Django apps. +app.autodiscover_tasks() -app.config_from_object("django.conf:settings") -app.autodiscover_tasks(lambda : settings.INSTALLED_APPS) +app.conf.beat_schedule = { + 'send-birthday-wishes': { + 'task': 'applications.alumniprofile.tasks.send_birthday_wishes', + 'schedule': crontab(hour=13, minute=5), + }, +} @app.task(bind=True) def debug_task(self): - print('Request: {0!r}'.format(self.request)) \ No newline at end of file + print(f'Request: {self.request!r}') diff --git a/AlumniConnect/settings/common.py b/AlumniConnect/settings/common.py index 4f6cfb4d..38e7a33c 100644 --- a/AlumniConnect/settings/common.py +++ b/AlumniConnect/settings/common.py @@ -135,12 +135,13 @@ TEMPUS_DOMINUS_LOCALIZE = True # CELERY STUFF -BROKER_URL = 'redis://localhost:6379' +CELERY_BROKER_URL = 'redis://localhost:6379' CELERY_RESULT_BACKEND = 'redis://localhost:6379' CELERY_ACCEPT_CONTENT = ['application/json'] CELERY_TASK_SERIALIZER = 'json' CELERY_RESULT_SERIALIZER = 'json' -CELERY_TIMEZONE = 'Asia/Kolkata' +CELERY_TIMEZONE = TIME_ZONE + PASSWORD_RESET_TIMEOUT_DAYS = 1 ANYMAIL = { # (exact settings here depend on your ESP...) diff --git a/applications/alumniprofile/tasks.py b/applications/alumniprofile/tasks.py index 583938fb..2f0aa2af 100644 --- a/applications/alumniprofile/tasks.py +++ b/applications/alumniprofile/tasks.py @@ -1,26 +1,21 @@ -from celery.task.schedules import crontab -from celery.decorators import periodic_task +from celery import shared_task from celery.utils.log import get_task_logger from datetime import date + from .models import Profile from .funcs import send_birthday_wish -import datetime logger = get_task_logger(__name__) -@periodic_task( - run_every=(crontab(hour=13, minute=5)), - name="send_birthday_wish_celery", - ignore_result=True -) -def send_birthday_wish_celery(): +@shared_task +def send_birthday_wishes(): today = date.today() birthday_users = Profile.objects.filter(date_of_birth__day=today.day, date_of_birth__month=today.month) if birthday_users: logger.info("{} People have birthdays today".format(len(birthday_users))) for user in birthday_users: - send_birthday_wish(user.name, user.email) + # send_birthday_wish(user.name, user.email) logger.info("Mail Sent to {} at {}".format(user.name, user.email)) logger.info("Mail Sent to {} People Today!".format(len(birthday_users))) else: