Merge branch 'feature/LIL-690' into 'master'

LIL-690 Поставить команду в крон

See merge request lilcity/backend!190
remotes/origin/hotfix/LIL-691
cfwme 7 years ago
commit 94c7779eb6
  1. 56
      apps/notification/management/commands/send_certificates.py
  2. 60
      apps/notification/tasks.py
  3. 5
      project/settings.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()

@ -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()

@ -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:

Loading…
Cancel
Save