generated from LouisMazin/PythonApplicationTemplate
138 lines
5.6 KiB
Python
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"))
|