From e9dfa284b7b0e49f53f6516b21293fad641aba01 Mon Sep 17 00:00:00 2001 From: gzbender Date: Wed, 10 Oct 2018 00:27:17 +0500 Subject: [PATCH] =?UTF-8?q?LIL-690=20=D0=9F=D0=BE=D1=81=D1=82=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D1=82=D1=8C=20=D0=BA=D0=BE=D0=BC=D0=B0=D0=BD=D0=B4=D1=83?= =?UTF-8?q?=20=D0=B2=20=D0=BA=D1=80=D0=BE=D0=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../management/commands/send_certificates.py | 56 +---------------- apps/notification/tasks.py | 60 +++++++++++++++++++ project/settings.py | 5 ++ 3 files changed, 67 insertions(+), 54 deletions(-) create mode 100644 apps/notification/tasks.py diff --git a/apps/notification/management/commands/send_certificates.py b/apps/notification/management/commands/send_certificates.py index 4c59dcb6..7ce5b8f4 100644 --- a/apps/notification/management/commands/send_certificates.py +++ b/apps/notification/management/commands/send_certificates.py @@ -1,17 +1,6 @@ -from datetime import datetime - from django.core.management.base import BaseCommand -from email.mime.image import MIMEImage -from django.contrib.staticfiles.storage import staticfiles_storage -from django.utils.timezone import now -from django.contrib.auth import get_user_model - -from apps.notification.models import UserNotification -from apps.notification.utils import send_email -from apps.payment.models import Payment, SchoolPayment, CoursePayment - -User = get_user_model() +from apps.notification.tasks import send_certificates class Command(BaseCommand): @@ -37,46 +26,5 @@ class Command(BaseCommand): ) def handle(self, *args, **options): - path_pattern = 'img/user-certificates/%d.jpg' - if options.get('email'): - file = open(staticfiles_storage.path(path_pattern % 1), 'rb') - try: - send_email('Грамота от Lil School', options['email'], 'notification/email/certificate.html', - attachments=[(file.name, file.read(), 'image/jpeg')]) - except: - pass - else: - print('Email has been sent') - finally: - file.close() - return - - date = datetime.strptime(options['date'], '%d-%m-%Y') if options.get('date') else now().date() - today = now().date() - users = set(list(SchoolPayment.objects.filter(date_end=date, add_days=False).values_list('user_id', flat=True))) - user_notifications_qs = UserNotification.objects.filter(user_id__in=users) - user_notifications = {un.user_id: un for un in user_notifications_qs} - notified_users = user_notifications_qs.filter(certificate_last_email__date=today).values_list( - 'user_id', flat=True).distinct() - for user_id in users: - if user_id in notified_users: - continue - un = user_notifications.get(user_id, UserNotification(user_id=user_id)) - print(un.user.email) - if options.get('dry_run'): - continue + send_certificates(email=options.get('email'), date=options.get('date'), dry_run=options.get('dry_run')) - un.certificate_number = un.certificate_number + 1 \ - if un.certificate_number and staticfiles_storage.exists(path_pattern % (un.certificate_number + 1)) \ - else 1 - file = open(staticfiles_storage.path(path_pattern % un.certificate_number), 'rb') - try: - send_email('Грамота от Lil School', un.user.email, 'notification/email/certificate.html', - attachments=[(file.name, file.read(), 'image/jpeg')]) - except: - print('Not OK') - continue - finally: - file.close() - un.certificate_last_email = now() - un.save() diff --git a/apps/notification/tasks.py b/apps/notification/tasks.py new file mode 100644 index 00000000..642a0d7b --- /dev/null +++ b/apps/notification/tasks.py @@ -0,0 +1,60 @@ +from datetime import datetime + +from django.contrib.auth import get_user_model +from django.contrib.staticfiles.storage import staticfiles_storage +from django.utils.timezone import now + +from apps.notification.models import UserNotification +from apps.notification.utils import send_email +from apps.payment.models import SchoolPayment +from project.celery import app + + +User = get_user_model() + + +@app.task +def send_certificates(email=None, date=None, dry_run=False): + path_pattern = 'img/user-certificates/%d.jpg' + if email: + file = open(staticfiles_storage.path(path_pattern % 1), 'rb') + try: + send_email('Грамота от Lil School', email, 'notification/email/certificate.html', + attachments=[(file.name, file.read(), 'image/jpeg')]) + except: + pass + else: + print('Email has been sent') + finally: + file.close() + return + + date = datetime.strptime(date, '%d-%m-%Y') if date else now().date() + today = now().date() + users = set(list(SchoolPayment.objects.filter(date_end=date, add_days=False).values_list('user_id', flat=True))) + user_notifications_qs = UserNotification.objects.filter(user_id__in=users) + user_notifications = {un.user_id: un for un in user_notifications_qs} + notified_users = user_notifications_qs.filter(certificate_last_email__date=today).values_list( + 'user_id', flat=True).distinct() + for user_id in users: + if user_id in notified_users: + continue + un = user_notifications.get(user_id, UserNotification(user_id=user_id)) + print(un.user.email) + if dry_run: + continue + + un.certificate_number = un.certificate_number + 1 \ + if un.certificate_number and staticfiles_storage.exists(path_pattern % (un.certificate_number + 1)) \ + else 1 + file = open(staticfiles_storage.path(path_pattern % un.certificate_number), 'rb') + try: + send_email('Грамота от Lil School', un.user.email, 'notification/email/certificate.html', + attachments=[(file.name, file.read(), 'image/jpeg')]) + except: + print('Not OK') + continue + finally: + file.close() + un.certificate_last_email = now() + un.save() diff --git a/project/settings.py b/project/settings.py index 5d5ca021..7f69b992 100644 --- a/project/settings.py +++ b/project/settings.py @@ -249,6 +249,11 @@ CELERY_BEAT_SCHEDULE = { 'schedule': timedelta(hours=1), 'args': (), }, + 'send_certificates': { + 'task': 'apps.notification.tasks.send_certificates', + 'schedule': crontab(hour=19), + 'args': (), + }, } try: