9 import json |
9 import json |
10 from zipfile import ZipFile |
10 from zipfile import ZipFile |
11 |
11 |
12 # PSK Management Data model : |
12 # PSK Management Data model : |
13 # [[ID,Desc, LastKnownURI, LastConnect]] |
13 # [[ID,Desc, LastKnownURI, LastConnect]] |
14 COL_ID,COL_URI,COL_DESC,COL_LAST = range(4) |
14 COL_ID, COL_URI, COL_DESC, COL_LAST = range(4) |
|
15 REPLACE, REPLACE_ALL, KEEP, KEEP_ALL, CANCEL = range(5) |
15 |
16 |
16 def _pskpath(project_path): |
17 def _pskpath(project_path): |
17 return os.path.join(project_path, 'psk') |
18 return os.path.join(project_path, 'psk') |
18 |
19 |
19 def _mgtpath(project_path): |
20 def _mgtpath(project_path): |
91 for nm in os.listdir(path): |
92 for nm in os.listdir(path): |
92 if nm.endswith('.secret') or nm == 'management.json': |
93 if nm.endswith('.secret') or nm == 'management.json': |
93 zf.write(os.path.join(path, nm), nm) |
94 zf.write(os.path.join(path, nm), nm) |
94 |
95 |
95 def ImportIDs(project_path, import_zip, should_I_replace_callback): |
96 def ImportIDs(project_path, import_zip, should_I_replace_callback): |
|
97 zf = ZipFile(import_zip, 'r') |
96 data = GetData(project_path) |
98 data = GetData(project_path) |
97 |
99 |
98 zip_loaded_data = json.loads(zf.open('management.json').read()) |
100 zip_loaded_data = json.loads(zf.open('management.json').read()) |
99 name_list = zf.namelist() |
101 name_list = zf.namelist() |
100 zip_filtered_data = _filterData(name_list, loaded_data) |
102 zip_filtered_data = _filterData(name_list, zip_loaded_data) |
101 |
103 |
102 idata = _dataByID(data) |
104 idata = _dataByID(data) |
|
105 |
|
106 keys_to_import = [] |
|
107 result = None |
103 |
108 |
104 for imported_row in zip_filtered_data: |
109 for imported_row in zip_filtered_data: |
105 ID = imported_row[COL_ID] |
110 ID = imported_row[COL_ID] |
106 existing_row = idata.get(ID, None) |
111 existing_row = idata.get(ID, None) |
107 if existing_row is None: |
112 if existing_row is None: |
108 data.append(imported_row) |
113 data.append(imported_row) |
109 else: |
114 else: |
110 # callback returns the selected list for merge or none if canceled |
115 # callback returns the selected list for merge or none if canceled |
111 result = should_I_replace_callback(existing_row, imported_row) |
116 if result not in [REPLACE_ALL, KEEP_ALL]: |
112 if result is None: |
117 result = should_I_replace_callback(existing_row, imported_row) |
113 break |
118 |
|
119 if result == CANCEL: |
|
120 return |
114 |
121 |
115 if result: |
122 if result in [REPLACE_ALL, REPLACE]: |
116 # replace with imported |
123 # replace with imported |
117 existing_row[:] = imported_row |
124 existing_row[:] = imported_row |
118 # copy the key of selected |
125 # copy the key of selected |
119 self.extract(ID+".secret", _pskpath(project_path)) |
126 keys_to_import.append(ID) |
|
127 |
|
128 for ID in keys_to_import: |
|
129 zf.extract(ID+".secret", _pskpath(project_path)) |
120 |
130 |
121 SaveData(project_path, data) |
131 SaveData(project_path, data) |
122 |
132 |
|
133 return data |
123 |
134 |
|
135 |