"""prep grps context.""" from common.models.state_machine.grps_ingestion_context import \ GrpsIngestionContext def prep_track_sequence_and_volume_number(tracks): """Update sequence/volume.""" max_sequence_number_per_volume = {} volumes = set() sorted_tracks = sorted(tracks, key=lambda s: s.sequence_number) for track in sorted_tracks: track_volume = track.volume volumes.add(track_volume) if track_volume not in max_sequence_number_per_volume: max_sequence_number_per_volume[track_volume] = 1 else: max_sequence_number_per_volume[track_volume] = \ max_sequence_number_per_volume[track_volume] + 1 track.sequence_number = max_sequence_number_per_volume[track_volume] sorted_volumes = sorted(volumes) for new_volume, volume in enumerate(sorted_volumes): new_volume = new_volume + 1 if new_volume == volume: continue for track in tracks: if track.volume == volume: track.volume = new_volume def prep_forbidden_sequence(context: GrpsIngestionContext): """Break up the '../' sequence to avoid a 403 from GQL.""" def contains_forbidden_sequence(field): return field and ('../' in field or '..\\' in field or '.bak' in field) def fix_sequence(invalid_str: str): if contains_forbidden_sequence(invalid_str): return invalid_str.replace('../ ', '.. / ') \ .replace('../', '.. / ') \ .replace('..\\', '.. \\').replace('.bak', '. bak') else: return invalid_str context.project.name = fix_sequence(context.project.name) context.product.product_name = fix_sequence( context.product.product_name) for track in context.tracks: track.track_name = fix_sequence(track.track_name) def prep_track_name_length(tracks): """Truncate track names longer than 200 characters.""" for track in tracks: if len(track.track_name) > 200: track.track_name = track.track_name[:197] + '...' def remove_track_isrc_duplicates(tracks): """Remove track isrc duplicates.""" added_isrc = [] deduplicated_tracks = [] for track in tracks: if track.isrc not in added_isrc: added_isrc.append(track.isrc) deduplicated_tracks.append(track) return deduplicated_tracks