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,56 +107,274 @@ 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>
</p> <![endif]-->
</div> </head>
</body> <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>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
</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>
{email_body} <meta charset="UTF-8">
{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 ''} <meta name="viewport" content="width=device-width, initial-scale=1.0">
<p style="color: #999; font-size: 12px; margin-top: 20px;"> <meta http-equiv="X-UA-Compatible" content="IE=edge">
Это автоматическое уведомление от образовательной платформы. <!--[if mso]>
</p> <style type="text/css">
</div> body, table, td {{font-family: Arial, sans-serif !important;}}
</body> </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}
</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>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
</body>
</html> </html>
""" """
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>
</p> <![endif]-->
</div> </head>
</body> <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>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
</body>
</html> </html>
""" """

View File

@ -1,24 +1,25 @@
[ [
{ "country_code": "RU", "country_name": "Россия", "city": "Москва", "timezone": "Europe/Moscow" }, { "country_code": "RU", "country_name": "Россия", "city": "Москва", "timezone": "Europe/Moscow" },
{ "country_code": "RU", "country_name": "Россия", "city": "Санкт-Петербург", "timezone": "Europe/Moscow" }, { "country_code": "RU", "country_name": "Россия", "city": "Санкт-Петербург", "timezone": "Europe/Moscow" },
{ "country_code": "RU", "country_name": "Россия", "city": "Новосибирск", "timezone": "Asia/Novosibirsk" }, { "country_code": "RU", "country_name": "Россия", "city": "Новосибирск", "timezone": "Asia/Novosibirsk" },
{ "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": "Europe/Moscow" }, { "country_code": "RU", "country_name": "Россия", "city": "Казань", "timezone": "Europe/Moscow" },
{ "country_code": "RU", "country_name": "Россия", "city": "Нижний Новгород", "timezone": "Europe/Moscow" }, { "country_code": "RU", "country_name": "Россия", "city": "Нижний Новгород", "timezone": "Europe/Moscow" },
{ "country_code": "RU", "country_name": "Россия", "city": "Самара", "timezone": "Europe/Samara" }, { "country_code": "RU", "country_name": "Россия", "city": "Самара", "timezone": "Europe/Samara" },
{ "country_code": "RU", "country_name": "Россия", "city": "Омск", "timezone": "Asia/Omsk" }, { "country_code": "RU", "country_name": "Россия", "city": "Омск", "timezone": "Asia/Omsk" },
{ "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": "Europe/Moscow" }, { "country_code": "RU", "country_name": "Россия", "city": "Ростов-на-Дону", "timezone": "Europe/Moscow" },
{ "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/Krasnoyarsk" }, { "country_code": "RU", "country_name": "Россия", "city": "Красноярск", "timezone": "Asia/Krasnoyarsk" },
{ "country_code": "RU", "country_name": "Россия", "city": "Воронеж", "timezone": "Europe/Moscow" }, { "country_code": "RU", "country_name": "Россия", "city": "Воронеж", "timezone": "Europe/Moscow" },
{ "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": "Europe/Moscow" }, { "country_code": "RU", "country_name": "Россия", "city": "Волгоград", "timezone": "Europe/Moscow" },
{ "country_code": "RU", "country_name": "Россия", "city": "Краснодар", "timezone": "Europe/Moscow" }, { "country_code": "RU", "country_name": "Россия", "city": "Краснодар", "timezone": "Europe/Moscow" },
{ "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

@ -922,11 +922,37 @@ class ClientManagementViewSet(viewsets.ViewSet):
# Раньше ClientSerializer считал статистику занятий через 3 отдельных запроса на каждого клиента (N+1). # Раньше ClientSerializer считал статистику занятий через 3 отдельных запроса на каждого клиента (N+1).
# Здесь заранее аннотируем эти значения одним 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">
</head> <meta http-equiv="X-UA-Compatible" content="IE=edge">
<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;"> <title>Приглашение от ментора - Uchill</title>
<div style="background-color: white; border-radius: 8px; padding: 40px; box-shadow: 0 2px 4px rgba(0,0,0,0.1);"> <!--[if mso]>
<div style="text-align: center; margin-bottom: 30px;"> <style type="text/css">
<h1 style="color: #3B82F6; margin: 0; font-size: 28px;">Приглашение от ментора</h1> body, table, td {font-family: Arial, sans-serif !important;}
</div> </style>
<![endif]-->
<p style="font-size: 16px; margin-bottom: 20px;">Здравствуйте!</p> </head>
<body style="margin: 0; padding: 0; background-color: #FAFAFA; font-family: 'Roboto', -apple-system, BlinkMacSystemFont, 'Segoe UI', Arial, sans-serif;">
<p style="font-size: 16px; margin-bottom: 20px;"><strong>{{ mentor_name }}</strong> приглашает вас в качестве ученика на платформу.</p> <!-- Wrapper table -->
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="background-color: #FAFAFA;">
{% if set_password_url %} <tr>
<p style="font-size: 16px; margin-bottom: 20px;">Для начала работы установите пароль и подтвердите приглашение.</p> <td align="center" style="padding: 40px 20px;">
<div style="text-align: center; margin: 30px 0;"> <!-- Main content table -->
<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> <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);">
</div> <!-- Header with logo -->
<p style="font-size: 12px; color: #9CA3AF; word-break: break-all;">{{ set_password_url }}</p> <tr>
{% elif confirm_url %} <td style="padding: 40px 40px 30px 40px; text-align: center; background-color: #FFFFFF; border-radius: 8px 8px 0 0;">
<p style="font-size: 16px; margin-bottom: 20px;">Подтвердите приглашение, чтобы начать занятия с ментором.</p> <!-- Стилизованный текстовый логотип uchill -->
<div style="text-align: center; margin: 30px 0;"> <table role="presentation" cellspacing="0" cellpadding="0" border="0" align="center">
<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> <tr>
</div> <td>
<p style="font-size: 12px; color: #9CA3AF; word-break: break-all;">{{ confirm_url }}</p> <span style="display: inline-block; color: #7444FD; letter-spacing: 1px; font-size: 48px; font-weight: 600; line-height: 1.2;">
{% endif %} <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>
<div style="margin-top: 40px; padding-top: 20px; border-top: 1px solid #E5E7EB;"> </td>
<p style="margin: 0; font-size: 14px; color: #6B7280;">С уважением,<br><strong>Команда платформы</strong></p> </tr>
</div> </table>
</div> </td>
</body> </tr>
</html>
<!-- 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>
<!-- 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 %}
<!-- New 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="{{ 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>
</html>

View File

@ -1,14 +1,14 @@
Здравствуйте! Здравствуйте!
{{ mentor_name }} приглашает вас в качестве ученика на платформу. {{ mentor_name }} приглашает вас в качестве ученика на платформу Uchill.
{% if set_password_url %} {% if set_password_url %}
Установите пароль и подтвердите приглашение по ссылке: Установите пароль и подтвердите приглашение по ссылке:
{{ set_password_url }} {{ set_password_url }}
{% elif confirm_url %} {% elif confirm_url %}
Подтвердите приглашение по ссылке: Подтвердите приглашение по ссылке:
{{ confirm_url }} {{ confirm_url }}
{% 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 -->
<p style="font-size: 16px; margin-bottom: 20px;">Здравствуйте, <strong>{{ user_full_name }}</strong>!</p> <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 -->
<p style="font-size: 16px; margin-bottom: 20px;">Вы запросили восстановление пароля для вашего аккаунта. Нажмите на кнопку ниже, чтобы установить новый пароль.</p> <tr>
<td style="padding: 40px 40px 30px 40px; text-align: center; background-color: #FFFFFF; border-radius: 8px 8px 0 0;">
<div style="text-align: center; margin: 30px 0;"> <!-- Стилизованный текстовый логотип uchill -->
<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> <table role="presentation" cellspacing="0" cellpadding="0" border="0" align="center">
</div> <tr>
<td>
<p style="font-size: 14px; color: #6B7280; margin-top: 30px;">Или скопируйте и вставьте эту ссылку в браузер:</p> <span style="display: inline-block; color: #7444FD; letter-spacing: 1px; font-size: 48px; font-weight: 600; line-height: 1.2;">
<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> <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>
<div style="background-color: #FEF3C7; border-left: 4px solid #F59E0B; padding: 15px; margin: 20px 0; border-radius: 4px;"> </td>
<p style="margin: 0; font-size: 14px; color: #92400E;"><strong>⚠️ Важно:</strong> Ссылка действительна в течение 24 часов.</p> </tr>
</div> </table>
</td>
<div style="margin-top: 30px; padding-top: 20px; border-top: 1px solid #E5E7EB;"> </tr>
<p style="margin: 0; font-size: 12px; color: #9CA3AF;">Если вы не запрашивали восстановление пароля, просто проигнорируйте это письмо. Ваш пароль останется без изменений.</p>
</div> <!-- Content -->
<tr>
<div style="margin-top: 20px; padding-top: 20px; border-top: 1px solid #E5E7EB;"> <td style="padding: 0 40px 40px 40px;">
<p style="margin: 0; font-size: 14px; color: #6B7280;">С уважением,<br><strong>Команда Lessoni</strong></p> <table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
</div> <!-- Title -->
</div> <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>
<!-- 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>
<!-- Main message -->
<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="{{ 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>
<!-- Link fallback -->
<tr>
<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>
<!-- Warning box -->
<tr>
<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>
<!-- Security notice -->
<tr>
<td style="padding-top: 24px; border-top: 1px solid #E0E0E0;">
<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,16 +1,12 @@
Здравствуйте, {{ user_full_name }}! Здравствуйте, {{ user_full_name }}!
Вы запросили восстановление пароля для вашего аккаунта. Перейдите по ссылке для установки нового пароля: Вы запросили восстановление пароля для вашего аккаунта. Перейдите по ссылке для установки нового пароля:
{{ reset_url }} {{ reset_url }}
Важно: Ссылка действительна в течение 24 часов. Важно: Ссылка действительна в течение 24 часов.
Если вы не запрашивали восстановление пароля, просто проигнорируйте это письмо. Ваш пароль останется без изменений. Если вы не запрашивали восстановление пароля, просто проигнорируйте это письмо. Ваш пароль останется без изменений.
С уважением, С уважением,
Команда платформы Команда 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 -->
<p style="font-size: 16px; margin-bottom: 20px;">Здравствуйте, <strong>{{ user_full_name }}</strong>!</p> <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 -->
<p style="font-size: 16px; margin-bottom: 20px;">Вас добавили на Lessoni. Для начала работы необходимо установить пароль для вашего аккаунта.</p> <tr>
<td style="padding: 40px 40px 30px 40px; text-align: center; background-color: #FFFFFF; border-radius: 8px 8px 0 0;">
<div style="background-color: #F3F4F6; border-left: 4px solid #3B82F6; padding: 15px; margin: 20px 0; border-radius: 4px;"> <!-- Стилизованный текстовый логотип uchill -->
<p style="margin: 0; font-size: 14px;"><strong>Ваш email для входа:</strong></p> <table role="presentation" cellspacing="0" cellpadding="0" border="0" align="center">
<p style="margin: 5px 0 0 0; font-size: 14px; color: #6B7280;">{{ user_email }}</p> <tr>
</div> <td>
<span style="display: inline-block; color: #7444FD; letter-spacing: 1px; font-size: 48px; font-weight: 600; line-height: 1.2;">
<div style="text-align: center; margin: 30px 0;"> <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>
<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> </span>
</div> </td>
</tr>
<p style="font-size: 14px; color: #6B7280; margin-top: 30px;">Или скопируйте и вставьте эту ссылку в браузер:</p> </table>
<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> </td>
</tr>
<div style="background-color: #FEF3C7; border-left: 4px solid #F59E0B; padding: 15px; margin: 20px 0; border-radius: 4px;">
<p style="margin: 0; font-size: 14px; color: #92400E;"><strong>⚠️ Важно:</strong> Ссылка действительна в течение 7 дней.</p> <!-- Content -->
</div> <tr>
<td style="padding: 0 40px 40px 40px;">
<div style="margin-top: 40px; padding-top: 20px; border-top: 1px solid #E5E7EB;"> <table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
<p style="margin: 0; font-size: 14px; color: #6B7280;">С уважением,<br><strong>Команда Lessoni</strong></p> <!-- Title -->
</div> <tr>
</div> <td style="padding-bottom: 24px;">
<h1 style="margin: 0; font-size: 28px; font-weight: 500; color: #212121; line-height: 1.2;">Добро пожаловать!</h1>
</td>
</tr>
<!-- 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>
<!-- Main message -->
<tr>
<td style="padding-bottom: 24px;">
<p style="margin: 0; font-size: 16px; color: #424242; line-height: 1.6;">
Вас добавили на Uchill. Для начала работы необходимо установить пароль для вашего аккаунта.
</p>
</td>
</tr>
<!-- 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>
<!-- 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="{{ 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;">
<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>
<!-- Warning box -->
<tr>
<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> Ссылка действительна в течение 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,17 +1,13 @@
Здравствуйте, {{ user_full_name }}! Здравствуйте, {{ user_full_name }}!
Вас добавили на образовательную платформу. Для начала работы необходимо установить пароль для вашего аккаунта. Вас добавили на Uchill. Для начала работы необходимо установить пароль для вашего аккаунта.
Ваш email для входа: {{ user_email }} Ваш email для входа: {{ user_email }}
Перейдите по ссылке для установки пароля: Перейдите по ссылке для установки пароля:
{{ set_password_url }} {{ set_password_url }}
Важно: Ссылка действительна в течение 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 -->
<p style="font-size: 16px; margin-bottom: 20px;">Здравствуйте, <strong>{{ user_full_name }}</strong>!</p> <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 -->
<p style="font-size: 16px; margin-bottom: 20px;">Спасибо за регистрацию на Lessoni. Для завершения регистрации необходимо подтвердить ваш email адрес.</p> <tr>
<td style="padding: 40px 40px 30px 40px; text-align: center; background-color: #FFFFFF; border-radius: 8px 8px 0 0;">
<div style="text-align: center; margin: 30px 0;"> <!-- Стилизованный текстовый логотип uchill -->
<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> <table role="presentation" cellspacing="0" cellpadding="0" border="0" align="center">
</div> <tr>
<td>
<p style="font-size: 14px; color: #6B7280; margin-top: 30px;">Или скопируйте и вставьте эту ссылку в браузер:</p> <span style="display: inline-block; color: #7444FD; letter-spacing: 1px; font-size: 48px; font-weight: 600; line-height: 1.2;">
<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> <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>
<div style="margin-top: 30px; padding-top: 20px; border-top: 1px solid #E5E7EB;"> </td>
<p style="margin: 0; font-size: 12px; color: #9CA3AF;">Если вы не регистрировались на нашей платформе, просто проигнорируйте это письмо.</p> </tr>
</div> </table>
</td>
<div style="margin-top: 20px; padding-top: 20px; border-top: 1px solid #E5E7EB;"> </tr>
<p style="margin: 0; font-size: 14px; color: #6B7280;">С уважением,<br><strong>Команда Lessoni</strong></p>
</div> <!-- Content -->
</div> <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>
<!-- 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>
<!-- Main message -->
<tr>
<td style="padding-bottom: 24px;">
<p style="margin: 0; font-size: 16px; color: #424242; line-height: 1.6;">
Спасибо за регистрацию на Uchill. Для завершения регистрации необходимо подтвердить ваш email адрес.
</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="{{ 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>
<!-- Link fallback -->
<tr>
<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>
<!-- Security notice -->
<tr>
<td style="padding-top: 24px; border-top: 1px solid #E0E0E0;">
<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,15 +1,11 @@
Здравствуйте, {{ user_full_name }}! Здравствуйте, {{ user_full_name }}!
Спасибо за регистрацию на нашей образовательной платформе. Для завершения регистрации необходимо подтвердить ваш email адрес. Спасибо за регистрацию на Uchill. Для завершения регистрации необходимо подтвердить ваш email адрес.
Перейдите по ссылке для подтверждения: Перейдите по ссылке для подтверждения:
{{ verification_url }} {{ verification_url }}
Если вы не регистрировались на нашей платформе, просто проигнорируйте это письмо. Если вы не регистрировались на нашей платформе, просто проигнорируйте это письмо.
С уважением, С уважением,
Команда платформы Команда 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 -->
<p style="font-size: 16px; margin-bottom: 20px;">Здравствуйте, <strong>{{ user_full_name }}</strong>!</p> <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 -->
<p style="font-size: 16px; margin-bottom: 20px;">Добро пожаловать на Lessoni! Ваш аккаунт успешно создан.</p> <tr>
<td style="padding: 40px 40px 30px 40px; text-align: center; background-color: #FFFFFF; border-radius: 8px 8px 0 0;">
<div style="background-color: #F3F4F6; border-left: 4px solid #3B82F6; padding: 15px; margin: 20px 0; border-radius: 4px;"> <!-- Стилизованный текстовый логотип uchill -->
<p style="margin: 0; font-size: 14px;"><strong>Ваш email для входа:</strong></p> <table role="presentation" cellspacing="0" cellpadding="0" border="0" align="center">
<p style="margin: 5px 0 0 0; font-size: 14px; color: #6B7280;">{{ user_email }}</p> <tr>
</div> <td>
<span style="display: inline-block; color: #7444FD; letter-spacing: 1px; font-size: 48px; font-weight: 600; line-height: 1.2;">
<p style="font-size: 16px; margin-top: 30px;">Теперь вы можете войти в систему и начать пользоваться всеми возможностями платформы.</p> <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>
<div style="margin-top: 40px; padding-top: 20px; border-top: 1px solid #E5E7EB;"> </td>
<p style="margin: 0; font-size: 14px; color: #6B7280;">С уважением,<br><strong>Команда Lessoni</strong></p> </tr>
</div> </table>
</div> </td>
</tr>
<!-- 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>
<!-- 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>
<!-- Main message -->
<tr>
<td style="padding-bottom: 24px;">
<p style="margin: 0; font-size: 16px; color: #424242; line-height: 1.6;">
Добро пожаловать на Uchill! Ваш аккаунт успешно создан.
</p>
</td>
</tr>
<!-- 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>
<!-- CTA -->
<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;">
<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=[