(self, params, **kwargs)
| 2445 | return trash_restore_parser |
| 2446 | |
| 2447 | def execute(self, params, **kwargs): |
| 2448 | deleted_records = self.get_deleted_records(params) |
| 2449 | orphaned_records = self.get_orphaned_records(params) |
| 2450 | shared_folders = self.get_shared_folders(params) |
| 2451 | deleted_shared_records = shared_folders.get('records') or {} |
| 2452 | deleted_shared_folders = shared_folders.get('folders') or {} |
| 2453 | if len(deleted_records) == 0 and len(orphaned_records) == 0 and len(deleted_shared_records) == 0 and len(deleted_shared_folders) == 0: |
| 2454 | logging.info('Trash is empty') |
| 2455 | return |
| 2456 | |
| 2457 | records = kwargs.get('records') |
| 2458 | if not isinstance(records, (tuple, list)): |
| 2459 | records = None |
| 2460 | if not records: |
| 2461 | logging.info('records parameter is empty.') |
| 2462 | return |
| 2463 | |
| 2464 | records_to_restore = set() # type: Set[str] |
| 2465 | folders_to_restore = set() # type: Set[str] |
| 2466 | folder_records_to_restore = {} # type: Dict[str, List[str]] |
| 2467 | for rec in records: |
| 2468 | if rec in deleted_records: |
| 2469 | records_to_restore.add(rec) |
| 2470 | elif rec in orphaned_records: |
| 2471 | records_to_restore.add(rec) |
| 2472 | elif rec in deleted_shared_records: |
| 2473 | dsr = deleted_shared_records.get(rec) |
| 2474 | folder_uid = dsr.get('folder_uid') |
| 2475 | record_uid = dsr.get('record_uid') |
| 2476 | if folder_uid and record_uid: |
| 2477 | if folder_uid not in folder_records_to_restore: |
| 2478 | folder_records_to_restore[folder_uid] = [] |
| 2479 | folder_records_to_restore[folder_uid].append(record_uid) |
| 2480 | elif rec in deleted_shared_folders: |
| 2481 | folders_to_restore.add(rec) |
| 2482 | else: |
| 2483 | title_pattern = re.compile(fnmatch.translate(rec), re.IGNORECASE) |
| 2484 | for record_uid, del_rec in itertools.chain(deleted_records.items(), orphaned_records.items()): |
| 2485 | if record_uid in records_to_restore: |
| 2486 | continue |
| 2487 | record = vault.KeeperRecord.load(params, del_rec) |
| 2488 | if title_pattern.match(record.title): |
| 2489 | records_to_restore.add(record_uid) |
| 2490 | for record_uid, sh_rec in deleted_shared_records.items(): |
| 2491 | if record_uid in folder_records_to_restore: |
| 2492 | continue |
| 2493 | record = vault.KeeperRecord.load(params, sh_rec) |
| 2494 | if title_pattern.match(record.title): |
| 2495 | folder_uid = sh_rec.get('folder_uid') |
| 2496 | if folder_uid not in folder_records_to_restore: |
| 2497 | folder_records_to_restore[folder_uid] = [] |
| 2498 | folder_records_to_restore[folder_uid].append(record_uid) |
| 2499 | for folder_uid, sh_fol in deleted_shared_folders.items(): |
| 2500 | if folder_uid in folders_to_restore: |
| 2501 | continue |
| 2502 | try: |
| 2503 | data = json.loads(sh_fol.get('data_unencrypted')) |
| 2504 | folder_name = data.get('name') or folder_uid |
nothing calls this directly
no test coverage detected