HoDA_Radio/app/ui/windows/suggestion_window.py
2025-09-21 20:13:54 +02:00

138 lines
5.6 KiB
Python

from PyQt6.QtWidgets import QWidget, QVBoxLayout, QTextEdit, QPushButton, QLabel, QHBoxLayout
from PyQt6.QtCore import Qt, QThread, pyqtSignal
import smtplib, os
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from dotenv import load_dotenv
from app.core.main_manager import MainManager, NotificationType
from typing import Optional
import app.utils.paths as path
# Load environment variables from .env file
load_dotenv(path.resource_path(".env"))
class EmailSender(QThread):
success = pyqtSignal()
error = pyqtSignal(str)
def __init__(self, subject: str, message: str) -> None:
super().__init__()
self.subject: str = subject
self.message: str = message
def run(self) -> None:
try:
# Get email configuration from environment variables
email: Optional[str] = os.getenv('EMAIL_ADDRESS')
password: Optional[str] = os.getenv('EMAIL_PASSWORD')
smtp_server: str = os.getenv('EMAIL_SMTP_SERVER', 'smtp.gmail.com')
smtp_port: int = int(os.getenv('EMAIL_SMTP_PORT', '587'))
if not email or not password:
self.error.emit("password")
return
# Create message
msg: MIMEMultipart = MIMEMultipart()
msg['From'] = email
msg['To'] = email
msg['Subject'] = self.subject
# Add body to email
msg.attach(MIMEText(self.message, 'plain'))
# Create SMTP session
server: smtplib.SMTP = smtplib.SMTP(smtp_server, smtp_port)
server.starttls() # Enable TLS encryption
# Login with app password
server.login(email, password)
# Send email
text: str = msg.as_string()
server.sendmail(email, email, text)
server.quit()
self.success.emit()
except smtplib.SMTPAuthenticationError:
self.error.emit("email_credentials_error")
except Exception:
self.error.emit("suggestion_send_error")
class SuggestionWindow(QWidget):
def __init__(self, parent: Optional[QWidget] = None) -> None:
super().__init__(parent)
self.main_manager: MainManager = MainManager.get_instance()
self.language_manager = self.main_manager.get_language_manager()
self.settings_manager = self.main_manager.get_settings_manager()
self.alert_manager = self.main_manager.get_alert_manager()
self.observer_manager = self.main_manager.get_observer_manager()
self.observer_manager.subscribe(NotificationType.LANGUAGE, self.update_language)
self.email_sender: Optional[EmailSender] = None
self.setup_ui()
def setup_ui(self) -> None:
layout: QVBoxLayout = QVBoxLayout(self)
layout.setAlignment(Qt.AlignmentFlag.AlignTop)
layout.setSpacing(20)
layout.setContentsMargins(20, 20, 20, 20)
# Title
self.title_label: QLabel = QLabel(self.language_manager.get_text("suggestion_text"), self)
self.title_label.setStyleSheet("font-size: 18px; font-weight: bold; margin-bottom: 10px;")
self.title_label.setWordWrap(True) # Permet le retour à la ligne automatique
self.title_label.setSizePolicy(self.title_label.sizePolicy().horizontalPolicy(),
self.title_label.sizePolicy().verticalPolicy())
layout.addWidget(self.title_label)
# Text area for suggestion
self.text_edit: QTextEdit = QTextEdit(self)
self.text_edit.setPlaceholderText(self.language_manager.get_text("suggestion_placeholder"))
layout.addWidget(self.text_edit)
# Button layout
button_layout: QHBoxLayout = QHBoxLayout()
button_layout.addStretch()
# Send button
self.send_button: QPushButton = QPushButton(self.language_manager.get_text("send_suggestion"), self)
self.send_button.clicked.connect(self.send_suggestion)
button_layout.addWidget(self.send_button)
layout.addLayout(button_layout)
def send_suggestion(self) -> None:
message: str = self.text_edit.toPlainText().strip()
if len(message)<15:
self.alert_manager.show_error("suggestion_too_short")
return
# Disable send button during sending
self.send_button.setEnabled(False)
self.send_button.setText(self.language_manager.get_text("sending"))
# Create subject with app name
subject: str = f"Suggestion pour {self.settings_manager.get_config('app_name')}"
# Create and start email sender thread
self.email_sender = EmailSender(subject, message)
self.email_sender.success.connect(self.on_email_sent)
self.email_sender.error.connect(self.on_email_error)
self.email_sender.start()
def on_email_sent(self) -> None:
self.send_button.setEnabled(True)
self.send_button.setText(self.language_manager.get_text("send_suggestion"))
self.alert_manager.show_success("suggestion_sent_success")
self.text_edit.clear()
def on_email_error(self, error: str) -> None:
self.send_button.setEnabled(True)
self.send_button.setText(self.language_manager.get_text("send_suggestion"))
self.alert_manager.show_error(error)
def update_language(self) -> None:
self.title_label.setText(self.language_manager.get_text("suggestion_text"))
self.text_edit.setPlaceholderText(self.language_manager.get_text("suggestion_placeholder"))
self.send_button.setText(self.language_manager.get_text("send_suggestion"))