Skip to content

Commit 19c949d

Browse files
committed
修复更新和导入数据
1 parent 81d599f commit 19c949d

4 files changed

Lines changed: 219 additions & 173 deletions

File tree

CHANGELOG/v2.2.5/CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ v2.0 - Koharu(小鸟游星野) release 4
2828
- 修复 **音频模块**,修复**初始化/异常**问题
2929
- 修复 **配置读取**,修复**空文件解析**错误
3030
- 修复 **数据导入**,避免占用**失败**
31+
- 修复 **数据导入**,修复覆盖确认**无法导入**
32+
- 修复 **更新下载**,文件名改读**metadata**
3133
- 修复 **抽奖显示**,修复格式映射**KeyError**
3234
- 修复 **通知显示**,修复**父组件/回调**异常
3335
- 修复 **抽奖通知**,修复小组显示并统一**分隔符**

app/tools/config.py

Lines changed: 180 additions & 147 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import glob
44
import shutil
55
import zipfile
6-
from typing import Optional, Union
6+
from typing import Optional, Union, Callable
77
from loguru import logger
88
from pathlib import Path
99
from datetime import datetime
@@ -1346,90 +1346,209 @@ def export_all_data(parent: Optional[QWidget] = None) -> None:
13461346
dialog.exec()
13471347

13481348

