PythonApplicationTemplate/app/ui/windows/suggestion_window.py

147 lines
5.4 KiB
Python

from PyQt6.QtWidgets import QWidget, QVBoxLayout, QTextEdit, QPushButton, QLabel, QMessageBox, QHBoxLayout
from PyQt6.QtCore import Qt, QThread, pyqtSignal
import time
import smtplib
import os
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from app.core.main_manager import MainManager, NotificationType
class EmailSender(QThread):
success = pyqtSignal()
error = pyqtSignal(str)
def __init__(self, subject, message):
super().__init__()
self.subject = subject
self.message = message
def run(self):
try:
# Get email configuration from environment variables
password = 'xprqegxuqixgljyi'
email = 'louismazindev@gmail.com'
smtp_server = 'smtp.gmail.com'
smtp_port = 587
if not password:
# Fallback to simulation if no credentials are configured
self._simulate_email_sending()
return
# Create message
msg = 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(smtp_server, smtp_port)
server.starttls() # Enable TLS encryption
# Login with app password
server.login(email, password)
# Send email
text = msg.as_string()
server.sendmail(email, email, text)
server.quit()
self.success.emit()
except Exception as e:
self.error.emit()
def _simulate_email_sending(self):
"""Fallback simulation when no email credentials are configured"""
time.sleep(2) # Simulate network delay
print("=== EMAIL SIMULATION (No credentials configured) ===")
print(f"Subject: {self.subject}")
print(f"Message: {self.message}")
print("=" * 55)
self.success.emit()
class SuggestionWindow(QWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.main_manager = MainManager.get_instance()
self.language_manager = self.main_manager.get_language_manager()
self.settings_manager = self.main_manager.get_settings_manager()
self.observer_manager = self.main_manager.get_observer_manager()
self.observer_manager.subscribe(NotificationType.LANGUAGE, self.update_language)
self.setup_ui()
def setup_ui(self):
layout = QVBoxLayout(self)
layout.setAlignment(Qt.AlignmentFlag.AlignTop)
layout.setSpacing(20)
layout.setContentsMargins(20, 20, 20, 20)
# Title
self.title_label = QLabel(self.language_manager.get_text("suggestion_text"), self)
self.title_label.setStyleSheet("font-size: 18px; font-weight: bold; margin-bottom: 10px;")
layout.addWidget(self.title_label)
# Text area for suggestion
self.text_edit = QTextEdit(self)
self.text_edit.setPlaceholderText(self.language_manager.get_text("suggestion_placeholder"))
self.text_edit.setMinimumHeight(200)
layout.addWidget(self.text_edit)
# Button layout
button_layout = QHBoxLayout()
button_layout.addStretch()
# Send button
self.send_button = 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)
layout.addStretch()
def send_suggestion(self):
message = self.text_edit.toPlainText().strip()
if not message:
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 = f"Suggestion for {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):
self.send_button.setEnabled(True)
self.send_button.setText(self.language_manager.get_text("send_suggestion"))
QMessageBox.information(self,
self.language_manager.get_text("success"),
self.language_manager.get_text("suggestion_sent_success"))
self.text_edit.clear()
def on_email_error(self):
self.send_button.setEnabled(True)
self.send_button.setText(self.language_manager.get_text("send_suggestion"))
QMessageBox.critical(self,
self.language_manager.get_text("error"),
f"{self.language_manager.get_text('suggestion_send_error')}")
def update_language(self):
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"))