|
| 1 | +from collections import OrderedDict |
| 2 | +from functools import lru_cache |
| 3 | +from pprint import pprint |
| 4 | + |
| 5 | +from py42.exceptions import Py42ForbiddenError, Py42BadRequestError |
| 6 | + |
| 7 | + |
| 8 | +from code42cli.errors import ( |
| 9 | + UserAlreadyAddedError, |
| 10 | + UserNotInLegalHoldError, |
| 11 | + LegalHoldNotFoundOrPermissionDeniedError, |
| 12 | +) |
| 13 | +from code42cli.util import ( |
| 14 | + format_to_table, |
| 15 | + find_format_width, |
| 16 | + format_string_list_to_columns, |
| 17 | + get_user_id, |
| 18 | +) |
| 19 | +from code42cli.bulk import run_bulk_process |
| 20 | +from code42cli.file_readers import create_csv_reader |
| 21 | +from code42cli.logger import get_main_cli_logger |
| 22 | + |
| 23 | +_MATTER_KEYS_MAP = OrderedDict() |
| 24 | +_MATTER_KEYS_MAP[u"legalHoldUid"] = u"Matter ID" |
| 25 | +_MATTER_KEYS_MAP[u"name"] = u"Name" |
| 26 | +_MATTER_KEYS_MAP[u"description"] = u"Description" |
| 27 | +_MATTER_KEYS_MAP[u"creator_username"] = u"Creator" |
| 28 | +_MATTER_KEYS_MAP[u"creationDate"] = u"Creation Date" |
| 29 | + |
| 30 | +logger = get_main_cli_logger() |
| 31 | + |
| 32 | + |
| 33 | +def add_user(sdk, matter_id, username): |
| 34 | + user_id = get_user_id(sdk, username) |
| 35 | + matter = _check_matter_is_accessible(sdk, matter_id) |
| 36 | + try: |
| 37 | + sdk.legalhold.add_to_matter(user_id, matter_id) |
| 38 | + except Py42BadRequestError as e: |
| 39 | + if u"USER_ALREADY_IN_HOLD" in e.response.text: |
| 40 | + matter_id_and_name_text = u"legal hold matter id={}, name={}".format( |
| 41 | + matter_id, matter[u"name"] |
| 42 | + ) |
| 43 | + raise UserAlreadyAddedError(username, matter_id_and_name_text) |
| 44 | + raise |
| 45 | + |
| 46 | + |
| 47 | +def remove_user(sdk, matter_id, username): |
| 48 | + _check_matter_is_accessible(sdk, matter_id) |
| 49 | + membership_id = _get_legal_hold_membership_id_for_user_and_matter(sdk, username, matter_id) |
| 50 | + sdk.legalhold.remove_from_matter(membership_id) |
| 51 | + |
| 52 | + |
| 53 | +def get_matters(sdk): |
| 54 | + matters = _get_all_active_matters(sdk) |
| 55 | + if matters: |
| 56 | + rows, column_size = find_format_width(matters, _MATTER_KEYS_MAP) |
| 57 | + format_to_table(rows, column_size) |
| 58 | + |
| 59 | + |
| 60 | +def add_bulk_users(sdk, file_name): |
| 61 | + reader = create_csv_reader(file_name) |
| 62 | + run_bulk_process( |
| 63 | + lambda matter_id, username: add_user(sdk, matter_id, username), reader, |
| 64 | + ) |
| 65 | + |
| 66 | + |
| 67 | +def remove_bulk_users(sdk, file_name): |
| 68 | + reader = create_csv_reader(file_name) |
| 69 | + run_bulk_process( |
| 70 | + lambda matter_id, username: remove_user(sdk, matter_id, username), reader, |
| 71 | + ) |
| 72 | + |
| 73 | + |
| 74 | +def show_matter(sdk, matter_id, include_inactive=False, include_policy=False): |
| 75 | + matter = _check_matter_is_accessible(sdk, matter_id) |
| 76 | + matter[u"creator_username"] = matter[u"creator"][u"username"] |
| 77 | + |
| 78 | + # if `active` is None then all matters (whether active or inactive) are returned. True returns |
| 79 | + # only those that are active. |
| 80 | + active = None if include_inactive else True |
| 81 | + memberships = _get_legal_hold_memberships_for_matter(sdk, matter_id, active=active) |
| 82 | + active_usernames = [member[u"user"][u"username"] for member in memberships if member[u"active"]] |
| 83 | + inactive_usernames = [ |
| 84 | + member[u"user"][u"username"] for member in memberships if not member[u"active"] |
| 85 | + ] |
| 86 | + |
| 87 | + rows, column_size = find_format_width([matter], _MATTER_KEYS_MAP) |
| 88 | + |
| 89 | + print(u"") |
| 90 | + format_to_table(rows, column_size) |
| 91 | + if active_usernames: |
| 92 | + print(u"\nActive matter members:\n") |
| 93 | + format_string_list_to_columns(active_usernames) |
| 94 | + else: |
| 95 | + print("\nNo active matter members.\n") |
| 96 | + |
| 97 | + if include_inactive: |
| 98 | + if inactive_usernames: |
| 99 | + print(u"\nInactive matter members:\n") |
| 100 | + format_string_list_to_columns(inactive_usernames) |
| 101 | + else: |
| 102 | + print("No inactive matter members.\n") |
| 103 | + |
| 104 | + if include_policy: |
| 105 | + _get_and_print_preservation_policy(sdk, matter[u"holdPolicyUid"]) |
| 106 | + print(u"") |
| 107 | + |
| 108 | + |
| 109 | +def _get_and_print_preservation_policy(sdk, policy_uid): |
| 110 | + preservation_policy = sdk.legalhold.get_policy_by_uid(policy_uid) |
| 111 | + print(u"\nPreservation Policy:\n") |
| 112 | + pprint(preservation_policy._data_root) |
| 113 | + |
| 114 | + |
| 115 | +def _get_legal_hold_membership_id_for_user_and_matter(sdk, username, matter_id): |
| 116 | + user_id = get_user_id(sdk, username) |
| 117 | + memberships = _get_legal_hold_memberships_for_matter(sdk, matter_id, active=True) |
| 118 | + for member in memberships: |
| 119 | + if member[u"user"][u"userUid"] == user_id: |
| 120 | + return member[u"legalHoldMembershipUid"] |
| 121 | + raise UserNotInLegalHoldError(username, matter_id) |
| 122 | + |
| 123 | + |
| 124 | +def _get_legal_hold_memberships_for_matter(sdk, matter_id, active=True): |
| 125 | + memberships_generator = sdk.legalhold.get_all_matter_custodians( |
| 126 | + legal_hold_uid=matter_id, active=active |
| 127 | + ) |
| 128 | + memberships = [ |
| 129 | + member for page in memberships_generator for member in page[u"legalHoldMemberships"] |
| 130 | + ] |
| 131 | + return memberships |
| 132 | + |
| 133 | + |
| 134 | +def _get_all_active_matters(sdk): |
| 135 | + matters_generator = sdk.legalhold.get_all_matters() |
| 136 | + matters = [ |
| 137 | + matter for page in matters_generator for matter in page[u"legalHolds"] if matter[u"active"] |
| 138 | + ] |
| 139 | + for matter in matters: |
| 140 | + matter[u"creator_username"] = matter[u"creator"][u"username"] |
| 141 | + return matters |
| 142 | + |
| 143 | + |
| 144 | +@lru_cache(maxsize=None) |
| 145 | +def _check_matter_is_accessible(sdk, matter_id): |
| 146 | + try: |
| 147 | + matter = sdk.legalhold.get_matter_by_uid(matter_id) |
| 148 | + return matter |
| 149 | + except (Py42BadRequestError, Py42ForbiddenError): |
| 150 | + raise LegalHoldNotFoundOrPermissionDeniedError(matter_id) |
0 commit comments