You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

109 lines
4.9 KiB

from datetime import datetime
from django.contrib.auth import get_user_model
from django.contrib.contenttypes.models import ContentType
from django.contrib.staticfiles.storage import staticfiles_storage
from django.utils.timezone import now
from django.db.models import Max
from apps.notification.models import UserNotification
from apps.notification.utils import send_email
from apps.payment.models import SchoolPayment, CoursePayment, Payment, UserGiftCertificate
from project.celery import app
from project.utils.db import format_sql, execute_sql
from project.sengrid import get_sendgrid_client
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').date() 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:
print('skip', user_id)
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')], user_notification=un)
except:
print('Not OK')
continue
finally:
file.close()
un.certificate_last_email = now()
un.save()
@app.task
def sendgrid_update_recipients():
date_format = '%m/%d/%Y'
ct_course = ContentType.objects.get_for_model(CoursePayment).id
ct_school = ContentType.objects.get_for_model(SchoolPayment).id
course_payments_sql = '''
select {p.user}, max({p.created_at}) from {p} where {p}.polymorphic_ctype_id = {ct} group by {p.user}
'''
course_payments = {p[0]: p[1] for p in execute_sql(format_sql(course_payments_sql, p=Payment, ct=ct_course))}
school_payments_sql = '''
select {p.user}, max({p.created_at}) from {p} where {p}.polymorphic_ctype_id = {ct} group by {p.user}
'''
school_payments = {p[0]: p[1] for p in execute_sql(format_sql(school_payments_sql, p=Payment, ct=ct_school))}
users = list(User.objects.filter(role=User.USER_ROLE))
data = []
for user in users:
last_course_purchase = course_payments.get(user.id) and course_payments.get(user.id).strftime(date_format)
last_school_purchase = school_payments.get(user.id) and school_payments.get(user.id).strftime(date_format)
data.append({
'first_name': user.first_name,
'last_name': user.last_name,
'email': user.email,
'last_login': user.last_login and user.last_login.strftime(date_format),
'last_course_purchase': last_course_purchase,
'last_school_purchase': last_school_purchase,
# 'gender': {User.NOT_DEFINED: '', User.MALE: 'Мужчина', User.FEMALE: 'Женщина'}[user.gender] if user.gender else '',
'birthday': user.birthday and user.birthday.strftime(date_format),
'date_joined': user.date_joined.strftime(date_format),
})
sg = get_sendgrid_client()
response = sg.client.contactdb.recipients.patch(request_body=data)
print(response.body)
@app.task
def send_gift_certificate(user_gift_certificate):
user_gift_certificate = UserGiftCertificate.objects.get(id=user_gift_certificate)
send_email('Подарочный сертификат от Lil School', user_gift_certificate.user.email, 'notification/email/gift_certificate.html',
inline_images=[('twitter_icon', 'img/twitter.png'), ('fb_icon', 'img/fb.png'), ('instagram_icon', 'img/instagram.png'),],
user_gift_certificate=user_gift_certificate, gift_certificate=user_gift_certificate.gift_certificate)