|
| ' # noqa: E501 f'{safe_label}' f" |
| ' # noqa: E501
f" " # noqa: E501
f"{html.escape(code)}"
f" |
| ' # noqa: E501 f' | {html.escape(divider_label)} | ' # noqa: E501 f'' # noqa: E501 f" |
{html.escape(magic_intro)}
' # noqa: E501 + _cta_button_html(label=cta_label, url=safe_magic_link, accent=accent) + f'{html.escape(magic_hint)}
' # noqa: E501 ) body_html = ( code_block + f'{expiry_html}
' # noqa: E501 + f'{html.escape(security)}
' # noqa: E501 + magic_block ) rendered = _layout( settings=settings, preheader=preheader, heading=heading, intro_html=html.escape(intro), body_html=body_html, footer_html=footer, ) return EmailContent(subject=subject, text="\n".join(text_lines), html=rendered) def render_account_merged( settings: Settings, *, language_code: Optional[str], primary_user_id: Optional[int], removed_user_id: Optional[int], final_end_date_text: str, i18n: Optional[JsonI18n] = None, ) -> EmailContent: i18n = _resolve_i18n(i18n) lang = _normalize_lang(language_code, settings) brand = _brand_title(settings) primary = "—" if primary_user_id is None else f"#{primary_user_id}" removed = "—" if removed_user_id is None else f"#{removed_user_id}" end_date = final_end_date_text or "—" subject = _t_text(i18n, lang, "email_account_merged_subject") preheader = _t_text(i18n, lang, "email_account_merged_preheader") heading = _t_text(i18n, lang, "email_account_merged_heading") intro = _t_text(i18n, lang, "email_account_merged_intro") note = _t_text(i18n, lang, "email_account_merged_note") footer = _t_html(i18n, lang, "email_footer_auto", brand=brand) text = _t_text( i18n, lang, "email_account_merged_text", primary=primary, removed=removed, end_date=end_date, ) rows = [ (_t_text(i18n, lang, "email_account_merged_row_kept"), primary), (_t_text(i18n, lang, "email_account_merged_row_removed"), removed), (_t_text(i18n, lang, "email_account_merged_row_end_date"), end_date), ] body_html = ( _info_rows_html(rows) + f'{html.escape(note)}
' # noqa: E501 ) rendered = _layout( settings=settings, preheader=preheader, heading=heading, intro_html=html.escape(intro), body_html=body_html, footer_html=footer, ) return EmailContent(subject=subject, text=text, html=rendered) def render_payment_success( settings: Settings, *, language_code: Optional[str], sale_mode: str, months: int, traffic_gb: Optional[float], amount: float, currency: str, end_date_text: str, dashboard_url: Optional[str], provider_label: Optional[str] = None, i18n: Optional[JsonI18n] = None, ) -> EmailContent: i18n = _resolve_i18n(i18n) lang = _normalize_lang(language_code, settings) accent = _safe_color(settings.WEBAPP_PRIMARY_COLOR) brand = _brand_title(settings) is_traffic = (sale_mode or "").split("@", 1)[0].split("|", 1)[0] in { "traffic", "traffic_package", "topup", "premium_topup", } amount_text = _format_amount(amount, currency) safe_dashboard_url = (dashboard_url or "").strip() end_date = end_date_text or "—" traffic_label = _format_traffic(traffic_gb) subject = _t_text(i18n, lang, "email_payment_success_subject") preheader = _t_text(i18n, lang, "email_payment_success_preheader") heading = _t_text(i18n, lang, "email_payment_success_heading") footer_note = _t_text(i18n, lang, "email_payment_success_footer_note") footer = _t_html(i18n, lang, "email_footer_auto", brand=brand) cta_label = _t_text(i18n, lang, "email_payment_success_cta") if is_traffic: intro = _t_text(i18n, lang, "email_payment_success_intro_traffic", traffic_gb=traffic_label) period_label = _t_text(i18n, lang, "email_payment_success_row_traffic") period_value = _t_text( i18n, lang, "email_payment_success_traffic_value", traffic_gb=traffic_label ) text = _t_text( i18n, lang, "email_payment_success_text_traffic", amount=amount_text, traffic_gb=traffic_label, end_date=end_date, ) else: months_int = int(months or 0) intro = _t_text(i18n, lang, "email_payment_success_intro_subscription", months=months_int) period_label = _t_text(i18n, lang, "email_payment_success_row_period") period_value = _t_text( i18n, lang, "email_payment_success_period_value", months=months_int, ) text = _t_text( i18n, lang, "email_payment_success_text_subscription", amount=amount_text, months=months_int, end_date=end_date, ) rows: list[Tuple[str, str]] = [ (period_label, period_value), (_t_text(i18n, lang, "email_payment_success_row_amount"), amount_text), (_t_text(i18n, lang, "email_payment_success_row_end_date"), end_date), ] if provider_label: rows.append((_t_text(i18n, lang, "email_payment_success_row_method"), provider_label)) text_lines = [text] if safe_dashboard_url: text_lines.append( _t_text(i18n, lang, "email_payment_success_text_dashboard", url=safe_dashboard_url) ) body_parts = [_info_rows_html(rows)] if safe_dashboard_url: body_parts.append(_cta_button_html(label=cta_label, url=safe_dashboard_url, accent=accent)) body_parts.append( f'{html.escape(footer_note)}
' # noqa: E501 ) rendered = _layout( settings=settings, preheader=preheader, heading=heading, intro_html=html.escape(intro), body_html="".join(body_parts), footer_html=footer, ) return EmailContent(subject=subject, text="\n".join(text_lines), html=rendered) def render_subscription_expiring( settings: Settings, *, language_code: Optional[str], days_left: int, end_date_text: str, dashboard_url: Optional[str], i18n: Optional[JsonI18n] = None, ) -> EmailContent: i18n = _resolve_i18n(i18n) lang = _normalize_lang(language_code, settings) accent = _safe_color(settings.WEBAPP_PRIMARY_COLOR) brand = _brand_title(settings) safe_dashboard_url = (dashboard_url or "").strip() days = max(0, int(days_left)) end_date = end_date_text or "—" if days == 0: suffix = "today" elif days == 1: suffix = "tomorrow" else: suffix = "days" subject = _t_text(i18n, lang, f"email_subscription_expiring_subject_{suffix}", days=days) heading = _t_text(i18n, lang, f"email_subscription_expiring_heading_{suffix}", days=days) preheader = _t_text(i18n, lang, f"email_subscription_expiring_preheader_{suffix}", days=days) intro = _t_text(i18n, lang, f"email_subscription_expiring_intro_{suffix}", days=days) note = _t_text(i18n, lang, "email_subscription_expiring_note") footer = _t_html(i18n, lang, "email_footer_auto", brand=brand) cta_label = _t_text(i18n, lang, "email_subscription_expiring_cta") rows = [ (_t_text(i18n, lang, "email_subscription_expiring_row_days_left"), str(days)), (_t_text(i18n, lang, "email_subscription_expiring_row_end_date"), end_date), ] text_lines = [ _t_text(i18n, lang, "email_subscription_expiring_text", heading=heading, end_date=end_date), ] if safe_dashboard_url: text_lines.append( _t_text(i18n, lang, "email_subscription_expiring_text_renew", url=safe_dashboard_url) ) body_parts = [_info_rows_html(rows)] if safe_dashboard_url: body_parts.append(_cta_button_html(label=cta_label, url=safe_dashboard_url, accent=accent)) body_parts.append( f'{html.escape(note)}
' # noqa: E501 ) rendered = _layout( settings=settings, preheader=preheader, heading=heading, intro_html=html.escape(intro), body_html="".join(body_parts), footer_html=footer, ) return EmailContent(subject=subject, text="\n".join(text_lines), html=rendered) def _subscription_lifecycle_title( i18n: JsonI18n, lang: str, notification_key: str, *, days_left: Optional[int], hours_before: Optional[int], ) -> str: if notification_key == "before_2d_autorenew": return _t_text(i18n, lang, "email_subscription_lifecycle_subject_autorenew") if notification_key == "expired": return _t_text(i18n, lang, "email_subscription_lifecycle_subject_expired") if notification_key == "expired_24h_after": return _t_text(i18n, lang, "email_subscription_lifecycle_subject_expired_after") if hours_before is not None: return _t_text( i18n, lang, "email_subscription_lifecycle_subject_before_hours", hours=hours_before, ) return _t_text( i18n, lang, "email_subscription_lifecycle_subject_before_days", days=max(0, int(days_left or 0)), ) def render_subscription_lifecycle_notification( settings: Settings, *, language_code: Optional[str], notification_key: str, message_text: str, end_date_text: str, dashboard_url: Optional[str], mirrored_from_telegram: bool = False, days_left: Optional[int] = None, hours_before: Optional[int] = None, i18n: Optional[JsonI18n] = None, ) -> EmailContent: i18n = _resolve_i18n(i18n) lang = _normalize_lang(language_code, settings) accent = _safe_color(settings.WEBAPP_PRIMARY_COLOR) brand = _brand_title(settings) safe_dashboard_url = (dashboard_url or "").strip() end_date = end_date_text or "—" subject = _subscription_lifecycle_title( i18n, lang, notification_key, days_left=days_left, hours_before=hours_before, ) intro_key = ( "email_subscription_lifecycle_intro_mirrored" if mirrored_from_telegram else "email_subscription_lifecycle_intro_direct" ) intro = _t_text(i18n, lang, intro_key) footer = _t_html(i18n, lang, "email_footer_auto", brand=brand) cta_label = _t_text(i18n, lang, "email_subscription_lifecycle_cta") rows = [ (_t_text(i18n, lang, "email_subscription_lifecycle_row_end_date"), end_date), ] message_html = ( f'