feat: implement hybrid address system and premium search logic
- Added centralized, self-learning GeoService (ZIP, City, Street) - Implemented Hybrid Address Management (Centralized table + Denormalized fields) - Fixed Gamification logic (PointsLedger field names & filtering) - Added address autocomplete and two-tier (Free/Premium) search API - Synchronized UserStats and PointsLedger schemas
This commit is contained in:
@@ -1,35 +1,40 @@
|
||||
import os
|
||||
import smtplib
|
||||
import logging
|
||||
from email.mime.text import MIMEText
|
||||
from email.mime.multipart import MIMEMultipart
|
||||
from app.core.config import settings
|
||||
from app.core.i18n import locale_manager # Feltételezve, hogy létrehoztad az i18n.py-t
|
||||
from app.core.i18n import locale_manager
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
class EmailManager:
|
||||
@staticmethod
|
||||
def _get_html_template(template_key: str, variables: dict, lang: str = "hu") -> str:
|
||||
# A JSON-ból vesszük a szövegeket
|
||||
"""HTML sablon generálása a fordítási fájlok alapján."""
|
||||
greeting = locale_manager.get(f"email.{template_key}_greeting", lang=lang, **variables)
|
||||
body = locale_manager.get(f"email.{template_key}_body", lang=lang, **variables)
|
||||
button_text = locale_manager.get(f"email.{template_key}_button", lang=lang)
|
||||
footer = locale_manager.get(f"email.{template_key}_footer", lang=lang)
|
||||
|
||||
# Egységes HTML váz gombbal
|
||||
return f"""
|
||||
<html>
|
||||
<body style="font-family: Arial, sans-serif; color: #333;">
|
||||
<div style="max-width: 600px; margin: 0 auto; border: 1px solid #ddd; padding: 20px;">
|
||||
<h2>{greeting}</h2>
|
||||
<body style="font-family: Arial, sans-serif; color: #333; line-height: 1.6;">
|
||||
<div style="max-width: 600px; margin: 0 auto; border: 1px solid #ddd; padding: 30px; border-radius: 10px;">
|
||||
<h2 style="color: #2c3e50;">{greeting}</h2>
|
||||
<p>{body}</p>
|
||||
<div style="text-align: center; margin: 30px 0;">
|
||||
<div style="text-align: center; margin: 40px 0;">
|
||||
<a href="{variables.get('link', '#')}"
|
||||
style="background-color: #3498db; color: white; padding: 12px 25px; text-decoration: none; border-radius: 5px; font-weight: bold;">
|
||||
{button_text}
|
||||
style="background-color: #3498db; color: white; padding: 15px 30px; text-decoration: none; border-radius: 5px; font-weight: bold; font-size: 16px;">
|
||||
{button_text}
|
||||
</a>
|
||||
</div>
|
||||
<p style="font-size: 0.9em; color: #666;">{variables.get('link')}</p>
|
||||
<hr style="border: 0; border-top: 1px solid #eee;">
|
||||
<p style="font-size: 0.8em; color: #999;">{footer}</p>
|
||||
<p style="font-size: 0.85em; color: #777; word-break: break-all;">
|
||||
Ha a gomb nem működik, másolja be ezt a linket a böngészőjébe:<br>
|
||||
{variables.get('link')}
|
||||
</p>
|
||||
<hr style="border: 0; border-top: 1px solid #eee; margin: 30px 0;">
|
||||
<p style="font-size: 0.8em; color: #999; text-align: center;">{footer}</p>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -37,16 +42,20 @@ class EmailManager:
|
||||
|
||||
@staticmethod
|
||||
async def send_email(recipient: str, template_key: str, variables: dict, lang: str = "hu"):
|
||||
if settings.EMAIL_PROVIDER == "disabled": return
|
||||
"""E-mail küldése SendGrid-en keresztül, SMTP fallback-el."""
|
||||
if settings.EMAIL_PROVIDER == "disabled":
|
||||
logger.info("Email küldés letiltva.")
|
||||
return
|
||||
|
||||
html = EmailManager._get_html_template(template_key, variables, lang)
|
||||
subject = locale_manager.get(f"email.{template_key}_subject", lang=lang)
|
||||
|
||||
# SendGrid küldés
|
||||
# 1. SendGrid Küldés
|
||||
if settings.EMAIL_PROVIDER == "sendgrid" and settings.SENDGRID_API_KEY:
|
||||
try:
|
||||
from sendgrid import SendGridAPIClient
|
||||
from sendgrid.helpers.mail import Mail
|
||||
|
||||
message = Mail(
|
||||
from_email=(settings.EMAILS_FROM_EMAIL, settings.EMAILS_FROM_NAME),
|
||||
to_emails=recipient,
|
||||
@@ -54,23 +63,27 @@ class EmailManager:
|
||||
html_content=html
|
||||
)
|
||||
sg = SendGridAPIClient(settings.SENDGRID_API_KEY)
|
||||
sg.send(message)
|
||||
return {"status": "success"}
|
||||
response = sg.send(message)
|
||||
|
||||
logger.info(f"SendGrid Status: {response.status_code} for {recipient}")
|
||||
if response.status_code >= 400:
|
||||
logger.error(f"SendGrid Hibaüzenet: {response.body}")
|
||||
|
||||
return {"status": "success", "provider": "sendgrid", "code": response.status_code}
|
||||
except Exception as e:
|
||||
print(f"SendGrid Error: {e}")
|
||||
logger.error(f"SendGrid Kritikus Hiba: {str(e)}")
|
||||
|
||||
# SMTP Fallback
|
||||
# ... (az eredeti SMTP kódod ide jön változatlanul)
|
||||
# 2) SMTP fallback
|
||||
# 2. SMTP Fallback
|
||||
if not settings.SMTP_HOST or not settings.SMTP_USER or not settings.SMTP_PASSWORD:
|
||||
return {"status": "error", "provider": "smtp", "message": "SMTP not configured"}
|
||||
logger.warning("SMTP nincs konfigurálva a fallback-hez.")
|
||||
return {"status": "error", "message": "Nincs elérhető szolgáltató."}
|
||||
|
||||
try:
|
||||
msg = MIMEMultipart()
|
||||
msg["From"] = f"{settings.EMAILS_FROM_NAME} <{settings.EMAILS_FROM_EMAIL}>"
|
||||
msg["To"] = recipient
|
||||
msg["Subject"] = subject
|
||||
msg.attach(MIMEText(html or "Üzenet", "html"))
|
||||
msg.attach(MIMEText(html, "html"))
|
||||
|
||||
with smtplib.SMTP(settings.SMTP_HOST, settings.SMTP_PORT, timeout=15) as server:
|
||||
if settings.SMTP_USE_TLS:
|
||||
@@ -78,8 +91,10 @@ class EmailManager:
|
||||
server.login(settings.SMTP_USER, settings.SMTP_PASSWORD)
|
||||
server.send_message(msg)
|
||||
|
||||
logger.info(f"Email sikeresen kiküldve (SMTP) ide: {recipient}")
|
||||
return {"status": "success", "provider": "smtp"}
|
||||
except Exception as e:
|
||||
return {"status": "error", "provider": "smtp", "message": str(e)}
|
||||
logger.error(f"SMTP Hiba: {str(e)}")
|
||||
return {"status": "error", "message": str(e)}
|
||||
|
||||
email_manager = EmailManager()
|
||||
email_manager = EmailManager()
|
||||
Reference in New Issue
Block a user