"""Check if a split set required Terms and Conditions agreement.""" from collaborator.models.rds.collaborator_persister import CollaboratorPersister def needs_ts_and_cs_agreement(split_data: dict, previous_splits: list) -> bool: """Get splits that have been modified, added or deleted. Args: split_data (dict): new split data. previous_splits (list): previous split data. Returns: bool: True if any of the affected collaborators have DP turned on """ previous_splits_dict: dict[str, list[dict]] = {} for split in previous_splits: track_id = split["identifier"] if track_id not in previous_splits_dict: previous_splits_dict[track_id] = [] previous_splits_dict[track_id].append(split) created_splits: list[dict] = [] modified_splits: list[dict] = [] deleted_split_ids: list[dict] = [] for new_track in split_data["tracks"]: track_id = new_track["tuid"] track_new_splits = new_track["splits"] track_previous_splits = previous_splits_dict.get(track_id, []) created_splits.extend( filter( lambda new_split: _split_has_been_created( new_split, track_previous_splits ), track_new_splits, ) ) modified_splits.extend( filter( lambda old_split: _split_has_been_modified(old_split, track_new_splits), track_previous_splits, ) ) deleted_split_ids.extend( filter( lambda previous_split: _split_has_been_deleted( previous_split, track_new_splits ), track_previous_splits, ) ) all_affected_splits = created_splits + modified_splits + deleted_split_ids all_affected_collaborator_ids = [ split["collaborator_id"] for split in all_affected_splits ] all_affected_collaborators = CollaboratorPersister.get_by_ids( all_affected_collaborator_ids, False ) if any( collaborator["dp_enabled_date"] is not None for collaborator in all_affected_collaborators ): return True return False def _split_has_been_created(new_split, track_previous_splits): return ( next( ( old_split for old_split in track_previous_splits if new_split["collaborator_id"] == old_split["collaborator_id"] ), None, ) is None ) def _split_has_been_modified(old_split, track_new_splits): new_split = next( ( new_split for new_split in track_new_splits if new_split["collaborator_id"] == old_split["collaborator_id"] ), None, ) if new_split is None: return False return not all(old_split[key] == new_split[key] for key in new_split) def _split_has_been_deleted(previous_split, track_new_splits): return previous_split["collaborator_id"] not in [ split["collaborator_id"] for split in track_new_splits ]