uchill/backend/apps/users/tasks.py

214 lines
8.4 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
Celery задачи для пользователей.
"""
from celery import shared_task
from django.core.mail import send_mail, EmailMultiAlternatives
from django.conf import settings
from django.template.loader import render_to_string
from django.utils.html import strip_tags
import logging
logger = logging.getLogger(__name__)
@shared_task
def send_welcome_email_task(user_id):
"""Отправка приветственного письма новому пользователю."""
from .models import User
try:
user = User.objects.get(id=user_id)
subject = 'Добро пожаловать на платформу!'
# Контекст для шаблона
context = {
'user_full_name': user.get_full_name() or user.email,
'user_email': user.email,
}
# Загружаем HTML и текстовые шаблоны
html_message = render_to_string('emails/welcome.html', context)
plain_message = render_to_string('emails/welcome.txt', context)
# Используем EmailMultiAlternatives для HTML писем
msg = EmailMultiAlternatives(
subject=subject,
body=plain_message,
from_email=settings.DEFAULT_FROM_EMAIL,
to=[user.email]
)
msg.attach_alternative(html_message, "text/html")
msg.send()
logger.info(f'Welcome email sent to {user.email}')
return f'Welcome email sent to {user.email}'
except User.DoesNotExist:
logger.error(f'User {user_id} not found')
return f'User {user_id} not found'
except Exception as e:
logger.error(f'Error sending welcome email: {str(e)}', exc_info=True)
return f'Error sending welcome email: {str(e)}'
@shared_task
def send_verification_email_task(user_id, verification_token):
"""Отправка письма с подтверждением email."""
from .models import User
try:
user = User.objects.get(id=user_id)
# URL для подтверждения
verification_url = f"{settings.FRONTEND_URL}/verify-email?token={verification_token}"
subject = 'Подтвердите ваш email'
# Контекст для шаблона
context = {
'user_full_name': user.get_full_name() or user.email,
'verification_url': verification_url,
}
# Загружаем HTML и текстовые шаблоны
html_message = render_to_string('emails/verification.html', context)
plain_message = render_to_string('emails/verification.txt', context)
msg = EmailMultiAlternatives(
subject=subject,
body=plain_message,
from_email=settings.DEFAULT_FROM_EMAIL,
to=[user.email]
)
msg.attach_alternative(html_message, "text/html")
msg.send()
logger.info(f'Verification email sent to {user.email}')
return f'Verification email sent to {user.email}'
except User.DoesNotExist:
logger.error(f'User {user_id} not found')
return f'User {user_id} not found'
except Exception as e:
logger.error(f'Error sending verification email: {str(e)}', exc_info=True)
return f'Error sending verification email: {str(e)}'
@shared_task
def send_password_reset_email_task(user_id, reset_token):
"""Отправка письма для восстановления пароля."""
from .models import User
try:
user = User.objects.get(id=user_id)
# URL для сброса пароля
reset_url = f"{settings.FRONTEND_URL}/reset-password?token={reset_token}"
subject = 'Восстановление пароля'
# Контекст для шаблона
context = {
'user_full_name': user.get_full_name() or user.email,
'reset_url': reset_url,
}
# Загружаем HTML и текстовые шаблоны
html_message = render_to_string('emails/password_reset.html', context)
plain_message = render_to_string('emails/password_reset.txt', context)
msg = EmailMultiAlternatives(
subject=subject,
body=plain_message,
from_email=settings.DEFAULT_FROM_EMAIL,
to=[user.email]
)
msg.attach_alternative(html_message, "text/html")
msg.send()
logger.info(f'Password reset email sent to {user.email}')
return f'Password reset email sent to {user.email}'
except User.DoesNotExist:
logger.error(f'User {user_id} not found')
return f'User {user_id} not found'
except Exception as e:
logger.error(f'Error sending password reset email: {str(e)}', exc_info=True)
return f'Error sending password reset email: {str(e)}'
@shared_task
def send_student_welcome_email_task(user_id, reset_token):
"""Отправка приветственного письма новому студенту с ссылкой на установку пароля."""
from .models import User
try:
user = User.objects.get(id=user_id)
# URL для установки пароля
set_password_url = f"{settings.FRONTEND_URL}/reset-password?token={reset_token}"
subject = 'Добро пожаловать на платформу!'
# Контекст для шаблона
context = {
'user_full_name': user.get_full_name() or user.email,
'user_email': user.email,
'set_password_url': set_password_url,
}
# Загружаем HTML и текстовые шаблоны
html_message = render_to_string('emails/student_welcome.html', context)
plain_message = render_to_string('emails/student_welcome.txt', context)
msg = EmailMultiAlternatives(
subject=subject,
body=plain_message,
from_email=settings.DEFAULT_FROM_EMAIL,
to=[user.email]
)
msg.attach_alternative(html_message, "text/html")
msg.send()
logger.info(f'Student welcome email sent to {user.email}')
return f'Student welcome email sent to {user.email}'
except User.DoesNotExist:
logger.error(f'User {user_id} not found')
return f'User {user_id} not found'
except Exception as e:
logger.error(f'Error sending student welcome email: {str(e)}', exc_info=True)
return f'Error sending student welcome email: {str(e)}'
@shared_task
def send_mentor_invitation_email_task(connection_id, set_password_url=None):
"""Отправка письма приглашения от ментора: подтвердить приглашение (и при необходимости установить пароль)."""
from .models import MentorStudentConnection
try:
conn = MentorStudentConnection.objects.select_related('mentor', 'student').get(id=connection_id)
confirm_url = (f"{settings.FRONTEND_URL}/invitation/confirm?token={conn.confirm_token}" if conn.confirm_token else None)
subject = 'Вас пригласили в качестве ученика'
context = {
'mentor_name': conn.mentor.get_full_name() or conn.mentor.email,
'student_email': conn.student.email,
'confirm_url': confirm_url,
'set_password_url': set_password_url or None,
}
html_message = render_to_string('emails/mentor_invitation.html', context)
plain_message = render_to_string('emails/mentor_invitation.txt', context)
msg = EmailMultiAlternatives(
subject=subject,
body=plain_message,
from_email=settings.DEFAULT_FROM_EMAIL,
to=[conn.student.email],
)
msg.attach_alternative(html_message, "text/html")
msg.send()
logger.info(f'Mentor invitation email sent to {conn.student.email}')
return f'Mentor invitation email sent to {conn.student.email}'
except MentorStudentConnection.DoesNotExist:
logger.error(f'Connection {connection_id} not found')
return f'Connection {connection_id} not found'
except Exception as e:
logger.error(f'Error sending mentor invitation email: {str(e)}', exc_info=True)
return f'Error sending mentor invitation email: {str(e)}'