From 90ef093fcae99852b17687022d0d7731cb42458b Mon Sep 17 00:00:00 2001 From: Philip Date: Sat, 24 Feb 2024 19:54:57 +0300 Subject: [PATCH] supscriptions --- .gitignore | 1 + README.md | 3 +++ SubscribesApp/urls.py | 9 +++++++++ SubscribesApp/views.py | 33 +++++++++++++++++++++++++++++++-- TWB/celery.py | 27 +++++++++++++++++++++++++++ TWB/settings.py | 23 +++++++++++++++-------- TWB/tasks.py | 40 ++++++++++++++++++++++++++++++++++++++++ TWB/urls.py | 6 +++--- requirements.pip | 6 +++--- 9 files changed, 132 insertions(+), 16 deletions(-) create mode 100644 README.md create mode 100644 SubscribesApp/urls.py create mode 100755 TWB/celery.py create mode 100644 TWB/tasks.py diff --git a/.gitignore b/.gitignore index 3c4017b..6c59ab0 100644 --- a/.gitignore +++ b/.gitignore @@ -414,4 +414,5 @@ fabric.properties # Android studio 3.1+ serialized cache file .idea/caches/build_file_checksums.ser +celerybeat-schedule.db diff --git a/README.md b/README.md new file mode 100644 index 0000000..27c65d6 --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +celery -A TWB.celery:app worker -l info + +celery -A TWB.celery:app beat -l info diff --git a/SubscribesApp/urls.py b/SubscribesApp/urls.py new file mode 100644 index 0000000..eee642f --- /dev/null +++ b/SubscribesApp/urls.py @@ -0,0 +1,9 @@ +from django.urls import path + +from SubscribesApp.views import SubscribersView + +urlpatterns = [ + + path('auto-subscribe/', SubscribersView.as_view(), name='auto_subscribe'), + +] \ No newline at end of file diff --git a/SubscribesApp/views.py b/SubscribesApp/views.py index 91ea44a..3f4b207 100644 --- a/SubscribesApp/views.py +++ b/SubscribesApp/views.py @@ -1,3 +1,32 @@ -from django.shortcuts import render +from django.contrib.auth.models import User +from rest_framework import status +from rest_framework.permissions import IsAuthenticated +from rest_framework.response import Response +from rest_framework.views import APIView -# Create your views here. +from SubscribesApp.models import SubscribeForUser + + +class SubscribersView(APIView): + # permission_classes = [IsAuthenticated] + + def post(self, request): + data = request.data + email = data['email'] + email_notification = data['email_notification'] + auto_subscribe = data['auto_subscribe'] + + user = User.objects.get(email=email) + subscribe_for_user = SubscribeForUser.objects.filter(user_id=user.id) + + if email_notification: + subscribe_for_user.update(receive_finish_subscribe_msg=True) + else: + subscribe_for_user.update(receive_finish_subscribe_msg=False) + + if auto_subscribe: + subscribe_for_user.update(auto_continue=True) + else: + subscribe_for_user.update(auto_continue=False) + + return Response("Subscriptions updated successfully", status=status.HTTP_200_OK) diff --git a/TWB/celery.py b/TWB/celery.py new file mode 100755 index 0000000..ab57f49 --- /dev/null +++ b/TWB/celery.py @@ -0,0 +1,27 @@ +from __future__ import absolute_import + +import os + +from celery import Celery +from celery.schedules import crontab +from django.conf import settings + +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "TWB.settings") + +app = Celery('bo', include=['TWB.tasks']) +app.config_from_object('django.conf:settings', namespace='CELERY') +app.autodiscover_tasks(lambda: settings.INSTALLED_APPS) + +app.conf.beat_schedule = { + 'update-currency-rates': { + 'task': 'TWB.tasks.check_auto_subscribe', + 'schedule': crontab(minute=0, hour='*/1'), + }, + 'subscription_expiration_check': { + 'task': 'TWB.tasks.subscription_expiration_check', + 'schedule': crontab(hour=0, minute=0), + # 'schedule': crontab(minute='*', hour='*'), + }, +} + +app.conf.broker_url = settings.CELERY_BROKER_URL diff --git a/TWB/settings.py b/TWB/settings.py index cf81397..ad8a0c4 100644 --- a/TWB/settings.py +++ b/TWB/settings.py @@ -11,6 +11,7 @@ https://docs.djangoproject.com/en/4.2/ref/settings/ """ from pathlib import Path +from decouple import config # Build paths inside the project like this: BASE_DIR / 'subdir'. BASE_DIR = Path(__file__).resolve().parent.parent @@ -60,7 +61,6 @@ AUTHENTICATION_BACKENDS = [ ] - SOCIALACCOUNT_PROVIDERS = { 'google': { 'SCOPE': [ @@ -172,11 +172,8 @@ CHANNEL_LAYERS = { } - - - - - +POSTGRES_DB = config('POSTGRES_DB') +POSTGRES_USER = config('POSTGRES_USER') # Database @@ -185,8 +182,8 @@ CHANNEL_LAYERS = { DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', - 'NAME': 'twbDB', - 'USER': 'test_user', + 'NAME': POSTGRES_DB, + 'USER': POSTGRES_USER, 'PASSWORD': 'test_db_pass', 'HOST': '127.0.0.1', 'PORT': '5432', @@ -336,6 +333,16 @@ CKEDITOR_CONFIGS = { } } +CELERY_BROKER_URL = config('CELERY_BROKER_URL') +CELERY_RESULT_BACKEND = config('CELERY_RESULT_BACKEND') + +EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' +EMAIL_HOST = 'smtp.gmail.com' +EMAIL_USE_TLS = True +EMAIL_PORT = 587 +EMAIL_HOST_USER = config('EMAIL_HOST_USER') +EMAIL_HOST_PASSWORD = config('EMAIL_HOST_PASSWORD') + # CKEDITOR_OPTIONS = { # 'height': 291, diff --git a/TWB/tasks.py b/TWB/tasks.py new file mode 100644 index 0000000..7a1dd5e --- /dev/null +++ b/TWB/tasks.py @@ -0,0 +1,40 @@ +from datetime import datetime, timedelta, timezone + +from SubscribesApp.models import SubscribeForUser +from TWB import settings +from TWB.celery import app +from django.core.mail import send_mail + + +@app.task +def check_auto_subscribe(): + current_time = datetime.now() + subscribes = SubscribeForUser.objects.filter(auto_continue=True) + if subscribes: + for subscribe in subscribes: + if subscribe.paid_period_to_DT and subscribe.paid_period_to_DT <= current_time + timedelta(hours=1): + user_email = subscribe.user.email + subject = 'Подписка продлена!' + message = 'Ваша подписка успешно продлена!' + send_mail(subject, message, settings.EMAIL_HOST_USER, [user_email], fail_silently=False) + else: + print('Нету подписок') + + +@app.task +def subscription_expiration_check(): + current_time = datetime.now() + subscribes = SubscribeForUser.objects.filter(paid_period_to_DT__gte=current_time) + + for subscribe in subscribes: + expiration_date = subscribe.paid_period_to_DT + remaining_days = (expiration_date - current_time).days + + if remaining_days <= 7: + message = f'Ваша подписка заканчивается через {remaining_days} дня. Пожалуйста, продлите её.' + + user_email = subscribe.user.email + subject = 'Подписка истекает!' + send_mail(subject, message, settings.EMAIL_HOST_USER, [user_email], fail_silently=False) + else: + print('Нету подписок') \ No newline at end of file diff --git a/TWB/urls.py b/TWB/urls.py index cd3a843..036878b 100644 --- a/TWB/urls.py +++ b/TWB/urls.py @@ -1,4 +1,3 @@ - from django.contrib import admin from django.urls import path, include from django.conf.urls.static import static @@ -9,7 +8,6 @@ from AuthApp.views import login_View handler404 = Page404 urlpatterns = [ - # path('admin/', admin.site.urls), path('ckeditor/', include('ckeditor_uploader.urls')), path('i18n/', include('django.conf.urls.i18n')), @@ -39,7 +37,9 @@ urlpatterns = [ path('test_404', Page404, name='page_404'), - path('', include('PushMessages.urls')) + path('', include('PushMessages.urls')), + path('', include('SubscribesApp.urls')), + ] from django.conf.urls.i18n import i18n_patterns diff --git a/requirements.pip b/requirements.pip index 80e15ca..9a1fb1b 100644 --- a/requirements.pip +++ b/requirements.pip @@ -2,7 +2,6 @@ Django==4.2.2 django-ckeditor==6.5.1 psycopg2-binary==2.9.6 requests -Pillow==9.5.0 django-modeltranslation==0.18.10 overpass geopy @@ -13,5 +12,6 @@ django-colorfield django-webpush==0.3.5 django-allauth==0.60.0 pytz==2024.1 -#django-tz-detect==0.4.0 - +celery==5.3.6 +djangorestframework==3.14.0 +python-decouple==3.8