Dieser Commit ist enthalten in:
Claude Project Manager
2025-08-01 23:50:28 +02:00
Commit 04585e95b6
290 geänderte Dateien mit 64086 neuen und 0 gelöschten Zeilen

Datei anzeigen

@ -0,0 +1,207 @@
"""
Controller für die Verwaltung von Accounts.
"""
import logging
import csv
from datetime import datetime
from PyQt5.QtWidgets import QFileDialog, QMessageBox
from PyQt5.QtCore import QObject
from application.use_cases.export_accounts_use_case import ExportAccountsUseCase
logger = logging.getLogger("account_controller")
class AccountController(QObject):
"""Controller für die Verwaltung von Accounts."""
def __init__(self, db_manager):
super().__init__()
self.db_manager = db_manager
self.parent_view = None
self.export_use_case = ExportAccountsUseCase(db_manager)
# Import Fingerprint Generator
from application.use_cases.generate_account_fingerprint_use_case import GenerateAccountFingerprintUseCase
self.fingerprint_generator = GenerateAccountFingerprintUseCase(db_manager)
def set_parent_view(self, view):
"""Setzt die übergeordnete View für Dialoge."""
self.parent_view = view
def on_account_created(self, platform: str, account_data: dict):
"""Wird aufgerufen, wenn ein Account erstellt wurde."""
account = {
"platform": platform.lower(),
"username": account_data.get("username", ""),
"password": account_data.get("password", ""),
"email": account_data.get("email", ""),
"phone": account_data.get("phone", ""),
"full_name": account_data.get("full_name", ""),
"created_at": datetime.now().strftime("%Y-%m-%d %H:%M:%S")
}
# Account zur Datenbank hinzufügen
account_id = self.db_manager.add_account(account)
logger.info(f"Account in Datenbank gespeichert: {account['username']} (ID: {account_id})")
# Fingerprint für neuen Account generieren
if account_id and account_id > 0:
logger.info(f"Generiere Fingerprint für neuen Account {account_id}")
fingerprint_id = self.fingerprint_generator.execute(account_id)
if fingerprint_id:
logger.info(f"Fingerprint {fingerprint_id} wurde Account {account_id} zugewiesen")
else:
logger.warning(f"Konnte keinen Fingerprint für Account {account_id} generieren")
# Erfolgsmeldung anzeigen
if self.parent_view:
QMessageBox.information(
self.parent_view,
"Erfolg",
f"Account erfolgreich erstellt!\n\nBenutzername: {account['username']}\nPasswort: {account['password']}\nE-Mail/Telefon: {account['email'] or account['phone']}"
)
def load_accounts(self, platform=None):
"""Lädt Accounts aus der Datenbank."""
try:
if platform and hasattr(self.db_manager, "get_accounts_by_platform"):
accounts = self.db_manager.get_accounts_by_platform(platform.lower())
else:
accounts = self.db_manager.get_all_accounts()
if platform:
accounts = [acc for acc in accounts if acc.get("platform", "").lower() == platform.lower()]
return accounts
except Exception as e:
logger.error(f"Fehler beim Laden der Accounts: {e}")
if self.parent_view:
QMessageBox.critical(
self.parent_view,
"Fehler",
f"Fehler beim Laden der Accounts:\n{str(e)}"
)
return []
def export_accounts(self, platform=None, accounts_to_export=None):
"""Exportiert Accounts in eine CSV-Datei."""
parent = self.parent_view or None
# Dialog für Format-Auswahl
from PyQt5.QtWidgets import QDialog, QVBoxLayout, QRadioButton, QPushButton, QCheckBox, QDialogButtonBox
dialog = QDialog(parent)
dialog.setWindowTitle("Export-Optionen")
dialog.setMinimumWidth(300)
layout = QVBoxLayout(dialog)
# Format-Auswahl
csv_radio = QRadioButton("CSV Format (Excel-kompatibel)")
csv_radio.setChecked(True)
json_radio = QRadioButton("JSON Format")
layout.addWidget(csv_radio)
layout.addWidget(json_radio)
# Passwort-Option
include_passwords = QCheckBox("Passwörter einschließen")
include_passwords.setChecked(True)
layout.addWidget(include_passwords)
# Buttons
buttons = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel)
buttons.accepted.connect(dialog.accept)
buttons.rejected.connect(dialog.reject)
layout.addWidget(buttons)
if dialog.exec_() != QDialog.Accepted:
return
# Format bestimmen
format = 'csv' if csv_radio.isChecked() else 'json'
file_extension = '*.csv' if format == 'csv' else '*.json'
file_filter = f"{format.upper()}-Dateien ({file_extension});;Alle Dateien (*)"
# Dateiname vorschlagen
suggested_filename = self.export_use_case.get_export_filename(platform, format)
file_path, _ = QFileDialog.getSaveFileName(
parent,
"Konten exportieren",
suggested_filename,
file_filter
)
if not file_path:
return
try:
# Export durchführen mit Use Case
if accounts_to_export:
# Wenn spezifische Accounts übergeben wurden
export_data = self.export_use_case.execute_with_accounts(
accounts=accounts_to_export,
format=format,
include_passwords=include_passwords.isChecked()
)
else:
# Standard-Export basierend auf Platform
export_data = self.export_use_case.execute(
platform=platform,
format=format,
include_passwords=include_passwords.isChecked()
)
if not export_data:
QMessageBox.warning(
parent,
"Keine Daten",
"Es wurden keine Accounts zum Exportieren gefunden."
)
return
# Datei schreiben
with open(file_path, "wb") as f:
f.write(export_data)
logger.info(f"Accounts erfolgreich nach {file_path} exportiert")
if parent:
QMessageBox.information(
parent,
"Export erfolgreich",
f"Konten wurden erfolgreich nach {file_path} exportiert."
)
except Exception as e:
logger.error(f"Fehler beim Exportieren der Accounts: {e}")
if parent:
QMessageBox.critical(
parent,
"Export fehlgeschlagen",
f"Fehler beim Exportieren der Konten:\n{str(e)}"
)
def delete_account(self, account_id):
"""Löscht einen Account aus der Datenbank."""
try:
success = self.db_manager.delete_account(account_id)
if not success:
if self.parent_view:
QMessageBox.critical(
self.parent_view,
"Fehler",
f"Konto mit ID {account_id} konnte nicht gelöscht werden."
)
return success
except Exception as e:
logger.error(f"Fehler beim Löschen des Accounts: {e}")
if self.parent_view:
QMessageBox.critical(
self.parent_view,
"Fehler",
f"Fehler beim Löschen des Kontos:\n{str(e)}"
)
return False