Initial commit
Dieser Commit ist enthalten in:
207
controllers/account_controller.py
Normale Datei
207
controllers/account_controller.py
Normale Datei
@ -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
|
||||
In neuem Issue referenzieren
Einen Benutzer sperren