From 87e8eda4c66c4d750385cda3f53c75e24bfd8ed2 Mon Sep 17 00:00:00 2001 From: Sayyid Hamid Mahdavi Date: Tue, 15 Sep 2020 11:54:53 +0430 Subject: [PATCH] add celery --- apps/users/models.py | 19 ++++++++----------- apps/users/tasks.py | 26 ++++++++++++++++++++++++++ gooyal_accounts/__init__.py | 3 +++ gooyal_accounts/celery.py | 25 +++++++++++++++++++++++++ gooyal_accounts/settings.py | 2 ++ requirements.in | 3 ++- utils/__init__.py | 0 utils/service_client.py | 10 ---------- 8 files changed, 66 insertions(+), 22 deletions(-) create mode 100644 apps/users/tasks.py create mode 100644 gooyal_accounts/celery.py delete mode 100644 utils/__init__.py delete mode 100644 utils/service_client.py diff --git a/apps/users/models.py b/apps/users/models.py index 925c0ae..b3a6154 100644 --- a/apps/users/models.py +++ b/apps/users/models.py @@ -10,10 +10,9 @@ from django.utils import timezone from django.utils.translation import gettext_lazy as _ from rest_framework.exceptions import APIException import uuid +from .tasks import send_notification from apps.users.constans import MAX_OTP_TRY, DEVELOPMENT_PHONE_NUMBERS -from utils.service_client import service_client - class UserManager(BaseUserManager): use_in_migrations = True @@ -168,15 +167,13 @@ class User(AbstractUser): def send_otp(self): self.notify(body=str(self.otp), title='OTP ') - def notify(self, body, title= None, notification_type='sms'): - if settings.DEBUG: - print(service_client.notification.submit_notification(phone_number=self.phone_number, - title=title, - body=body, - user_uuid=self.uuid, - notification_type=1, - )) - + def notify(self, body, title=None, notification_type='sms'): + send_notification.delay(phone_number=self.phone_number, + title=title, + body=body, + user_uuid=self.uuid, + notification_type=1, + ) def __str__(self): return f"{self.pk} - {self.username}" diff --git a/apps/users/tasks.py b/apps/users/tasks.py new file mode 100644 index 0000000..fcca359 --- /dev/null +++ b/apps/users/tasks.py @@ -0,0 +1,26 @@ +from celery import shared_task +from django.conf import settings +from service_clients import Client, AccountsClient + + +@shared_task +def send_notification(phone_number=None, + title=None, + body=None, + user_uuid=None, + email=None, + notification_type=1): + + service_client = Client( + client_id=settings.CLIENT_ID, + client_secret=settings.CLIENT_SECRET, + grant_type=AccountsClient.GRANT_CLIENT_CREDENTIALS + ) + service_client.login(scopes=['notification.notification:submit']) + service_client.notification.submit_notification(phone_number=phone_number, + title=title, + body=body, + user_uuid=user_uuid, + notification_type=notification_type, + email=email + ) diff --git a/gooyal_accounts/__init__.py b/gooyal_accounts/__init__.py index e69de29..cd04264 100644 --- a/gooyal_accounts/__init__.py +++ b/gooyal_accounts/__init__.py @@ -0,0 +1,3 @@ +from .celery import app as celery_app + +__all__ = ['celery_app'] diff --git a/gooyal_accounts/celery.py b/gooyal_accounts/celery.py new file mode 100644 index 0000000..c846734 --- /dev/null +++ b/gooyal_accounts/celery.py @@ -0,0 +1,25 @@ +from __future__ import absolute_import, unicode_literals + +import os + +from celery import Celery +from django.conf import settings + +# set the default Django settings module for the 'celery' program. +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'gooyal_accounts.settings') + +app = Celery('notification_service') + +# Using a string here means the worker doesn't have to serialize +# the configuration object 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') + +# Load task modules from all registered Django app configs. +app.autodiscover_tasks() + + +@app.task(bind=True) +def debug_task(self): + print('Request: {0!r}'.format(self.request)) diff --git a/gooyal_accounts/settings.py b/gooyal_accounts/settings.py index 8c6121d..0e62645 100644 --- a/gooyal_accounts/settings.py +++ b/gooyal_accounts/settings.py @@ -179,3 +179,5 @@ STATIC_URL = '/static/' BASE_NOTIFICATION_URL = config('BASE_NOTIFICATION_URL') CLIENT_ID = config('CLIENT_ID') CLIENT_SECRET = config('CLIENT_SECRET') + +CELERY_BROKER_URL = config('CELERY_BROKER_URL') diff --git a/requirements.in b/requirements.in index 69900e5..3b9abf3 100644 --- a/requirements.in +++ b/requirements.in @@ -11,4 +11,5 @@ mysqlclient django-mysql python-decouple gunicorn -gevent \ No newline at end of file +gevent +redis \ No newline at end of file diff --git a/utils/__init__.py b/utils/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/utils/service_client.py b/utils/service_client.py deleted file mode 100644 index 794800c..0000000 --- a/utils/service_client.py +++ /dev/null @@ -1,10 +0,0 @@ -from django.conf import settings - -from service_clients import Client, AccountsClient - -service_client = Client( - client_id=settings.CLIENT_ID, - client_secret=settings.CLIENT_SECRET, - grant_type=AccountsClient.GRANT_CLIENT_CREDENTIALS -) -# service_client.login(scopes=['notification.notification:submit'])