full
Deploy to Production / deploy-production (push) Successful in 26s Details

This commit is contained in:
root 2026-02-13 20:35:13 +03:00
parent 118f33f77b
commit 8c6406269c
17 changed files with 1138 additions and 293 deletions

View File

@ -107,35 +107,179 @@ def send_email_notification(notification):
# Если шаблон не содержит body, используем дефолтный # Если шаблон не содержит body, используем дефолтный
if not email_body: if not email_body:
action_button = ''
if notification.action_url:
action_url = f"{settings.FRONTEND_URL}{notification.action_url}"
action_button = f'''
<tr>
<td style="padding-top: 8px; padding-bottom: 24px; text-align: center;">
<table role="presentation" cellspacing="0" cellpadding="0" border="0" align="center">
<tr>
<td style="background-color: #7444FD; border-radius: 4px;">
<a href="{action_url}" style="display: inline-block; padding: 14px 32px; font-size: 16px; font-weight: 500; color: #FFFFFF; text-decoration: none; border-radius: 4px;">
Перейти
</a>
</td>
</tr>
</table>
</td>
</tr>
'''
email_body = f""" email_body = f"""
<html> <!DOCTYPE html>
<body style="font-family: Arial, sans-serif; max-width: 600px; margin: 0 auto;"> <html lang="ru">
<div style="background-color: #f8f9fa; padding: 20px; border-radius: 8px;"> <head>
<h2 style="color: #333;">{notification.title}</h2> <meta charset="UTF-8">
<div style="background-color: white; padding: 20px; border-radius: 8px; margin: 20px 0;"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<p style="color: #666; line-height: 1.6;">{notification.message}</p> <meta http-equiv="X-UA-Compatible" content="IE=edge">
</div> <!--[if mso]>
{f'<a href="{settings.FRONTEND_URL}{notification.action_url}" style="display: inline-block; background-color: #3B82F6; color: white; padding: 12px 24px; text-decoration: none; border-radius: 6px;">Перейти</a>' if notification.action_url else ''} <style type="text/css">
<p style="color: #999; font-size: 12px; margin-top: 20px;"> body, table, td {{font-family: Arial, sans-serif !important;}}
Это автоматическое уведомление от образовательной платформы. </style>
<![endif]-->
</head>
<body style="margin: 0; padding: 0; background-color: #FAFAFA; font-family: 'Roboto', -apple-system, BlinkMacSystemFont, 'Segoe UI', Arial, sans-serif;">
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="background-color: #FAFAFA;">
<tr>
<td align="center" style="padding: 40px 20px;">
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="600" style="max-width: 600px; background-color: #FFFFFF; border-radius: 8px; box-shadow: 0 2px 8px rgba(0,0,0,0.1);">
<tr>
<td style="padding: 40px 40px 30px 40px; text-align: center;">
<!-- Стилизованный текстовый логотип uchill -->
<table role="presentation" cellspacing="0" cellpadding="0" border="0" align="center">
<tr>
<td>
<span style="display: inline-block; color: #7444FD; letter-spacing: 1px; font-size: 48px; font-weight: 600; line-height: 1.2;">
<span style="background-color: #7444FD; color: #ffffff; border-radius: 2px; margin-right: 2px; font-weight: 600; font-size: 48px; display: inline-block; vertical-align: baseline; line-height: 1; padding: 2px 8px; letter-spacing: 0;">u</span><span style="vertical-align: baseline;">chill</span>
</span>
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td style="padding: 0 40px 40px 40px;">
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
<tr>
<td style="padding-bottom: 24px;">
<h1 style="margin: 0; font-size: 28px; font-weight: 500; color: #212121; line-height: 1.2;">{notification.title}</h1>
</td>
</tr>
<tr>
<td style="padding-bottom: 24px;">
<p style="margin: 0; font-size: 16px; color: #424242; line-height: 1.6;">{notification.message}</p>
</td>
</tr>
{action_button}
</table>
</td>
</tr>
<tr>
<td style="padding: 30px 40px; background-color: #F5F5F5; border-radius: 0 0 8px 8px; border-top: 1px solid #E0E0E0;">
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
<tr>
<td style="text-align: center; font-size: 14px; color: #757575; line-height: 1.6;">
<p style="margin: 0 0 10px 0;">С уважением,<br><strong style="color: #7444FD;">Команда Uchill</strong></p>
<p style="margin: 10px 0 0 0; font-size: 12px; color: #9E9E9E;">
© 2026 Uchill. Все права защищены.
</p> </p>
</div> </td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
</body> </body>
</html> </html>
""" """
else: else:
# Если есть шаблон, оборачиваем его в базовую HTML структуру, если нужно # Если есть шаблон, оборачиваем его в базовую HTML структуру, если нужно
if not email_body.strip().startswith('<html'): if not email_body.strip().startswith('<html'):
action_button = ''
if notification.action_url:
action_url = f"{settings.FRONTEND_URL}{notification.action_url}"
action_button = f'''
<tr>
<td style="padding-top: 8px; padding-bottom: 24px; text-align: center;">
<table role="presentation" cellspacing="0" cellpadding="0" border="0" align="center">
<tr>
<td style="background-color: #7444FD; border-radius: 4px;">
<a href="{action_url}" style="display: inline-block; padding: 14px 32px; font-size: 16px; font-weight: 500; color: #FFFFFF; text-decoration: none; border-radius: 4px;">
Перейти
</a>
</td>
</tr>
</table>
</td>
</tr>
'''
email_body = f""" email_body = f"""
<html> <!DOCTYPE html>
<body style="font-family: Arial, sans-serif; max-width: 600px; margin: 0 auto;"> <html lang="ru">
<div style="background-color: #f8f9fa; padding: 20px; border-radius: 8px;"> <head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<!--[if mso]>
<style type="text/css">
body, table, td {{font-family: Arial, sans-serif !important;}}
</style>
<![endif]-->
</head>
<body style="margin: 0; padding: 0; background-color: #FAFAFA; font-family: 'Roboto', -apple-system, BlinkMacSystemFont, 'Segoe UI', Arial, sans-serif;">
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="background-color: #FAFAFA;">
<tr>
<td align="center" style="padding: 40px 20px;">
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="600" style="max-width: 600px; background-color: #FFFFFF; border-radius: 8px; box-shadow: 0 2px 8px rgba(0,0,0,0.1);">
<tr>
<td style="padding: 40px 40px 30px 40px; text-align: center;">
<!-- Стилизованный текстовый логотип uchill -->
<table role="presentation" cellspacing="0" cellpadding="0" border="0" align="center">
<tr>
<td>
<span style="display: inline-block; color: #7444FD; letter-spacing: 1px; font-size: 48px; font-weight: 600; line-height: 1.2;">
<span style="background-color: #7444FD; color: #ffffff; border-radius: 2px; margin-right: 2px; font-weight: 600; font-size: 48px; display: inline-block; vertical-align: baseline; line-height: 1; padding: 2px 8px; letter-spacing: 0;">u</span><span style="vertical-align: baseline;">chill</span>
</span>
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td style="padding: 0 40px 40px 40px;">
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
<tr>
<td style="padding-bottom: 24px;">
{email_body} {email_body}
{f'<a href="{settings.FRONTEND_URL}{notification.action_url}" style="display: inline-block; background-color: #3B82F6; color: white; padding: 12px 24px; text-decoration: none; border-radius: 6px; margin-top: 20px;">Перейти</a>' if notification.action_url else ''} </td>
<p style="color: #999; font-size: 12px; margin-top: 20px;"> </tr>
Это автоматическое уведомление от образовательной платформы. {action_button}
</table>
</td>
</tr>
<tr>
<td style="padding: 30px 40px; background-color: #F5F5F5; border-radius: 0 0 8px 8px; border-top: 1px solid #E0E0E0;">
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
<tr>
<td style="text-align: center; font-size: 14px; color: #757575; line-height: 1.6;">
<p style="margin: 0 0 10px 0;">С уважением,<br><strong style="color: #7444FD;">Команда Uchill</strong></p>
<p style="margin: 10px 0 0 0; font-size: 12px; color: #9E9E9E;">
© 2026 Uchill. Все права защищены.
</p> </p>
</div> </td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
</body> </body>
</html> </html>
""" """
@ -143,19 +287,93 @@ def send_email_notification(notification):
except NotificationTemplate.DoesNotExist: except NotificationTemplate.DoesNotExist:
# Если шаблона нет, используем дефолтный # Если шаблона нет, используем дефолтный
email_subject = notification.title email_subject = notification.title
action_button = ''
if notification.action_url:
action_url = f"{settings.FRONTEND_URL}{notification.action_url}"
action_button = f'''
<tr>
<td style="padding-top: 8px; padding-bottom: 24px; text-align: center;">
<table role="presentation" cellspacing="0" cellpadding="0" border="0" align="center">
<tr>
<td style="background-color: #7444FD; border-radius: 4px;">
<a href="{action_url}" style="display: inline-block; padding: 14px 32px; font-size: 16px; font-weight: 500; color: #FFFFFF; text-decoration: none; border-radius: 4px;">
Перейти
</a>
</td>
</tr>
</table>
</td>
</tr>
'''
email_body = f""" email_body = f"""
<html> <!DOCTYPE html>
<body style="font-family: Arial, sans-serif; max-width: 600px; margin: 0 auto;"> <html lang="ru">
<div style="background-color: #f8f9fa; padding: 20px; border-radius: 8px;"> <head>
<h2 style="color: #333;">{notification.title}</h2> <meta charset="UTF-8">
<div style="background-color: white; padding: 20px; border-radius: 8px; margin: 20px 0;"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<p style="color: #666; line-height: 1.6;">{notification.message}</p> <meta http-equiv="X-UA-Compatible" content="IE=edge">
</div> <!--[if mso]>
{f'<a href="{settings.FRONTEND_URL}{notification.action_url}" style="display: inline-block; background-color: #3B82F6; color: white; padding: 12px 24px; text-decoration: none; border-radius: 6px;">Перейти</a>' if notification.action_url else ''} <style type="text/css">
<p style="color: #999; font-size: 12px; margin-top: 20px;"> body, table, td {{font-family: Arial, sans-serif !important;}}
Это автоматическое уведомление от образовательной платформы. </style>
<![endif]-->
</head>
<body style="margin: 0; padding: 0; background-color: #FAFAFA; font-family: 'Roboto', -apple-system, BlinkMacSystemFont, 'Segoe UI', Arial, sans-serif;">
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="background-color: #FAFAFA;">
<tr>
<td align="center" style="padding: 40px 20px;">
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="600" style="max-width: 600px; background-color: #FFFFFF; border-radius: 8px; box-shadow: 0 2px 8px rgba(0,0,0,0.1);">
<tr>
<td style="padding: 40px 40px 30px 40px; text-align: center;">
<!-- Стилизованный текстовый логотип uchill -->
<table role="presentation" cellspacing="0" cellpadding="0" border="0" align="center">
<tr>
<td>
<span style="display: inline-block; color: #7444FD; letter-spacing: 1px; font-size: 48px; font-weight: 600; line-height: 1.2;">
<span style="background-color: #7444FD; color: #ffffff; border-radius: 2px; margin-right: 2px; font-weight: 600; font-size: 48px; display: inline-block; vertical-align: baseline; line-height: 1; padding: 2px 8px; letter-spacing: 0;">u</span><span style="vertical-align: baseline;">chill</span>
</span>
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td style="padding: 0 40px 40px 40px;">
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
<tr>
<td style="padding-bottom: 24px;">
<h1 style="margin: 0; font-size: 28px; font-weight: 500; color: #212121; line-height: 1.2;">{notification.title}</h1>
</td>
</tr>
<tr>
<td style="padding-bottom: 24px;">
<p style="margin: 0; font-size: 16px; color: #424242; line-height: 1.6;">{notification.message}</p>
</td>
</tr>
{action_button}
</table>
</td>
</tr>
<tr>
<td style="padding: 30px 40px; background-color: #F5F5F5; border-radius: 0 0 8px 8px; border-top: 1px solid #E0E0E0;">
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
<tr>
<td style="text-align: center; font-size: 14px; color: #757575; line-height: 1.6;">
<p style="margin: 0 0 10px 0;">С уважением,<br><strong style="color: #7444FD;">Команда Uchill</strong></p>
<p style="margin: 10px 0 0 0; font-size: 12px; color: #9E9E9E;">
© 2026 Uchill. Все права защищены.
</p> </p>
</div> </td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
</body> </body>
</html> </html>
""" """

