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