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) courses_purchased = CoursePayment.objects.filter(user=user, status__in=CoursePayment.PW_PAID_STATUSES).values_list('course_id', flat=True) 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), 'courses_purchased': ','.join(map(str, courses_purchased)) + ',' if courses_purchased else '', }) 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)