From 2fe49465b59c6cdd77ba82771c6b5e538d00f915 Mon Sep 17 00:00:00 2001 From: bobbyvish Date: Thu, 9 May 2024 16:21:48 +0530 Subject: [PATCH] refactor(manage_notification): solved the issue of cron for push notification and filter in report --- .gitignore | 1 + module_activity/api/views.py | 2 +- module_auth/api/views.py | 7 +- module_iam/views.py | 2 +- module_notification/cron_job.py | 46 ------- .../management/commands/send_notification.py | 2 +- module_notification/tasks.py | 116 ++++++++++++++++++ module_notification/views.py | 2 + module_project/settings/base.py | 8 +- templates/module_auth/user_view.html | 2 + 10 files changed, 133 insertions(+), 55 deletions(-) delete mode 100644 module_notification/cron_job.py create mode 100644 module_notification/tasks.py diff --git a/.gitignore b/.gitignore index 861ff4e..164044f 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ __pycache__/ *.py[cod] *$py.class +.vscode # C extensions diff --git a/module_activity/api/views.py b/module_activity/api/views.py index 5b5fad6..dc4191b 100644 --- a/module_activity/api/views.py +++ b/module_activity/api/views.py @@ -716,7 +716,7 @@ class MealDateAPIView(APIView): return ApiResponse.error( message=constants.FAILURE, errors="Invalid date format" ) - obj = self.model.objects.filter(principal=request.user.id, date=date_obj) + obj = self.model.objects.filter(principal=request.user.id, date=date_obj, deleted=False) serializer = self.serializer_class(obj, many=True) return ApiResponse.success(message=constants.SUCCESS, data=serializer.data) diff --git a/module_auth/api/views.py b/module_auth/api/views.py index 1dbb258..0581131 100644 --- a/module_auth/api/views.py +++ b/module_auth/api/views.py @@ -256,13 +256,16 @@ class GoogleSignin(APIView): player_id = request.data["player_id"] user_info = GoogleAuthService.get_user_info(access_token) - print(f"User Info : {user_info}") + print(f"User Info : {user_info} and player id is {player_id}") # Authenticate user with the email provided by Google user = IAmPrincipal.objects.filter(email=user_info['email']).first( ) or authenticate(email=user_info['email'], password=None) - if user is None: + if user: + # Update the player_id for the existing user + IAmPrincipal.objects.filter(email=user_info['email']).update(player_id=player_id) + else: # Create a new user if not found user = IAmPrincipal.objects.create_user( username=user_info['email'], diff --git a/module_iam/views.py b/module_iam/views.py index 4790c2b..2335d75 100644 --- a/module_iam/views.py +++ b/module_iam/views.py @@ -16,7 +16,7 @@ from django_datatables_view.base_datatable_view import BaseDatatableView from module_iam import iam_constant, permission from module_project import constants -from module_project.mixins import ActionMixin, DatatablesMixin +from module_project.mixins import ActionMixin from module_project.utils import JsonResponseUtil from .forms import (CustomAuthenticationForm, IAmPrincipalForm, IAmPrincipalResourceLinkForm, diff --git a/module_notification/cron_job.py b/module_notification/cron_job.py deleted file mode 100644 index b5c04d2..0000000 --- a/module_notification/cron_job.py +++ /dev/null @@ -1,46 +0,0 @@ -from datetime import datetime, timedelta -from .models import InAppNotification -from module_iam.models import IAmPrincipal, IAmPrincipalType -from module_activity.models import MealRecord, Bowel, MealSymptomRecord, Medication - - -def notification_for_meal_and_medication(): - current_date = datetime.now() - fifteen_days_ago = current_date - timedelta(days=20) - - users = IAmPrincipal.objects.filter( - last_login__gte=fifteen_days_ago, - principal_type=IAmPrincipalType.get_principal_user(), - ).values_list("id", flat=True) - - meal_obj = MealRecord.objects.filter(date=current_date).values_list( - "principal", flat=True - ) - medication_obj = Medication.objects.filter(date=current_date).values_list( - "principal", flat=True - ) - - # Remove IDs of users who have recorded meals for the current day - users_without_meals = set(users) - set(meal_obj) - users_without_medications = set(users) - set(medication_obj) - print(f"user id {set(users)}") - print( - f"userwithoutmeal {users_without_meals} and users_without_medication {users_without_medications}" - ) - - notifications_to_create = [] - for user_id in users_without_meals: - message = "Have you eaten yet? it's been a whiile since you logged a meal." - notifications_to_create.append( - InAppNotification(user_id=user_id, message=message) - ) - - for user_id in users_without_medications: - message = "Have you taken your medication today? Remember to log your medication to stay on track with your treatment!" - notifications_to_create.append( - InAppNotification(user_id=user_id, message=message) - ) - - # Bulk create notifications - if notifications_to_create: - InAppNotification.objects.bulk_create(notifications_to_create) diff --git a/module_notification/management/commands/send_notification.py b/module_notification/management/commands/send_notification.py index ef52552..4850a6f 100644 --- a/module_notification/management/commands/send_notification.py +++ b/module_notification/management/commands/send_notification.py @@ -1,6 +1,6 @@ from django.core.management.base import BaseCommand -from ...cron_job import notification_for_meal_and_medication +from ...tasks import notification_for_meal_and_medication class Command(BaseCommand): help = 'Sends notifications to users' diff --git a/module_notification/tasks.py b/module_notification/tasks.py new file mode 100644 index 0000000..181b89d --- /dev/null +++ b/module_notification/tasks.py @@ -0,0 +1,116 @@ +from datetime import datetime, timedelta +import itertools + +from module_project.service import OneSignalService +from .models import InAppNotification +from module_iam.models import IAmPrincipal, IAmPrincipalType +from module_activity.models import MealRecord, Bowel, MealSymptomRecord, Medication + + +def notification_for_meal(): + notification_message = "You haven’t filled your meal details yet." + current_date = datetime.now() + fifteen_days_ago = current_date - timedelta(days=20) + + users = IAmPrincipal.objects.filter( + last_login__gte=fifteen_days_ago, + principal_type=IAmPrincipalType.get_principal_user(), + ).values_list("id", flat=True) + + meal_obj = MealRecord.objects.filter(date=current_date).values_list( + "principal", flat=True + ) + + # Remove IDs of users who have recorded meals for the current day + users_without_meals = set(users) - set(meal_obj) + print(f"user id {set(users)}") + print( + f"userwithoutmeal {users_without_meals}" + ) + + player_ids = list( + IAmPrincipal.objects.filter( + id__in=users_without_meals + ).values_list("player_id", flat=True) + ) + # removing none from list + player_ids = list(itertools.filterfalse(lambda x: x is None, player_ids)) + + notifications_to_create = [] + if users_without_meals: + for user_id in users_without_meals: + message = notification_message + notifications_to_create.append( + InAppNotification(user_id=user_id, message=message) + ) + + # Bulk create notifications + if notifications_to_create: + InAppNotification.objects.bulk_create(notifications_to_create) + + try: + notification = OneSignalService() + response = notification.send_notification( + headings="Meal", + contents=notification_message, + include_player_ids=player_ids, + ) + except Exception as e: + print(f"Notification error in meal {str(e)}") + pass + +def notification_for_medication(): + notification_message = "You haven’t filled your medication details yet. " + current_date = datetime.now() + fifteen_days_ago = current_date - timedelta(days=20) + + users = IAmPrincipal.objects.filter( + last_login__gte=fifteen_days_ago, + principal_type=IAmPrincipalType.get_principal_user(), + ).values_list("id", flat=True) + + medication_obj = Medication.objects.filter(date=current_date).values_list( + "principal", flat=True + ) + + # Remove IDs of users who have recorded medication for the current day + users_without_medications = set(users) - set(medication_obj) + print(f"user id {set(users)}") + print( + f"users_without_medication {users_without_medications}" + ) + + player_ids = list( + IAmPrincipal.objects.filter( + id__in=users_without_medications + ).values_list("player_id", flat=True) + ) + # removing none from list + player_ids = list(itertools.filterfalse(lambda x: x is None, player_ids)) + + notifications_to_create = [] + if users_without_medications: + for user_id in users_without_medications: + message = notification_message + notifications_to_create.append( + InAppNotification(user_id=user_id, message=message) + ) + + # Bulk create notifications + if notifications_to_create: + InAppNotification.objects.bulk_create(notifications_to_create) + + try: + notification = OneSignalService() + response = notification.send_notification( + headings="Medication", + contents=notification_message, + include_player_ids=player_ids, + ) + except Exception as e: + print(f"Notification error in medication {str(e)}") + pass + + +def testing_cron(): + print("cron is working ") diff --git a/module_notification/views.py b/module_notification/views.py index ea4564d..5304ccb 100644 --- a/module_notification/views.py +++ b/module_notification/views.py @@ -181,6 +181,8 @@ class NotificationSendView(generic.View): # removing none from list player_ids = list(itertools.filterfalse(lambda x: x is None, player_ids)) + print(f"player id is {player_ids}") + try: notification = OneSignalService() response = notification.send_notification( diff --git a/module_project/settings/base.py b/module_project/settings/base.py index daf382b..d877059 100644 --- a/module_project/settings/base.py +++ b/module_project/settings/base.py @@ -285,8 +285,8 @@ SIMPLE_JWT = { } CRONJOBS = [ - ('0 18 * * *', 'manage_notification.cron_job.notification_for_meal_and_medication'), -] + ('0 18 * * *', 'module_notification.tasks.notification_for_meal', '>> {}'.format(str(BASE_DIR / 'logs/cron.log'))), + ('0 20 * * *', 'module_notification.tasks.notification_for_medication', '>> {}'.format(str(BASE_DIR / 'logs/cron.log'))), + # ('* * * * *', 'module_notification.tasks.testing_cron', '>> {}'.format(str(BASE_DIR / 'logs/cron.log'))), -# Additional configuration for cron jobs -CRONTAB_LOCK_JOBS = True \ No newline at end of file +] diff --git a/templates/module_auth/user_view.html b/templates/module_auth/user_view.html index d9a4718..c149702 100644 --- a/templates/module_auth/user_view.html +++ b/templates/module_auth/user_view.html @@ -352,8 +352,10 @@