dev: 支持清空数据库

This commit is contained in:
Julian Freeman
2024-07-19 13:43:13 -04:00
parent 631127377a
commit 85b6456f87
3 changed files with 90 additions and 11 deletions

View File

@@ -1,8 +1,12 @@
# coding: utf8
import sqlite3
from pathlib import Path
from PySide6 import QtWidgets
from pykeepass.exceptions import CredentialsError
from .gbx_kps_login import GbxKpsLogin
from .utils import accept_warning
from lib.Sqlite3Helper import Sqlite3Worker
from lib.kps_operations import read_kps_to_db
@@ -18,6 +22,14 @@ class WgLoadKps(QtWidgets.QWidget):
self.setLayout(self.vly_m)
self.vly_m.addStretch(1)
def update_load_status(self, wg: GbxKpsLogin):
db_name = Path(self.sqh.db_name).name
loaded_mem = self.config["loaded_memory"]
if db_name in loaded_mem and wg.lne_path.text() in loaded_mem[db_name]:
wg.set_loaded(True)
else:
wg.set_loaded(False)
def add_kps(self, path: str):
wg = GbxKpsLogin(path, self)
wg.pbn_remove.clicked_with_item.connect(self.on_item_pbn_remove_clicked)
@@ -26,6 +38,9 @@ class WgLoadKps(QtWidgets.QWidget):
self.vly_m.insertWidget(self.vly_m.count() - 1, wg)
self.kps_wgs.append(wg)
# 检查是否已经加载过
self.update_load_status(wg)
def on_item_pbn_remove_clicked(self, item: GbxKpsLogin):
self.vly_m.removeWidget(item)
self.kps_wgs.remove(item)
@@ -43,6 +58,11 @@ class WgLoadKps(QtWidgets.QWidget):
return
item.set_loaded(True)
loaded_mem = self.config["loaded_memory"]
db_name = Path(self.sqh.db_name).name
if db_name not in loaded_mem:
loaded_mem[db_name] = []
loaded_mem[db_name].append(item.lne_path.text())
def update_sqh(self, sqh: Sqlite3Worker):
self.sqh = sqh
@@ -53,18 +73,26 @@ class WgLoadKps(QtWidgets.QWidget):
class PageLoad(QtWidgets.QWidget):
def __init__(self, sqh: Sqlite3Worker, config: dict, parent=None):
super().__init__(parent)
self.sqh = sqh
self.config = config
self.hly_m = QtWidgets.QHBoxLayout()
self.setLayout(self.hly_m)
self.vly_left = QtWidgets.QVBoxLayout()
self.hly_m.addLayout(self.vly_left)
self.pbn_add = QtWidgets.QPushButton("添加", self)
self.pbn_add.setMinimumWidth(config["button_min_width"])
self.vly_left.addWidget(self.pbn_add)
self.pbn_load_all = QtWidgets.QPushButton("加载全部", self)
self.pbn_load_all.setMinimumWidth(config["button_min_width"])
self.pbn_load_all.setDisabled(True)
self.vly_left.addWidget(self.pbn_load_all)
self.pbn_add_kps = QtWidgets.QPushButton("添加 KPS", self)
self.pbn_add_kps.setMinimumWidth(config["button_min_width"])
self.vly_left.addWidget(self.pbn_add_kps)
self.pbn_clear_db = QtWidgets.QPushButton("清空数据库", self)
self.pbn_clear_db.setMinimumWidth(config["button_min_width"])
self.vly_left.addWidget(self.pbn_clear_db)
self.pbn_clear_loaded_mem = QtWidgets.QPushButton("清空加载记忆", self)
self.pbn_clear_loaded_mem.setMinimumWidth(config["button_min_width"])
self.vly_left.addWidget(self.pbn_clear_loaded_mem)
self.vly_left.addStretch(1)
self.sa_m = QtWidgets.QScrollArea(self)
@@ -73,9 +101,14 @@ class PageLoad(QtWidgets.QWidget):
self.wg_sa = WgLoadKps(sqh, config, self.sa_m)
self.sa_m.setWidget(self.wg_sa)
self.pbn_add.clicked.connect(self.on_pbn_add_clicked)
self.pbn_add_kps.clicked.connect(self.on_pbn_add_kps_clicked)
self.pbn_clear_db.clicked.connect(self.on_pbn_clear_db_clicked)
self.pbn_clear_loaded_mem.clicked.connect(self.on_pbn_clear_loaded_mem_clicked)
def on_pbn_add_clicked(self):
def update_sqh(self, sqh: Sqlite3Worker):
self.wg_sa.update_sqh(sqh)
def on_pbn_add_kps_clicked(self):
filenames, _ = QtWidgets.QFileDialog.getOpenFileNames(self, "选择", "../",
filter="KeePass 2 数据库 (*.kdbx);;所有文件 (*)")
if len(filenames) == 0:
@@ -83,5 +116,35 @@ class PageLoad(QtWidgets.QWidget):
for filename in filenames:
self.wg_sa.add_kps(filename)
def update_sqh(self, sqh: Sqlite3Worker):
self.wg_sa.update_sqh(sqh)
def on_pbn_clear_db_clicked(self):
if accept_warning(self, True, "警告", "你确定要清空当前数据库吗?"):
return
try:
self.sqh.delete_from(self.config["table_name"])
except sqlite3.OperationalError as e:
QtWidgets.QMessageBox.critical(self, "错误", f"清空数据库失败:\n{e}")
else:
QtWidgets.QMessageBox.information(self, "提示", "已清空数据库")
# 清空配置文件加载记忆
loaded_mem = self.config["loaded_memory"]
db_name = Path(self.sqh.db_name).name
if db_name in loaded_mem:
loaded_mem[db_name].clear()
# 更新kps加载状态
for wg in self.wg_sa.kps_wgs:
self.wg_sa.update_load_status(wg)
def on_pbn_clear_loaded_mem_clicked(self):
if accept_warning(self, True, "警告", "你确定要清空所有加载记忆吗?"):
return
loaded_mem: dict = self.config["loaded_memory"]
loaded_mem.clear()
QtWidgets.QMessageBox.information(self, "提示", "已清空加载记忆")
# 更新kps加载状态
for wg in self.wg_sa.kps_wgs:
self.wg_sa.update_load_status(wg)

11
src/utils.py Normal file
View File

@@ -0,0 +1,11 @@
# coding: utf8
from PySide6 import QtWidgets
def accept_warning(widget: QtWidgets.QWidget, condition: bool,
caption: str = "Warning", text: str = "Are you sure to continue?") -> bool:
if condition:
b = QtWidgets.QMessageBox.question(widget, caption, text)
if b == QtWidgets.QMessageBox.StandardButton.No:
return True
return False