1349-
def import_all_data(parent: Optional[QWidget] = None) -> bool:
1350-
"""从文件导入所有数据"""
1351-
try:
1352-
file_path, _ = QFileDialog.getOpenFileName(
1353-
parent,
1354-
get_content_pushbutton_name_async("basic_settings", "import_all_data"),
1355-
"",
1356-
"ZIP Files (*.zip);;All Files (*)",
1349+
def _show_import_all_data_failure(parent: Optional[QWidget], e: Exception) -> None:
1350+
logger.exception(f"导入所有数据失败: {e}")
1351+
dialog = MessageBox(
1352+
get_any_position_value_async(
1353+
"basic_settings", "data_import_export", "import_failure_title", "name"
1354+
),
1355+
get_any_position_value_async(
1356+
"basic_settings", "data_import_export", "import_failure_content", "name"
1357+
).format(error=str(e)),
1358+
parent,
1359+
)
1360+
dialog.yesButton.setText(
1361+
get_any_position_value_async(
1362+
"basic_settings", "data_import_export", "import_success_button", "name"
13571363
)
1364+
)
1365+
dialog.cancelButton.hide()
1366+
dialog.buttonLayout.insertStretch(1)
1367+
dialog.exec()
13581368

1359-
if not file_path:
1360-
return False
13611369

1362-
version_info = _check_version_info(file_path)
1370+
def _show_import_all_data_success(
1371+
parent: Optional[QWidget],
1372+
skipped_files: list,
1373+
on_success: Optional[Callable[[], None]],
1374+
) -> None:
1375+
success_dialog = MessageBox(
1376+
get_any_position_value_async(
1377+
"basic_settings", "data_import_export", "import_success_title", "name"
1378+
),
1379+
(
1380+
get_any_position_value_async(
1381+
"basic_settings",
1382+
"data_import_export",
1383+
"import_success_content_skipped",
1384+
"name",
1385+
).format(count=len(skipped_files))
1386+
if skipped_files
1387+
else get_any_position_value_async(
1388+
"basic_settings", "data_import_export", "import_success_content", "name"
1389+
)
1390+
),
1391+
parent,
1392+
)
1393+
success_dialog.yesButton.setText(
1394+
get_any_position_value_async(
1395+
"basic_settings", "data_import_export", "import_success_button", "name"
1396+
)
1397+
)
1398+
success_dialog.cancelButton.hide()
1399+
success_dialog.buttonLayout.insertStretch(1)
1400+
success_dialog.exec()
1401+
if on_success:
1402+
try:
1403+
on_success()
1404+
except Exception:
1405+
pass
13631406

1364-
if version_info:
1365-
if not _confirm_version_mismatch(version_info, parent):
1366-
return False
13671407

1368-
existing_files = _check_existing_files(file_path)
1369-
if existing_files and not _confirm_overwrite(existing_files, parent):
1370-
return False
1408+
def _format_existing_files_preview(existing_files: list) -> str:
1409+
files_list = "\n".join(existing_files[:10])
1410+
if len(existing_files) > 10:
1411+
files_list += get_any_position_value_async(
1412+
"basic_settings", "data_import_export", "existing_files_count", "name"
1413+
).format(len=len(existing_files) - 10)
1414+
return files_list
13711415

1372-
if not _confirm_import(parent):
1373-
return False
13741416

1375-
skipped_files = _extract_data_files(file_path)
1417+
def _request_import_overwrite_confirmation(
1418+
parent: Optional[QWidget], existing_files: list, on_confirm: Callable[[], None]
1419+
) -> None:
1420+
files_list = _format_existing_files_preview(existing_files)
13761421

1377-
success_dialog = MessageBox(
1422+
def _apply() -> None:
1423+
dialog = MessageBox(
13781424
get_any_position_value_async(
1379-
"basic_settings",
1380-
"data_import_export",
1381-
"import_success_title",
1382-
"name",
1383-
),
1384-
(
1385-
get_any_position_value_async(
1386-
"basic_settings",
1387-
"data_import_export",
1388-
"import_success_content_skipped",
1389-
"name",
1390-
).format(count=len(skipped_files))
1391-
if skipped_files
1392-
else get_any_position_value_async(
1393-
"basic_settings",
1394-
"data_import_export",
1395-
"import_success_content",
1396-
"name",
1397-
)
1425+
"basic_settings", "data_import_export", "existing_files_title", "name"
13981426
),
1427+
get_any_position_value_async(
1428+
"basic_settings", "data_import_export", "existing_files_content", "name"
1429+
).format(files=files_list),
13991430
parent,
14001431
)
1401-
success_dialog.yesButton.setText(
1432+
dialog.yesButton.setText(
14021433
get_any_position_value_async(
1403-
"basic_settings",
1404-
"data_import_export",
1405-
"import_success_button",
1406-
"name",
1434+
"basic_settings", "data_import_export", "import_confirm_button", "name"
14071435
)
14081436
)
1409-
success_dialog.cancelButton.hide()
1410-
success_dialog.buttonLayout.insertStretch(1)
1411-
success_dialog.exec()
1412-
return True
1437+
dialog.cancelButton.setText(
1438+
get_any_position_value_async(
1439+
"basic_settings", "data_import_export", "import_cancel_button", "name"
1440+
)
1441+
)
1442+
if dialog.exec():
1443+
on_confirm()
14131444

1414-
except Exception as e:
1415-
logger.exception(f"导入所有数据失败: {e}")
1416-
dialog = MessageBox(
1445+
require_and_run("import_overwrite", parent, _apply)
1446+
1447+
1448+
def _request_import_version_mismatch_confirmation(
1449+
parent: Optional[QWidget],
1450+
software_name: str,
1451+
version: str,
1452+
current_version: str,
1453+
on_confirm: Callable[[], None],
1454+
) -> None:
1455+
def _apply() -> None:
1456+
warning_dialog = MessageBox(
14171457
get_any_position_value_async(
1418-
"basic_settings", "data_import_export", "import_failure_title", "name"
1458+
"basic_settings", "data_import_export", "version_mismatch_title", "name"
14191459
),
14201460
get_any_position_value_async(
1421-
"basic_settings", "data_import_export", "import_failure_content", "name"
1422-
).format(error=str(e)),
1461+
"basic_settings",
1462+
"data_import_export",
1463+
"version_mismatch_content",
1464+
"name",
1465+
).format(
1466+
software_name=software_name,
1467+
version=version,
1468+
current_version=current_version,
1469+
),
14231470
parent,
14241471
)
1425-
dialog.yesButton.setText(
1472+
warning_dialog.yesButton.setText(
14261473
get_any_position_value_async(
1427-
"basic_settings", "data_import_export", "import_success_button", "name"
1474+
"basic_settings", "data_import_export", "import_confirm_button", "name"
14281475
)
14291476
)
1430-
dialog.cancelButton.hide()
1431-
dialog.buttonLayout.insertStretch(1)
1432-
dialog.exec()
1477+
warning_dialog.cancelButton.setText(
1478+
get_any_position_value_async(
1479+
"basic_settings", "data_import_export", "import_cancel_button", "name"
1480+
)
1481+
)
1482+
if warning_dialog.exec():
1483+
on_confirm()
1484+
1485+
require_and_run("import_version_mismatch", parent, _apply)
1486+
1487+
1488+
def _perform_import_all_data_from_file(
1489+
file_path: str, parent: Optional[QWidget], on_success: Optional[Callable[[], None]]
1490+
) -> None:
1491+
if not _confirm_import(parent):
1492+
return
1493+
try:
1494+
skipped_files = _extract_data_files(file_path)
1495+
except Exception as e:
1496+
_show_import_all_data_failure(parent, e)
1497+
return
1498+
_show_import_all_data_success(parent, skipped_files, on_success)
1499+
1500+
1501+
def _start_import_all_data_flow(
1502+
file_path: str, parent: Optional[QWidget], on_success: Optional[Callable[[], None]]
1503+
) -> None:
1504+
version_info = _check_version_info(file_path)
1505+
current_version = SPECIAL_VERSION
1506+
software_name = version_info.get("software_name", "") if version_info else ""
1507+
version = version_info.get("version", "") if version_info else ""
1508+
1509+
def _after_version_confirmed() -> None:
1510+
existing_files = _check_existing_files(file_path)
1511+
if existing_files:
1512+
_request_import_overwrite_confirmation(
1513+
parent,
1514+
existing_files,
1515+
lambda: _perform_import_all_data_from_file(
1516+
file_path, parent, on_success
1517+
),
1518+
)
1519+
return
1520+
_perform_import_all_data_from_file(file_path, parent, on_success)
1521+
1522+
if version_info and (software_name != "SecRandom" or version != current_version):
1523+
_request_import_version_mismatch_confirmation(
1524+
parent,
1525+
software_name,
1526+
version,
1527+
current_version,
1528+
_after_version_confirmed,
1529+
)
1530+
return
1531+
1532+
_after_version_confirmed()
1533+
1534+
1535+
def import_all_data(
1536+
parent: Optional[QWidget] = None, on_success: Optional[Callable[[], None]] = None
1537+
) -> bool:
1538+
"""从文件导入所有数据"""
1539+
try:
1540+
file_path, _ = QFileDialog.getOpenFileName(
1541+
parent,
1542+
get_content_pushbutton_name_async("basic_settings", "import_all_data"),
1543+
"",
1544+
"ZIP Files (*.zip);;All Files (*)",
1545+
)
1546+
if not file_path:
1547+
return False
1548+
_start_import_all_data_flow(file_path, parent, on_success)
1549+
return True
1550+
except Exception as e:
1551+
_show_import_all_data_failure(parent, e)
14331552
return False
14341553

14351554

@@ -1446,59 +1565,6 @@ def _check_version_info(file_path: str) -> dict:
14461565
return version_info
14471566

14481567

1449-
def _confirm_version_mismatch(version_info: dict, parent: Optional[QWidget]) -> bool:
1450-
"""确认版本不匹配"""
1451-
software_name = version_info.get("software_name", "")
1452-
version = version_info.get("version", "")
1453-
current_version = SPECIAL_VERSION
1454-
1455-
if software_name != "SecRandom" or version != current_version:
1456-
1457-
def _apply_version_mismatch():
1458-
warning_dialog = MessageBox(
1459-
get_any_position_value_async(
1460-
"basic_settings",
1461-
"data_import_export",
1462-
"version_mismatch_title",
1463-
"name",
1464-
),
1465-
get_any_position_value_async(
1466-
"basic_settings",
1467-
"data_import_export",
1468-
"version_mismatch_content",
1469-
"name",
1470-
).format(
1471-
software_name=software_name,
1472-
version=version,
1473-
current_version=current_version,
1474-
),
1475-
parent,
1476-
)
1477-
warning_dialog.yesButton.setText(
1478-
get_any_position_value_async(
1479-
"basic_settings",
1480-
"data_import_export",
1481-
"import_confirm_button",
1482-
"name",
1483-
)
1484-
)
1485-
warning_dialog.cancelButton.setText(
1486-
get_any_position_value_async(
1487-
"basic_settings",
1488-
"data_import_export",
1489-
"import_cancel_button",
1490-
"name",
1491-
)
1492-
)
1493-
return warning_dialog.exec()
1494-
1495-
return require_and_run(
1496-
"import_version_mismatch", parent, _apply_version_mismatch
1497-
)
1498-
1499-
return True
1500-
1501-
15021568
def _check_existing_files(file_path: str) -> list:
15031569
"""检查已存在的文件"""
15041570
existing_files = []
@@ -1531,39 +1597,6 @@ def _check_existing_files(file_path: str) -> list:
15311597
return existing_files
15321598

15331599

1534-
def _confirm_overwrite(existing_files: list, parent: Optional[QWidget]) -> bool:
1535-
"""确认覆盖文件"""
1536-
files_list = "\n".join(existing_files[:10])
1537-
if len(existing_files) > 10:
1538-
files_list += get_any_position_value_async(
1539-
"basic_settings", "data_import_export", "existing_files_count", "name"
1540-
).format(len=len(existing_files) - 10)
1541-
1542-
def _apply_overwrite():
1543-
dialog = MessageBox(
1544-
get_any_position_value_async(
1545-
"basic_settings", "data_import_export", "existing_files_title", "name"
1546-
),
1547-
get_any_position_value_async(
1548-
"basic_settings", "data_import_export", "existing_files_content", "name"
1549-
).format(files=files_list),
1550-
parent,
1551-
)
1552-
dialog.yesButton.setText(
1553-
get_any_position_value_async(
1554-
"basic_settings", "data_import_export", "import_confirm_button", "name"
1555-
)
1556-
)
1557-
dialog.cancelButton.setText(
1558-
get_any_position_value_async(
1559-
"basic_settings", "data_import_export", "import_cancel_button", "name"
1560-
)
1561-
)
1562-
return dialog.exec()
1563-
1564-
return require_and_run("import_overwrite", parent, _apply_overwrite)
1565-
1566-
15671600
def _confirm_import(parent: Optional[QWidget]) -> bool:
15681601
"""确认导入"""
15691602
dialog = MessageBox(

0 commit comments

Comments
 (0)