33import glob
44import shutil
55import zipfile
6- from typing import Optional , Union
6+ from typing import Optional , Union , Callable
77from loguru import logger
88from pathlib import Path
99from 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-
15021568def _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-
15671600def _confirm_import (parent : Optional [QWidget ]) -> bool :
15681601 """确认导入"""
15691602 dialog = MessageBox (
0 commit comments