View File

@ -18,7 +18,8 @@
{ "country_code": "RU", "country_name": "Россия", "city": "Саратов", "timezone": "Europe/Saratov" }, { "country_code": "RU", "country_name": "Россия", "city": "Саратов", "timezone": "Europe/Saratov" },
{ "country_code": "RU", "country_name": "Россия", "city": "Тюмень", "timezone": "Asia/Yekaterinburg" }, { "country_code": "RU", "country_name": "Россия", "city": "Тюмень", "timezone": "Asia/Yekaterinburg" },
{ "country_code": "RU", "country_name": "Россия", "city": "Иркутск", "timezone": "Asia/Irkutsk" }, { "country_code": "RU", "country_name": "Россия", "city": "Иркутск", "timezone": "Asia/Irkutsk" },
{ "country_code": "RU", "country_name": "Россия", "city": "Владивосток", "timezone": "Asia/Vladivostok" } { "country_code": "RU", "country_name": "Россия", "city": "Владивосток", "timezone": "Asia/Vladivostok" },
{ "country_code": "RU", "country_name": "Россия", "city": "Ульяновск", "timezone": "Europe/Samara" }
] ]

View File

@ -923,10 +923,36 @@ class ClientManagementViewSet(viewsets.ViewSet):
# Здесь заранее аннотируем эти значения одним SQL-запросом. # Здесь заранее аннотируем эти значения одним SQL-запросом.
from django.db.models import Count, Q from django.db.models import Count, Q
# Получаем ID студентов из принятых связей (MentorStudentConnection)
# Это нужно для случаев, когда связь создана, но ментор ещё не добавлен в client.mentors
accepted_connections = MentorStudentConnection.objects.filter(
mentor=user,
status=MentorStudentConnection.STATUS_ACCEPTED
).values_list('student_id', flat=True)
# Получаем ID клиентов, у которых ментор уже добавлен в client.mentors
clients_with_mentor = Client.objects.filter(mentors=user).values_list('id', flat=True)
# Получаем ID клиентов из принятых связей, у которых ментор ещё не добавлен
clients_to_sync = Client.objects.filter(
user_id__in=accepted_connections
).exclude(id__in=clients_with_mentor).values_list('id', flat=True)
# Синхронизация: добавляем ментора в client.mentors для клиентов с принятыми связями
# Используем bulk операцию для эффективности
if clients_to_sync:
clients_to_update = Client.objects.filter(id__in=clients_to_sync)
for client in clients_to_update:
client.mentors.add(user)
# Фильтруем клиентов: либо ментор в client.mentors, либо есть принятая связь
clients = ( clients = (
Client.objects.filter(mentors=user) Client.objects.filter(
Q(mentors=user) | Q(user_id__in=accepted_connections)
)
.select_related('user') .select_related('user')
.prefetch_related('mentors') .prefetch_related('mentors')
.distinct()
.annotate( .annotate(
# Поля с суффиксом _annotated читает ClientSerializer (если присутствуют) # Поля с суффиксом _annotated читает ClientSerializer (если присутствуют)
scheduled_lessons_annotated=Count( scheduled_lessons_annotated=Count(

View File

@ -0,0 +1,64 @@
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>{% block title %}Uchill{% endblock %}</title>
<!--[if mso]>
<style type="text/css">
body, table, td {font-family: Arial, sans-serif !important;}
</style>
<![endif]-->
</head>
<body style="margin: 0; padding: 0; background-color: #FAFAFA; font-family: 'Roboto', -apple-system, BlinkMacSystemFont, 'Segoe UI', Arial, sans-serif;">
<!-- Wrapper table -->
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="background-color: #FAFAFA;">
<tr>
<td align="center" style="padding: 40px 20px;">
<!-- Main content table -->
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="600" style="max-width: 600px; background-color: #FFFFFF; border-radius: 8px; box-shadow: 0 2px 8px rgba(0,0,0,0.1);">
<!-- Header with logo -->
<tr>
<td style="padding: 40px 40px 30px 40px; text-align: center; background-color: #FFFFFF; border-radius: 8px 8px 0 0;">
<!-- Стилизованный текстовый логотип uchill -->
<table role="presentation" cellspacing="0" cellpadding="0" border="0" align="center">
<tr>
<td>
<span style="display: inline-block; color: #7444FD; letter-spacing: 1px; font-size: 48px; font-weight: 600; line-height: 1.2;">
<span style="background-color: #7444FD; color: #ffffff; border-radius: 2px; margin-right: 2px; font-weight: 600; font-size: 48px; display: inline-block; vertical-align: baseline; line-height: 1; padding: 2px 8px; letter-spacing: 0;">u</span><span style="vertical-align: baseline;">chill</span>
</span>
</td>
</tr>
</table>
</td>
</tr>
<!-- Content block -->
<tr>
<td style="padding: 0 40px 40px 40px;">
{% block content %}{% endblock %}
</td>
</tr>
<!-- Footer -->
<tr>
<td style="padding: 30px 40px; background-color: #F5F5F5; border-radius: 0 0 8px 8px; border-top: 1px solid #E0E0E0;">
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
<tr>
<td style="text-align: center; font-size: 14px; color: #757575; line-height: 1.6;">
<p style="margin: 0 0 10px 0;">С уважением,<br><strong style="color: #7444FD;">Команда Uchill</strong></p>
<p style="margin: 10px 0 0 0; font-size: 12px; color: #9E9E9E;">
© {% now "Y" %} Uchill. Все права защищены.
</p>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
</body>
</html>

View File

@ -1,36 +1,170 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <html lang="ru">
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>Приглашение от ментора - Uchill</title>
<!--[if mso]>
<style type="text/css">
body, table, td {font-family: Arial, sans-serif !important;}
</style>
<![endif]-->
</head> </head>
<body style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif; line-height: 1.6; color: #333; max-width: 600px; margin: 0 auto; padding: 20px; background-color: #f5f5f5;"> <body style="margin: 0; padding: 0; background-color: #FAFAFA; font-family: 'Roboto', -apple-system, BlinkMacSystemFont, 'Segoe UI', Arial, sans-serif;">
<div style="background-color: white; border-radius: 8px; padding: 40px; box-shadow: 0 2px 4px rgba(0,0,0,0.1);"> <!-- Wrapper table -->
<div style="text-align: center; margin-bottom: 30px;"> <table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="background-color: #FAFAFA;">
<h1 style="color: #3B82F6; margin: 0; font-size: 28px;">Приглашение от ментора</h1> <tr>
</div> <td align="center" style="padding: 40px 20px;">
<!-- Main content table -->
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="600" style="max-width: 600px; background-color: #FFFFFF; border-radius: 8px; box-shadow: 0 2px 8px rgba(0,0,0,0.1);">
<!-- Header with logo -->
<tr>
<td style="padding: 40px 40px 30px 40px; text-align: center; background-color: #FFFFFF; border-radius: 8px 8px 0 0;">
<!-- Стилизованный текстовый логотип uchill -->
<table role="presentation" cellspacing="0" cellpadding="0" border="0" align="center">
<tr>
<td>
<span style="display: inline-block; color: #7444FD; letter-spacing: 1px; font-size: 48px; font-weight: 600; line-height: 1.2;">
<span style="background-color: #7444FD; color: #ffffff; border-radius: 2px; margin-right: 2px; font-weight: 600; font-size: 48px; display: inline-block; vertical-align: baseline; line-height: 1; padding: 2px 8px; letter-spacing: 0;">u</span><span style="vertical-align: baseline;">chill</span>
</span>
</td>
</tr>
</table>
</td>
</tr>
<p style="font-size: 16px; margin-bottom: 20px;">Здравствуйте!</p> <!-- Content -->
<tr>
<td style="padding: 0 40px 40px 40px;">
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
<!-- Title -->
<tr>
<td style="padding-bottom: 24px;">
<h1 style="margin: 0; font-size: 28px; font-weight: 500; color: #212121; line-height: 1.2;">Приглашение от ментора</h1>
</td>
</tr>
<p style="font-size: 16px; margin-bottom: 20px;"><strong>{{ mentor_name }}</strong> приглашает вас в качестве ученика на платформу.</p> <!-- Greeting -->
<tr>
<td style="padding-bottom: 24px;">
<p style="margin: 0; font-size: 16px; color: #424242; line-height: 1.6;">
Здравствуйте!
</p>
</td>
</tr>
<!-- Main message -->
<tr>
<td style="padding-bottom: 24px;">
<p style="margin: 0; font-size: 16px; color: #424242; line-height: 1.6;">
<strong style="color: #7444FD;">{{ mentor_name }}</strong> приглашает вас в качестве ученика на платформу Uchill.
</p>
</td>
</tr>
{% if set_password_url %} {% if set_password_url %}
<p style="font-size: 16px; margin-bottom: 20px;">Для начала работы установите пароль и подтвердите приглашение.</p> <!-- New user flow -->
<div style="text-align: center; margin: 30px 0;"> <tr>
<a href="{{ set_password_url }}" style="display: inline-block; background-color: #3B82F6; color: white; padding: 14px 28px; text-decoration: none; border-radius: 6px; font-weight: 600; font-size: 16px;">Установить пароль и подтвердить</a> <td style="padding-bottom: 24px;">
</div> <p style="margin: 0; font-size: 16px; color: #424242; line-height: 1.6;">
<p style="font-size: 12px; color: #9CA3AF; word-break: break-all;">{{ set_password_url }}</p> Для начала работы установите пароль и подтвердите приглашение.
{% elif confirm_url %} </p>
<p style="font-size: 16px; margin-bottom: 20px;">Подтвердите приглашение, чтобы начать занятия с ментором.</p> </td>
<div style="text-align: center; margin: 30px 0;"> </tr>
<a href="{{ confirm_url }}" style="display: inline-block; background-color: #3B82F6; color: white; padding: 14px 28px; text-decoration: none; border-radius: 6px; font-weight: 600; font-size: 16px;">Подтвердить приглашение</a>
</div>
<p style="font-size: 12px; color: #9CA3AF; word-break: break-all;">{{ confirm_url }}</p>
{% endif %}
<div style="margin-top: 40px; padding-top: 20px; border-top: 1px solid #E5E7EB;"> <!-- Button -->
<p style="margin: 0; font-size: 14px; color: #6B7280;">С уважением,<br><strong>Команда платформы</strong></p> <tr>
</div> <td style="padding-top: 8px; padding-bottom: 24px; text-align: center;">
</div> <table role="presentation" cellspacing="0" cellpadding="0" border="0" align="center">
<tr>
<td style="background-color: #7444FD; border-radius: 4px;">
<a href="{{ set_password_url }}" style="display: inline-block; padding: 14px 32px; font-size: 16px; font-weight: 500; color: #FFFFFF; text-decoration: none; border-radius: 4px;">
Установить пароль и подтвердить
</a>
</td>
</tr>
</table>
</td>
</tr>
<!-- Link fallback -->
<tr>
<td style="padding-bottom: 24px;">
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="background-color: #F5F5F5; border-radius: 4px;">
<tr>
<td style="padding: 12px;">
<p style="margin: 0; font-size: 12px; color: #9E9E9E; word-break: break-all; line-height: 1.5;">
{{ set_password_url }}
</p>
</td>
</tr>
</table>
</td>
</tr>
{% elif confirm_url %}
<!-- Existing user flow -->
<tr>
<td style="padding-bottom: 24px;">
<p style="margin: 0; font-size: 16px; color: #424242; line-height: 1.6;">
Подтвердите приглашение, чтобы начать занятия с ментором.
</p>
</td>
</tr>
<!-- Button -->
<tr>
<td style="padding-top: 8px; padding-bottom: 24px; text-align: center;">
<table role="presentation" cellspacing="0" cellpadding="0" border="0" align="center">
<tr>
<td style="background-color: #7444FD; border-radius: 4px;">
<a href="{{ confirm_url }}" style="display: inline-block; padding: 14px 32px; font-size: 16px; font-weight: 500; color: #FFFFFF; text-decoration: none; border-radius: 4px;">
Подтвердить приглашение
</a>
</td>
</tr>
</table>
</td>
</tr>
<!-- Link fallback -->
<tr>
<td style="padding-bottom: 24px;">
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="background-color: #F5F5F5; border-radius: 4px;">
<tr>
<td style="padding: 12px;">
<p style="margin: 0; font-size: 12px; color: #9E9E9E; word-break: break-all; line-height: 1.5;">
{{ confirm_url }}
</p>
</td>
</tr>
</table>
</td>
</tr>
{% endif %}
</table>
</td>
</tr>
<!-- Footer -->
<tr>
<td style="padding: 30px 40px; background-color: #F5F5F5; border-radius: 0 0 8px 8px; border-top: 1px solid #E0E0E0;">
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
<tr>
<td style="text-align: center; font-size: 14px; color: #757575; line-height: 1.6;">
<p style="margin: 0 0 10px 0;">С уважением,<br><strong style="color: #7444FD;">Команда Uchill</strong></p>
<p style="margin: 10px 0 0 0; font-size: 12px; color: #9E9E9E;">
© 2026 Uchill. Все права защищены.
</p>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
</body> </body>
</html> </html>

View File

@ -1,6 +1,6 @@
Здравствуйте! Здравствуйте!
{{ mentor_name }} приглашает вас в качестве ученика на платформу. {{ mentor_name }} приглашает вас в качестве ученика на платформу Uchill.
{% if set_password_url %} {% if set_password_url %}
Установите пароль и подтвердите приглашение по ссылке: Установите пароль и подтвердите приглашение по ссылке:
@ -11,4 +11,4 @@
{% endif %} {% endif %}
С уважением, С уважением,
Команда платформы Команда Uchill

View File

@ -1,39 +1,146 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <html lang="ru">
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>Восстановление пароля - Uchill</title>
<!--[if mso]>
<style type="text/css">
body, table, td {font-family: Arial, sans-serif !important;}
</style>
<![endif]-->
</head> </head>
<body style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif; line-height: 1.6; color: #333; max-width: 600px; margin: 0 auto; padding: 20px; background-color: #f5f5f5;"> <body style="margin: 0; padding: 0; background-color: #FAFAFA; font-family: 'Roboto', -apple-system, BlinkMacSystemFont, 'Segoe UI', Arial, sans-serif;">
<div style="background-color: white; border-radius: 8px; padding: 40px; box-shadow: 0 2px 4px rgba(0,0,0,0.1);"> <!-- Wrapper table -->
<div style="text-align: center; margin-bottom: 30px;"> <table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="background-color: #FAFAFA;">
<h1 style="color: #EF4444; margin: 0; font-size: 28px;">Восстановление пароля</h1> <tr>
</div> <td align="center" style="padding: 40px 20px;">
<!-- Main content table -->
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="600" style="max-width: 600px; background-color: #FFFFFF; border-radius: 8px; box-shadow: 0 2px 8px rgba(0,0,0,0.1);">
<!-- Header with logo -->
<tr>
<td style="padding: 40px 40px 30px 40px; text-align: center; background-color: #FFFFFF; border-radius: 8px 8px 0 0;">
<!-- Стилизованный текстовый логотип uchill -->
<table role="presentation" cellspacing="0" cellpadding="0" border="0" align="center">
<tr>
<td>
<span style="display: inline-block; color: #7444FD; letter-spacing: 1px; font-size: 48px; font-weight: 600; line-height: 1.2;">
<span style="background-color: #7444FD; color: #ffffff; border-radius: 2px; margin-right: 2px; font-weight: 600; font-size: 48px; display: inline-block; vertical-align: baseline; line-height: 1; padding: 2px 8px; letter-spacing: 0;">u</span><span style="vertical-align: baseline;">chill</span>
</span>
</td>
</tr>
</table>
</td>
</tr>
<p style="font-size: 16px; margin-bottom: 20px;">Здравствуйте, <strong>{{ user_full_name }}</strong>!</p> <!-- Content -->
<tr>
<td style="padding: 0 40px 40px 40px;">
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
<!-- Title -->
<tr>
<td style="padding-bottom: 24px;">
<h1 style="margin: 0; font-size: 28px; font-weight: 500; color: #212121; line-height: 1.2;">Восстановление пароля</h1>
</td>
</tr>
<p style="font-size: 16px; margin-bottom: 20px;">Вы запросили восстановление пароля для вашего аккаунта. Нажмите на кнопку ниже, чтобы установить новый пароль.</p> <!-- Greeting -->
<tr>
<td style="padding-bottom: 24px;">
<p style="margin: 0; font-size: 16px; color: #424242; line-height: 1.6;">
Здравствуйте, <strong style="color: #212121;">{{ user_full_name }}</strong>!
</p>
</td>
</tr>
<div style="text-align: center; margin: 30px 0;"> <!-- Main message -->
<a href="{{ reset_url }}" style="display: inline-block; background-color: #EF4444; color: white; padding: 14px 28px; text-decoration: none; border-radius: 6px; font-weight: 600; font-size: 16px;">Восстановить пароль</a> <tr>
</div> <td style="padding-bottom: 24px;">
<p style="margin: 0; font-size: 16px; color: #424242; line-height: 1.6;">
Вы запросили восстановление пароля для вашего аккаунта. Нажмите на кнопку ниже, чтобы установить новый пароль.
</p>
</td>
</tr>
<p style="font-size: 14px; color: #6B7280; margin-top: 30px;">Или скопируйте и вставьте эту ссылку в браузер:</p> <!-- Button -->
<p style="font-size: 12px; color: #9CA3AF; word-break: break-all; background-color: #F3F4F6; padding: 10px; border-radius: 4px; margin: 10px 0;">{{ reset_url }}</p> <tr>
<td style="padding-top: 8px; padding-bottom: 24px; text-align: center;">
<table role="presentation" cellspacing="0" cellpadding="0" border="0" align="center">
<tr>
<td style="background-color: #7444FD; border-radius: 4px;">
<a href="{{ reset_url }}" style="display: inline-block; padding: 14px 32px; font-size: 16px; font-weight: 500; color: #FFFFFF; text-decoration: none; border-radius: 4px;">
Восстановить пароль
</a>
</td>
</tr>
</table>
</td>
</tr>
<div style="background-color: #FEF3C7; border-left: 4px solid #F59E0B; padding: 15px; margin: 20px 0; border-radius: 4px;"> <!-- Link fallback -->
<p style="margin: 0; font-size: 14px; color: #92400E;"><strong>⚠️ Важно:</strong> Ссылка действительна в течение 24 часов.</p> <tr>
</div> <td style="padding-bottom: 24px;">
<p style="margin: 0 0 8px 0; font-size: 14px; color: #757575;">
Или скопируйте и вставьте эту ссылку в браузер:
</p>
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="background-color: #F5F5F5; border-radius: 4px;">
<tr>
<td style="padding: 12px;">
<p style="margin: 0; font-size: 12px; color: #9E9E9E; word-break: break-all; line-height: 1.5;">
{{ reset_url }}
</p>
</td>
</tr>
</table>
</td>
</tr>
<div style="margin-top: 30px; padding-top: 20px; border-top: 1px solid #E5E7EB;"> <!-- Warning box -->
<p style="margin: 0; font-size: 12px; color: #9CA3AF;">Если вы не запрашивали восстановление пароля, просто проигнорируйте это письмо. Ваш пароль останется без изменений.</p> <tr>
</div> <td style="padding-bottom: 24px;">
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="background-color: #FFF3E0; border-left: 4px solid #FF9800; border-radius: 4px;">
<tr>
<td style="padding: 16px;">
<p style="margin: 0; font-size: 14px; color: #E65100;">
<strong>⚠️ Важно:</strong> Ссылка действительна в течение 24 часов.
</p>
</td>
</tr>
</table>
</td>
</tr>
<div style="margin-top: 20px; padding-top: 20px; border-top: 1px solid #E5E7EB;"> <!-- Security notice -->
<p style="margin: 0; font-size: 14px; color: #6B7280;">С уважением,<br><strong>Команда Lessoni</strong></p> <tr>
</div> <td style="padding-top: 24px; border-top: 1px solid #E0E0E0;">
</div> <p style="margin: 0; font-size: 12px; color: #9E9E9E; line-height: 1.6;">
Если вы не запрашивали восстановление пароля, просто проигнорируйте это письмо. Ваш пароль останется без изменений.
</p>
</td>
</tr>
</table>
</td>
</tr>
<!-- Footer -->
<tr>
<td style="padding: 30px 40px; background-color: #F5F5F5; border-radius: 0 0 8px 8px; border-top: 1px solid #E0E0E0;">
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
<tr>
<td style="text-align: center; font-size: 14px; color: #757575; line-height: 1.6;">
<p style="margin: 0 0 10px 0;">С уважением,<br><strong style="color: #7444FD;">Команда Uchill</strong></p>
<p style="margin: 10px 0 0 0; font-size: 12px; color: #9E9E9E;">
© 2026 Uchill. Все права защищены.
</p>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
</body> </body>
</html> </html>

View File

@ -9,8 +9,4 @@
Если вы не запрашивали восстановление пароля, просто проигнорируйте это письмо. Ваш пароль останется без изменений. Если вы не запрашивали восстановление пароля, просто проигнорируйте это письмо. Ваш пароль останется без изменений.
С уважением, С уважением,
Команда платформы Команда Uchill

View File

@ -1,40 +1,155 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <html lang="ru">
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>Добро пожаловать на Uchill</title>
<!--[if mso]>
<style type="text/css">
body, table, td {font-family: Arial, sans-serif !important;}
</style>
<![endif]-->
</head> </head>
<body style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif; line-height: 1.6; color: #333; max-width: 600px; margin: 0 auto; padding: 20px; background-color: #f5f5f5;"> <body style="margin: 0; padding: 0; background-color: #FAFAFA; font-family: 'Roboto', -apple-system, BlinkMacSystemFont, 'Segoe UI', Arial, sans-serif;">
<div style="background-color: white; border-radius: 8px; padding: 40px; box-shadow: 0 2px 4px rgba(0,0,0,0.1);"> <!-- Wrapper table -->
<div style="text-align: center; margin-bottom: 30px;"> <table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="background-color: #FAFAFA;">
<h1 style="color: #3B82F6; margin: 0; font-size: 28px;">Добро пожаловать!</h1> <tr>
</div> <td align="center" style="padding: 40px 20px;">
<!-- Main content table -->
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="600" style="max-width: 600px; background-color: #FFFFFF; border-radius: 8px; box-shadow: 0 2px 8px rgba(0,0,0,0.1);">
<!-- Header with logo -->
<tr>
<td style="padding: 40px 40px 30px 40px; text-align: center; background-color: #FFFFFF; border-radius: 8px 8px 0 0;">
<!-- Стилизованный текстовый логотип uchill -->
<table role="presentation" cellspacing="0" cellpadding="0" border="0" align="center">
<tr>
<td>
<span style="display: inline-block; color: #7444FD; letter-spacing: 1px; font-size: 48px; font-weight: 600; line-height: 1.2;">
<span style="background-color: #7444FD; color: #ffffff; border-radius: 2px; margin-right: 2px; font-weight: 600; font-size: 48px; display: inline-block; vertical-align: baseline; line-height: 1; padding: 2px 8px; letter-spacing: 0;">u</span><span style="vertical-align: baseline;">chill</span>
</span>
</td>
</tr>
</table>
</td>
</tr>
<p style="font-size: 16px; margin-bottom: 20px;">Здравствуйте, <strong>{{ user_full_name }}</strong>!</p> <!-- Content -->
<tr>
<td style="padding: 0 40px 40px 40px;">
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
<!-- Title -->
<tr>
<td style="padding-bottom: 24px;">
<h1 style="margin: 0; font-size: 28px; font-weight: 500; color: #212121; line-height: 1.2;">Добро пожаловать!</h1>
</td>
</tr>
<p style="font-size: 16px; margin-bottom: 20px;">Вас добавили на Lessoni. Для начала работы необходимо установить пароль для вашего аккаунта.</p> <!-- Greeting -->
<tr>
<td style="padding-bottom: 24px;">
<p style="margin: 0; font-size: 16px; color: #424242; line-height: 1.6;">
Здравствуйте, <strong style="color: #212121;">{{ user_full_name }}</strong>!
</p>
</td>
</tr>
<div style="background-color: #F3F4F6; border-left: 4px solid #3B82F6; padding: 15px; margin: 20px 0; border-radius: 4px;"> <!-- Main message -->
<p style="margin: 0; font-size: 14px;"><strong>Ваш email для входа:</strong></p> <tr>
<p style="margin: 5px 0 0 0; font-size: 14px; color: #6B7280;">{{ user_email }}</p> <td style="padding-bottom: 24px;">
</div> <p style="margin: 0; font-size: 16px; color: #424242; line-height: 1.6;">
Вас добавили на Uchill. Для начала работы необходимо установить пароль для вашего аккаунта.
</p>
</td>
</tr>
<div style="text-align: center; margin: 30px 0;"> <!-- Info box -->
<a href="{{ set_password_url }}" style="display: inline-block; background-color: #3B82F6; color: white; padding: 14px 28px; text-decoration: none; border-radius: 6px; font-weight: 600; font-size: 16px;">Установить пароль</a> <tr>
</div> <td style="padding-bottom: 24px;">
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="background-color: #F5F5F5; border-left: 4px solid #7444FD; border-radius: 4px;">
<tr>
<td style="padding: 16px;">
<p style="margin: 0 0 8px 0; font-size: 14px; font-weight: 500; color: #212121;">
Ваш email для входа:
</p>
<p style="margin: 0; font-size: 14px; color: #757575;">
{{ user_email }}
</p>
</td>
</tr>
</table>
</td>
</tr>
<p style="font-size: 14px; color: #6B7280; margin-top: 30px;">Или скопируйте и вставьте эту ссылку в браузер:</p> <!-- Button -->
<p style="font-size: 12px; color: #9CA3AF; word-break: break-all; background-color: #F3F4F6; padding: 10px; border-radius: 4px; margin: 10px 0;">{{ set_password_url }}</p> <tr>
<td style="padding-top: 8px; padding-bottom: 24px; text-align: center;">
<table role="presentation" cellspacing="0" cellpadding="0" border="0" align="center">
<tr>
<td style="background-color: #7444FD; border-radius: 4px;">
<a href="{{ set_password_url }}" style="display: inline-block; padding: 14px 32px; font-size: 16px; font-weight: 500; color: #FFFFFF; text-decoration: none; border-radius: 4px;">
Установить пароль
</a>
</td>
</tr>
</table>
</td>
</tr>
<div style="background-color: #FEF3C7; border-left: 4px solid #F59E0B; padding: 15px; margin: 20px 0; border-radius: 4px;"> <!-- Link fallback -->
<p style="margin: 0; font-size: 14px; color: #92400E;"><strong>⚠️ Важно:</strong> Ссылка действительна в течение 7 дней.</p> <tr>
</div> <td style="padding-bottom: 24px;">
<p style="margin: 0 0 8px 0; font-size: 14px; color: #757575;">
Или скопируйте и вставьте эту ссылку в браузер:
</p>
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="background-color: #F5F5F5; border-radius: 4px;">
<tr>
<td style="padding: 12px;">
<p style="margin: 0; font-size: 12px; color: #9E9E9E; word-break: break-all; line-height: 1.5;">
{{ set_password_url }}
</p>
</td>
</tr>
</table>
</td>
</tr>
<div style="margin-top: 40px; padding-top: 20px; border-top: 1px solid #E5E7EB;"> <!-- Warning box -->
<p style="margin: 0; font-size: 14px; color: #6B7280;">С уважением,<br><strong>Команда Lessoni</strong></p> <tr>
</div> <td style="padding-bottom: 24px;">
</div> <table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="background-color: #FFF3E0; border-left: 4px solid #FF9800; border-radius: 4px;">
<tr>
<td style="padding: 16px;">
<p style="margin: 0; font-size: 14px; color: #E65100;">
<strong>⚠️ Важно:</strong> Ссылка действительна в течение 7 дней.
</p>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
<!-- Footer -->
<tr>
<td style="padding: 30px 40px; background-color: #F5F5F5; border-radius: 0 0 8px 8px; border-top: 1px solid #E0E0E0;">
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
<tr>
<td style="text-align: center; font-size: 14px; color: #757575; line-height: 1.6;">
<p style="margin: 0 0 10px 0;">С уважением,<br><strong style="color: #7444FD;">Команда Uchill</strong></p>
<p style="margin: 10px 0 0 0; font-size: 12px; color: #9E9E9E;">
© 2026 Uchill. Все права защищены.
</p>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
</body> </body>
</html> </html>

View File

@ -1,6 +1,6 @@
Здравствуйте, {{ user_full_name }}! Здравствуйте, {{ user_full_name }}!
Вас добавили на образовательную платформу. Для начала работы необходимо установить пароль для вашего аккаунта. Вас добавили на Uchill. Для начала работы необходимо установить пароль для вашего аккаунта.
Ваш email для входа: {{ user_email }} Ваш email для входа: {{ user_email }}
@ -10,8 +10,4 @@
Важно: Ссылка действительна в течение 7 дней. Важно: Ссылка действительна в течение 7 дней.
С уважением, С уважением,
Команда платформы Команда Uchill

View File

@ -1,35 +1,131 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <html lang="ru">
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>Подтверждение email - Uchill</title>
<!--[if mso]>
<style type="text/css">
body, table, td {font-family: Arial, sans-serif !important;}
</style>
<![endif]-->
</head> </head>
<body style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif; line-height: 1.6; color: #333; max-width: 600px; margin: 0 auto; padding: 20px; background-color: #f5f5f5;"> <body style="margin: 0; padding: 0; background-color: #FAFAFA; font-family: 'Roboto', -apple-system, BlinkMacSystemFont, 'Segoe UI', Arial, sans-serif;">
<div style="background-color: white; border-radius: 8px; padding: 40px; box-shadow: 0 2px 4px rgba(0,0,0,0.1);"> <!-- Wrapper table -->
<div style="text-align: center; margin-bottom: 30px;"> <table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="background-color: #FAFAFA;">
<h1 style="color: #3B82F6; margin: 0; font-size: 28px;">Подтверждение email</h1> <tr>
</div> <td align="center" style="padding: 40px 20px;">
<!-- Main content table -->
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="600" style="max-width: 600px; background-color: #FFFFFF; border-radius: 8px; box-shadow: 0 2px 8px rgba(0,0,0,0.1);">
<!-- Header with logo -->
<tr>
<td style="padding: 40px 40px 30px 40px; text-align: center; background-color: #FFFFFF; border-radius: 8px 8px 0 0;">
<!-- Стилизованный текстовый логотип uchill -->
<table role="presentation" cellspacing="0" cellpadding="0" border="0" align="center">
<tr>
<td>
<span style="display: inline-block; color: #7444FD; letter-spacing: 1px; font-size: 48px; font-weight: 600; line-height: 1.2;">
<span style="background-color: #7444FD; color: #ffffff; border-radius: 2px; margin-right: 2px; font-weight: 600; font-size: 48px; display: inline-block; vertical-align: baseline; line-height: 1; padding: 2px 8px; letter-spacing: 0;">u</span><span style="vertical-align: baseline;">chill</span>
</span>
</td>
</tr>
</table>
</td>
</tr>
<p style="font-size: 16px; margin-bottom: 20px;">Здравствуйте, <strong>{{ user_full_name }}</strong>!</p> <!-- Content -->
<tr>
<td style="padding: 0 40px 40px 40px;">
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
<!-- Title -->
<tr>
<td style="padding-bottom: 24px;">
<h1 style="margin: 0; font-size: 28px; font-weight: 500; color: #212121; line-height: 1.2;">Подтверждение email</h1>
</td>
</tr>
<p style="font-size: 16px; margin-bottom: 20px;">Спасибо за регистрацию на Lessoni. Для завершения регистрации необходимо подтвердить ваш email адрес.</p> <!-- Greeting -->
<tr>
<td style="padding-bottom: 24px;">
<p style="margin: 0; font-size: 16px; color: #424242; line-height: 1.6;">
Здравствуйте, <strong style="color: #212121;">{{ user_full_name }}</strong>!
</p>
</td>
</tr>
<div style="text-align: center; margin: 30px 0;"> <!-- Main message -->
<a href="{{ verification_url }}" style="display: inline-block; background-color: #3B82F6; color: white; padding: 14px 28px; text-decoration: none; border-radius: 6px; font-weight: 600; font-size: 16px;">Подтвердить email</a> <tr>
</div> <td style="padding-bottom: 24px;">
<p style="margin: 0; font-size: 16px; color: #424242; line-height: 1.6;">
Спасибо за регистрацию на Uchill. Для завершения регистрации необходимо подтвердить ваш email адрес.
</p>
</td>
</tr>
<p style="font-size: 14px; color: #6B7280; margin-top: 30px;">Или скопируйте и вставьте эту ссылку в браузер:</p> <!-- Button -->
<p style="font-size: 12px; color: #9CA3AF; word-break: break-all; background-color: #F3F4F6; padding: 10px; border-radius: 4px; margin: 10px 0;">{{ verification_url }}</p> <tr>
<td style="padding-top: 8px; padding-bottom: 24px; text-align: center;">
<table role="presentation" cellspacing="0" cellpadding="0" border="0" align="center">
<tr>
<td style="background-color: #7444FD; border-radius: 4px;">
<a href="{{ verification_url }}" style="display: inline-block; padding: 14px 32px; font-size: 16px; font-weight: 500; color: #FFFFFF; text-decoration: none; border-radius: 4px;">
Подтвердить email
</a>
</td>
</tr>
</table>
</td>
</tr>
<div style="margin-top: 30px; padding-top: 20px; border-top: 1px solid #E5E7EB;"> <!-- Link fallback -->
<p style="margin: 0; font-size: 12px; color: #9CA3AF;">Если вы не регистрировались на нашей платформе, просто проигнорируйте это письмо.</p> <tr>
</div> <td style="padding-bottom: 24px;">
<p style="margin: 0 0 8px 0; font-size: 14px; color: #757575;">
Или скопируйте и вставьте эту ссылку в браузер:
</p>
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="background-color: #F5F5F5; border-radius: 4px;">
<tr>
<td style="padding: 12px;">
<p style="margin: 0; font-size: 12px; color: #9E9E9E; word-break: break-all; line-height: 1.5;">
{{ verification_url }}
</p>
</td>
</tr>
</table>
</td>
</tr>
<div style="margin-top: 20px; padding-top: 20px; border-top: 1px solid #E5E7EB;"> <!-- Security notice -->
<p style="margin: 0; font-size: 14px; color: #6B7280;">С уважением,<br><strong>Команда Lessoni</strong></p> <tr>
</div> <td style="padding-top: 24px; border-top: 1px solid #E0E0E0;">
</div> <p style="margin: 0; font-size: 12px; color: #9E9E9E; line-height: 1.6;">
Если вы не регистрировались на нашей платформе, просто проигнорируйте это письмо.
</p>
</td>
</tr>
</table>
</td>
</tr>
<!-- Footer -->
<tr>
<td style="padding: 30px 40px; background-color: #F5F5F5; border-radius: 0 0 8px 8px; border-top: 1px solid #E0E0E0;">
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
<tr>
<td style="text-align: center; font-size: 14px; color: #757575; line-height: 1.6;">
<p style="margin: 0 0 10px 0;">С уважением,<br><strong style="color: #7444FD;">Команда Uchill</strong></p>
<p style="margin: 10px 0 0 0; font-size: 12px; color: #9E9E9E;">
© 2026 Uchill. Все права защищены.
</p>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
</body> </body>
</html> </html>

View File

@ -1,6 +1,6 @@
Здравствуйте, {{ user_full_name }}! Здравствуйте, {{ user_full_name }}!
Спасибо за регистрацию на нашей образовательной платформе. Для завершения регистрации необходимо подтвердить ваш email адрес. Спасибо за регистрацию на Uchill. Для завершения регистрации необходимо подтвердить ваш email адрес.
Перейдите по ссылке для подтверждения: Перейдите по ссылке для подтверждения:
{{ verification_url }} {{ verification_url }}
@ -8,8 +8,4 @@
Если вы не регистрировались на нашей платформе, просто проигнорируйте это письмо. Если вы не регистрировались на нашей платформе, просто проигнорируйте это письмо.
С уважением, С уважением,
Команда платформы Команда Uchill

View File

@ -1,31 +1,131 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <html lang="ru">
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>Добро пожаловать на Uchill</title>
<!--[if mso]>
<style type="text/css">
body, table, td {font-family: Arial, sans-serif !important;}
</style>
<![endif]-->
</head> </head>
<body style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif; line-height: 1.6; color: #333; max-width: 600px; margin: 0 auto; padding: 20px; background-color: #f5f5f5;"> <body style="margin: 0; padding: 0; background-color: #FAFAFA; font-family: 'Roboto', -apple-system, BlinkMacSystemFont, 'Segoe UI', Arial, sans-serif;">
<div style="background-color: white; border-radius: 8px; padding: 40px; box-shadow: 0 2px 4px rgba(0,0,0,0.1);"> <!-- Wrapper table -->
<div style="text-align: center; margin-bottom: 30px;"> <table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="background-color: #FAFAFA;">
<h1 style="color: #3B82F6; margin: 0; font-size: 28px;">Добро пожаловать!</h1> <tr>
</div> <td align="center" style="padding: 40px 20px;">
<!-- Main content table -->
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="600" style="max-width: 600px; background-color: #FFFFFF; border-radius: 8px; box-shadow: 0 2px 8px rgba(0,0,0,0.1);">
<!-- Header with logo -->
<tr>
<td style="padding: 40px 40px 30px 40px; text-align: center; background-color: #FFFFFF; border-radius: 8px 8px 0 0;">
<!-- Стилизованный текстовый логотип uchill -->
<table role="presentation" cellspacing="0" cellpadding="0" border="0" align="center">
<tr>
<td>
<span style="display: inline-block; color: #7444FD; letter-spacing: 1px; font-size: 48px; font-weight: 600; line-height: 1.2;">
<span style="background-color: #7444FD; color: #ffffff; border-radius: 2px; margin-right: 2px; font-weight: 600; font-size: 48px; display: inline-block; vertical-align: baseline; line-height: 1; padding: 2px 8px; letter-spacing: 0;">u</span><span style="vertical-align: baseline;">chill</span>
</span>
</td>
</tr>
</table>
</td>
</tr>
<p style="font-size: 16px; margin-bottom: 20px;">Здравствуйте, <strong>{{ user_full_name }}</strong>!</p> <!-- Content -->
<tr>
<td style="padding: 0 40px 40px 40px;">
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
<!-- Title -->
<tr>
<td style="padding-bottom: 24px;">
<h1 style="margin: 0; font-size: 28px; font-weight: 500; color: #212121; line-height: 1.2;">Добро пожаловать!</h1>
</td>
</tr>
<p style="font-size: 16px; margin-bottom: 20px;">Добро пожаловать на Lessoni! Ваш аккаунт успешно создан.</p> <!-- Greeting -->
<tr>
<td style="padding-bottom: 24px;">
<p style="margin: 0; font-size: 16px; color: #424242; line-height: 1.6;">
Здравствуйте, <strong style="color: #212121;">{{ user_full_name }}</strong>!
</p>
</td>
</tr>
<div style="background-color: #F3F4F6; border-left: 4px solid #3B82F6; padding: 15px; margin: 20px 0; border-radius: 4px;"> <!-- Main message -->
<p style="margin: 0; font-size: 14px;"><strong>Ваш email для входа:</strong></p> <tr>
<p style="margin: 5px 0 0 0; font-size: 14px; color: #6B7280;">{{ user_email }}</p> <td style="padding-bottom: 24px;">
</div> <p style="margin: 0; font-size: 16px; color: #424242; line-height: 1.6;">
Добро пожаловать на Uchill! Ваш аккаунт успешно создан.
</p>
</td>
</tr>
<p style="font-size: 16px; margin-top: 30px;">Теперь вы можете войти в систему и начать пользоваться всеми возможностями платформы.</p> <!-- Info box -->
<tr>
<td style="padding-bottom: 24px;">
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="background-color: #F5F5F5; border-left: 4px solid #7444FD; border-radius: 4px;">
<tr>
<td style="padding: 16px;">
<p style="margin: 0 0 8px 0; font-size: 14px; font-weight: 500; color: #212121;">
Ваш email для входа:
</p>
<p style="margin: 0; font-size: 14px; color: #757575;">
{{ user_email }}
</p>
</td>
</tr>
</table>
</td>
</tr>
<div style="margin-top: 40px; padding-top: 20px; border-top: 1px solid #E5E7EB;"> <!-- CTA -->
<p style="margin: 0; font-size: 14px; color: #6B7280;">С уважением,<br><strong>Команда Lessoni</strong></p> <tr>
</div> <td style="padding-bottom: 24px;">
</div> <p style="margin: 0; font-size: 16px; color: #424242; line-height: 1.6;">
Теперь вы можете войти в систему и начать пользоваться всеми возможностями платформы.
</p>
</td>
</tr>
<!-- Button -->
<tr>
<td style="padding-top: 8px; padding-bottom: 24px;">
<table role="presentation" cellspacing="0" cellpadding="0" border="0">
<tr>
<td style="background-color: #7444FD; border-radius: 4px;">
<a href="https://app.uchill.online/login" style="display: inline-block; padding: 14px 32px; font-size: 16px; font-weight: 500; color: #FFFFFF; text-decoration: none; border-radius: 4px;">
Войти в систему
</a>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
<!-- Footer -->
<tr>
<td style="padding: 30px 40px; background-color: #F5F5F5; border-radius: 0 0 8px 8px; border-top: 1px solid #E0E0E0;">
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
<tr>
<td style="text-align: center; font-size: 14px; color: #757575; line-height: 1.6;">
<p style="margin: 0 0 10px 0;">С уважением,<br><strong style="color: #7444FD;">Команда Uchill</strong></p>
<p style="margin: 10px 0 0 0; font-size: 12px; color: #9E9E9E;">
© 2026 Uchill. Все права защищены.
</p>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
</body> </body>
</html> </html>

View File

@ -1,14 +1,10 @@
Здравствуйте, {{ user_full_name }}! Здравствуйте, {{ user_full_name }}!
Добро пожаловать на нашу образовательную платформу. Ваш аккаунт успешно создан. Добро пожаловать на Uchill! Ваш аккаунт успешно создан.
Ваш email для входа: {{ user_email }} Ваш email для входа: {{ user_email }}
Теперь вы можете войти в систему и начать пользоваться всеми возможностями платформы. Теперь вы можете войти в систему и начать пользоваться всеми возможностями платформы.
С уважением, С уважением,
Команда платформы Команда Uchill

View File

@ -1,5 +1,5 @@
""" """
Django settings для Lessoni - образовательной платформы. Django settings для Uchill - образовательной платформы.
""" """
import os import os
@ -46,7 +46,7 @@ if os.getenv('SENTRY_DSN') and os.getenv('DEBUG', 'True') == 'False':
environment=os.getenv('SENTRY_ENVIRONMENT', 'production'), environment=os.getenv('SENTRY_ENVIRONMENT', 'production'),
# Релиз (версия приложения) # Релиз (версия приложения)
release=os.getenv('SENTRY_RELEASE', 'lessoni@1.0.0'), release=os.getenv('SENTRY_RELEASE', 'uchill@1.0.0'),
# Игнорировать определенные ошибки # Игнорировать определенные ошибки
ignore_errors=[ ignore_errors=[