From be838d1d199d196f6a155ca8e6644f45068b3a78 Mon Sep 17 00:00:00 2001 From: Sayyid Hamid Mahdavi Date: Wed, 3 Dec 2025 13:49:39 +0330 Subject: [PATCH] push --- apps/promotions/models.py | 7 ++ .../__init__.py | 0 .../api/__init__.py | 0 .../api/email/__init__.py | 0 .../email_application_application_create.py | 0 .../email_application_application_list.py | 0 .../api/push/__init__.py | 0 .../push_application_application_create.py | 0 .../push/push_application_application_list.py | 0 .../api/push/push_user_push_user_retrieve.py | 0 .../client.py | 0 .../errors.py | 0 .../models/__init__.py | 0 .../models/email.py | 0 .../models/paginated_email_list.py | 0 .../models/paginated_push_message_list.py | 0 .../models/push_message.py | 0 .../models/push_user.py | 0 .../py.typed | 0 .../types.py | 0 utils/clients/notifications_client.py | 112 ++++++++++++++++++ 21 files changed, 119 insertions(+) rename utils/clients/{notifications_client => gooyal_notifications_client}/__init__.py (100%) rename utils/clients/{notifications_client => gooyal_notifications_client}/api/__init__.py (100%) rename utils/clients/{notifications_client => gooyal_notifications_client}/api/email/__init__.py (100%) rename utils/clients/{notifications_client => gooyal_notifications_client}/api/email/email_application_application_create.py (100%) rename utils/clients/{notifications_client => gooyal_notifications_client}/api/email/email_application_application_list.py (100%) rename utils/clients/{notifications_client => gooyal_notifications_client}/api/push/__init__.py (100%) rename utils/clients/{notifications_client => gooyal_notifications_client}/api/push/push_application_application_create.py (100%) rename utils/clients/{notifications_client => gooyal_notifications_client}/api/push/push_application_application_list.py (100%) rename utils/clients/{notifications_client => gooyal_notifications_client}/api/push/push_user_push_user_retrieve.py (100%) rename utils/clients/{notifications_client => gooyal_notifications_client}/client.py (100%) rename utils/clients/{notifications_client => gooyal_notifications_client}/errors.py (100%) rename utils/clients/{notifications_client => gooyal_notifications_client}/models/__init__.py (100%) rename utils/clients/{notifications_client => gooyal_notifications_client}/models/email.py (100%) rename utils/clients/{notifications_client => gooyal_notifications_client}/models/paginated_email_list.py (100%) rename utils/clients/{notifications_client => gooyal_notifications_client}/models/paginated_push_message_list.py (100%) rename utils/clients/{notifications_client => gooyal_notifications_client}/models/push_message.py (100%) rename utils/clients/{notifications_client => gooyal_notifications_client}/models/push_user.py (100%) rename utils/clients/{notifications_client => gooyal_notifications_client}/py.typed (100%) rename utils/clients/{notifications_client => gooyal_notifications_client}/types.py (100%) create mode 100644 utils/clients/notifications_client.py diff --git a/apps/promotions/models.py b/apps/promotions/models.py index e349e01..d35ce02 100644 --- a/apps/promotions/models.py +++ b/apps/promotions/models.py @@ -13,6 +13,7 @@ import logging from apps.promotions.handlers import ProcessorTypeChoices, BasePromotionHandler, PromotionTypeChoices from apps.users.models import User +from utils.clients.notifications_client import notifications_push_user from utils.clients.wallet_client import deposit_to_user_wallet_submit, deposit_to_user_wallet_verify from utils.models import BaseModel @@ -409,6 +410,12 @@ class Promotion(BaseModel): ) return False + try: + notifications_push_user(self.user_uuid, self.recipient.label, self.recipient.label, 5, extras={}) + except: + # TODO: log + pass + with transaction.atomic(): # updated = Plan.objects.filter(pk=self.plan.pk).update(balance=F('balance') - self.promotion_amount, **plan_data) updated = Plan.objects.filter(pk=self.plan.pk).update(**plan_data) diff --git a/utils/clients/notifications_client/__init__.py b/utils/clients/gooyal_notifications_client/__init__.py similarity index 100% rename from utils/clients/notifications_client/__init__.py rename to utils/clients/gooyal_notifications_client/__init__.py diff --git a/utils/clients/notifications_client/api/__init__.py b/utils/clients/gooyal_notifications_client/api/__init__.py similarity index 100% rename from utils/clients/notifications_client/api/__init__.py rename to utils/clients/gooyal_notifications_client/api/__init__.py diff --git a/utils/clients/notifications_client/api/email/__init__.py b/utils/clients/gooyal_notifications_client/api/email/__init__.py similarity index 100% rename from utils/clients/notifications_client/api/email/__init__.py rename to utils/clients/gooyal_notifications_client/api/email/__init__.py diff --git a/utils/clients/notifications_client/api/email/email_application_application_create.py b/utils/clients/gooyal_notifications_client/api/email/email_application_application_create.py similarity index 100% rename from utils/clients/notifications_client/api/email/email_application_application_create.py rename to utils/clients/gooyal_notifications_client/api/email/email_application_application_create.py diff --git a/utils/clients/notifications_client/api/email/email_application_application_list.py b/utils/clients/gooyal_notifications_client/api/email/email_application_application_list.py similarity index 100% rename from utils/clients/notifications_client/api/email/email_application_application_list.py rename to utils/clients/gooyal_notifications_client/api/email/email_application_application_list.py diff --git a/utils/clients/notifications_client/api/push/__init__.py b/utils/clients/gooyal_notifications_client/api/push/__init__.py similarity index 100% rename from utils/clients/notifications_client/api/push/__init__.py rename to utils/clients/gooyal_notifications_client/api/push/__init__.py diff --git a/utils/clients/notifications_client/api/push/push_application_application_create.py b/utils/clients/gooyal_notifications_client/api/push/push_application_application_create.py similarity index 100% rename from utils/clients/notifications_client/api/push/push_application_application_create.py rename to utils/clients/gooyal_notifications_client/api/push/push_application_application_create.py diff --git a/utils/clients/notifications_client/api/push/push_application_application_list.py b/utils/clients/gooyal_notifications_client/api/push/push_application_application_list.py similarity index 100% rename from utils/clients/notifications_client/api/push/push_application_application_list.py rename to utils/clients/gooyal_notifications_client/api/push/push_application_application_list.py diff --git a/utils/clients/notifications_client/api/push/push_user_push_user_retrieve.py b/utils/clients/gooyal_notifications_client/api/push/push_user_push_user_retrieve.py similarity index 100% rename from utils/clients/notifications_client/api/push/push_user_push_user_retrieve.py rename to utils/clients/gooyal_notifications_client/api/push/push_user_push_user_retrieve.py diff --git a/utils/clients/notifications_client/client.py b/utils/clients/gooyal_notifications_client/client.py similarity index 100% rename from utils/clients/notifications_client/client.py rename to utils/clients/gooyal_notifications_client/client.py diff --git a/utils/clients/notifications_client/errors.py b/utils/clients/gooyal_notifications_client/errors.py similarity index 100% rename from utils/clients/notifications_client/errors.py rename to utils/clients/gooyal_notifications_client/errors.py diff --git a/utils/clients/notifications_client/models/__init__.py b/utils/clients/gooyal_notifications_client/models/__init__.py similarity index 100% rename from utils/clients/notifications_client/models/__init__.py rename to utils/clients/gooyal_notifications_client/models/__init__.py diff --git a/utils/clients/notifications_client/models/email.py b/utils/clients/gooyal_notifications_client/models/email.py similarity index 100% rename from utils/clients/notifications_client/models/email.py rename to utils/clients/gooyal_notifications_client/models/email.py diff --git a/utils/clients/notifications_client/models/paginated_email_list.py b/utils/clients/gooyal_notifications_client/models/paginated_email_list.py similarity index 100% rename from utils/clients/notifications_client/models/paginated_email_list.py rename to utils/clients/gooyal_notifications_client/models/paginated_email_list.py diff --git a/utils/clients/notifications_client/models/paginated_push_message_list.py b/utils/clients/gooyal_notifications_client/models/paginated_push_message_list.py similarity index 100% rename from utils/clients/notifications_client/models/paginated_push_message_list.py rename to utils/clients/gooyal_notifications_client/models/paginated_push_message_list.py diff --git a/utils/clients/notifications_client/models/push_message.py b/utils/clients/gooyal_notifications_client/models/push_message.py similarity index 100% rename from utils/clients/notifications_client/models/push_message.py rename to utils/clients/gooyal_notifications_client/models/push_message.py diff --git a/utils/clients/notifications_client/models/push_user.py b/utils/clients/gooyal_notifications_client/models/push_user.py similarity index 100% rename from utils/clients/notifications_client/models/push_user.py rename to utils/clients/gooyal_notifications_client/models/push_user.py diff --git a/utils/clients/notifications_client/py.typed b/utils/clients/gooyal_notifications_client/py.typed similarity index 100% rename from utils/clients/notifications_client/py.typed rename to utils/clients/gooyal_notifications_client/py.typed diff --git a/utils/clients/notifications_client/types.py b/utils/clients/gooyal_notifications_client/types.py similarity index 100% rename from utils/clients/notifications_client/types.py rename to utils/clients/gooyal_notifications_client/types.py diff --git a/utils/clients/notifications_client.py b/utils/clients/notifications_client.py new file mode 100644 index 0000000..a478707 --- /dev/null +++ b/utils/clients/notifications_client.py @@ -0,0 +1,112 @@ +import logging + +import requests +import time +from django.conf import settings +from django.core.cache import cache +from django.db import models +from httpx import Request + +from utils.clients.gooyal_notifications_client import AuthenticatedClient +from utils.clients.gooyal_notifications_client.api.email import email_application_application_create +from utils.clients.gooyal_notifications_client.api.push import push_application_application_create +from utils.clients.gooyal_notifications_client.models import Email +from utils.clients.gooyal_notifications_client.models import PushMessage + +# logging.basicConfig( +# format="%(levelname)s [%(asctime)s] %(name)s - %(message)s", +# datefmt="%Y-%m-%d %H:%M:%S", +# level=logging.DEBUG +# ) +logger = logging.getLogger('ads.utils.notifications_client') + + + +def login_as_client_credentials(): + access_token = cache.get('ads_access_token') + # expires_in = self.auth_data.get('expires_in') + # created_at = self.auth_data.get('created_at') + # + # if access_token and expires_in > time.time() - created_at: + # return self.auth_data + if access_token: + logger.debug('token available in cache') + return access_token + + logger.debug('no token available in cache') + + data = { + "grant_type": 'client_credentials', + "scope": settings.OAUTH2_PROVIDER_SCOPES, + } + auth = (settings.OAUTH2_PROVIDER_CLIENT_ID, settings.OAUTH2_PROVIDER_CLIENT_SECRET) + + response = requests.post(f'{settings.OAUTH2_PROVIDER_BASE_PUBLIC_URL}/token/', + data=data, + auth=auth) + logger.debug(response.content) + + auth_data = response.json() + if 'access_token' in auth_data: + auth_data['created_at'] = time.time() + cache.set('ads_access_token', auth_data, timeout=auth_data.get('expires_in') - 5) + + return auth_data + + +def log_request(request: Request): + logger.debug(f'authorization: {request.headers["authorization"]}') + logger.debug( + f"Request event hook: {request.method} {request.url} {request.method} {request.headers} - Waiting for response") + + +def log_response(response): + request = response.request + logger.debug(f"Response event hook: {request.method} {request.url} - Status {response.status_code}") + # logger.debug(f"Response event hook: {response.read()}") + + +def get_notifications_client(): + access_token = login_as_client_credentials()['access_token'] + base_url = settings.NOTIFICATIONS_BASE_PUBLIC_URL + client = AuthenticatedClient(base_url=base_url, token=access_token, + httpx_args={"event_hooks": {"request": [log_request], "response": [log_response]}}, + ) + return client + + +def notifications_push_user(user_uuid, title, message, priority=5, extras=None): + class Tmp(): + def to_dict(self): + return { + 'title': title, + 'message': message, + 'priority': priority, + 'extras': extras, + } + + push_data = Tmp() + client = get_notifications_client() + response: PushMessage = push_application_application_create.sync(client=client, body=push_data, user_uuid=user_uuid) + + return response + + +def submit_event_in_queue(title=None, message=None): + try: + class Tmp(): + def to_dict(self): + return { + "queue": settings.NOTIFICATIONS_EVENT_QUEUE, + "title": title, + "message": message + } + + email_data = Tmp() + client = get_notifications_client() + response: Email = email_application_application_create.sync(client=client, body=email_data, + user_uuid=settings.NOTIFICATIONS_OPERATOR_USER_UUID) + + return response + except Exception as e: + logger.exception(e)