Files
test-main/views/tabs/accounts_tab.py
Claude Project Manager 08ed938105 Initial commit
2025-07-03 21:11:05 +02:00

208 Zeilen
8.3 KiB
Python

"""
Tab zur Verwaltung der erstellten Social-Media-Accounts.
"""
import logging
from PyQt5.QtWidgets import (
QWidget, QVBoxLayout, QHBoxLayout, QTableWidget,
QTableWidgetItem, QPushButton, QHeaderView, QMessageBox
)
from PyQt5.QtCore import pyqtSignal, Qt
logger = logging.getLogger("accounts_tab")
class AccountsTab(QWidget):
"""Widget für den Konten-Tab."""
# Signale
refresh_requested = pyqtSignal()
export_requested = pyqtSignal()
delete_requested = pyqtSignal(int) # account_id
def __init__(self, platform_name=None, db_manager=None, language_manager=None):
super().__init__()
self.platform_name = platform_name
self.db_manager = db_manager
self.language_manager = language_manager
self.init_ui()
if self.language_manager:
self.language_manager.language_changed.connect(self.update_texts)
self.update_texts()
# Konten laden, falls db_manager vorhanden
if self.db_manager:
self.load_accounts()
def init_ui(self):
"""Initialisiert die Benutzeroberfläche."""
layout = QVBoxLayout(self)
# Konten-Tabelle
self.accounts_table = QTableWidget()
self.accounts_table.setColumnCount(8)
self.accounts_table.setHorizontalHeaderLabels([
"ID",
"Benutzername",
"Passwort",
"E-Mail",
"Handynummer",
"Name",
"Plattform",
"Erstellt am",
])
self.accounts_table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
# ID-Spalte verstecken
self.accounts_table.setColumnHidden(0, True)
layout.addWidget(self.accounts_table)
# Button-Leiste
button_layout = QHBoxLayout()
self.refresh_button = QPushButton("Aktualisieren")
self.refresh_button.clicked.connect(self.on_refresh_clicked)
self.export_button = QPushButton("Exportieren")
self.export_button.clicked.connect(self.on_export_clicked)
self.delete_button = QPushButton("Löschen")
self.delete_button.clicked.connect(self.on_delete_clicked)
button_layout.addWidget(self.refresh_button)
button_layout.addWidget(self.export_button)
button_layout.addWidget(self.delete_button)
layout.addLayout(button_layout)
def load_accounts(self):
"""Lädt Konten aus der Datenbank und zeigt sie in der Tabelle an."""
try:
if (self.platform_name and str(self.platform_name).lower() not in ["all", ""]
and hasattr(self.db_manager, "get_accounts_by_platform")):
accounts = self.db_manager.get_accounts_by_platform(self.platform_name.lower())
else:
accounts = self.db_manager.get_all_accounts()
if self.platform_name and str(self.platform_name).lower() not in ["all", ""]:
accounts = [
acc for acc in accounts
if acc.get("platform", "").lower() == str(self.platform_name).lower()
]
self.display_accounts(accounts)
except Exception as e:
logger.error(f"Fehler beim Laden der Konten: {e}")
QMessageBox.critical(self, "Fehler", f"Fehler beim Laden der Konten:\n{str(e)}")
def display_accounts(self, accounts):
"""Zeigt die Konten in der Tabelle an."""
self.accounts_table.setRowCount(len(accounts))
for row, account in enumerate(accounts):
self.accounts_table.setItem(row, 0, QTableWidgetItem(str(account.get("id", ""))))
self.accounts_table.setItem(row, 1, QTableWidgetItem(account.get("username", "")))
self.accounts_table.setItem(row, 2, QTableWidgetItem(account.get("password", "")))
self.accounts_table.setItem(row, 3, QTableWidgetItem(account.get("email", "")))
self.accounts_table.setItem(row, 4, QTableWidgetItem(account.get("phone", "")))
self.accounts_table.setItem(row, 5, QTableWidgetItem(account.get("full_name", "")))
self.accounts_table.setItem(row, 6, QTableWidgetItem(account.get("platform", "")))
self.accounts_table.setItem(row, 7, QTableWidgetItem(account.get("created_at", "")))
def on_refresh_clicked(self):
"""Wird aufgerufen, wenn der Aktualisieren-Button geklickt wird."""
self.refresh_requested.emit()
# Direkt aktualisieren, falls db_manager vorhanden
if self.db_manager:
self.load_accounts()
def on_export_clicked(self):
"""Wird aufgerufen, wenn der Exportieren-Button geklickt wird."""
self.export_requested.emit()
def on_delete_clicked(self):
"""Wird aufgerufen, wenn der Löschen-Button geklickt wird."""
selected_rows = self.accounts_table.selectionModel().selectedRows()
if not selected_rows:
title = "Kein Konto ausgewählt"
text = "Bitte wählen Sie ein Konto zum Löschen aus."
if self.language_manager:
title = self.language_manager.get_text(
"accounts_tab.no_selection_title", title
)
text = self.language_manager.get_text(
"accounts_tab.no_selection_text", text
)
QMessageBox.warning(self, title, text)
return
account_id = int(self.accounts_table.item(selected_rows[0].row(), 0).text())
username = self.accounts_table.item(selected_rows[0].row(), 1).text()
q_title = "Konto löschen"
q_text = f"Möchten Sie das Konto '{username}' wirklich löschen?"
if self.language_manager:
q_title = self.language_manager.get_text("accounts_tab.delete_title", q_title)
q_text = self.language_manager.get_text(
"accounts_tab.delete_text", q_text
).format(username=username)
reply = QMessageBox.question(
self,
q_title,
q_text,
QMessageBox.Yes | QMessageBox.No,
QMessageBox.No,
)
if reply == QMessageBox.Yes:
self.delete_requested.emit(account_id)
# Direkt aktualisieren, falls db_manager vorhanden
if self.db_manager:
success = self.db_manager.delete_account(account_id)
if success:
self.load_accounts()
suc_title = "Erfolg"
suc_text = f"Konto '{username}' wurde gelöscht."
if self.language_manager:
suc_title = self.language_manager.get_text(
"accounts_tab.delete_success_title", suc_title
)
suc_text = self.language_manager.get_text(
"accounts_tab.delete_success_text", suc_text
).format(username=username)
QMessageBox.information(self, suc_title, suc_text)
else:
err_title = "Fehler"
err_text = f"Konto '{username}' konnte nicht gelöscht werden."
if self.language_manager:
err_title = self.language_manager.get_text(
"accounts_tab.delete_error_title", err_title
)
err_text = self.language_manager.get_text(
"accounts_tab.delete_error_text", err_text
).format(username=username)
QMessageBox.critical(self, err_title, err_text)
def update_texts(self):
"""Aktualisiert UI-Texte gemäß aktueller Sprache."""
if not self.language_manager:
return
lm = self.language_manager
self.refresh_button.setText(lm.get_text("buttons.refresh", "Aktualisieren"))
self.export_button.setText(lm.get_text("buttons.export", "Exportieren"))
self.delete_button.setText(lm.get_text("buttons.delete", "Löschen"))
headers = lm.get_text(
"accounts_tab.headers",
[
"ID",
"Benutzername",
"Passwort",
"E-Mail",
"Handynummer",
"Name",
"Plattform",
"Erstellt am",
],
)
self.accounts_table.setHorizontalHeaderLabels(headers)