"""Logic for Track Vendor.""" from backend.config import EXCLUDE_PRODUCT_ID_OSR_VALIDATION from backend.constants import api as api_constants from backend.logic import track as track_logic from backend.models import ows_sound_recordings from backend.utils import api as api_utils def dataload_tracks_isrc_validation(product_ids): """Loads a list of product ids and returns isrc/osr validations.""" products = [] product_issue_count = 0 for product_id in product_ids: tracks_response = track_logic.get_all_tracks_by_product_id(product_id) if not tracks_response: return tracks_response tracks = tracks_response.message[api_constants.ITEMS] if not tracks: return api_utils.create_validation_response(tracks, errors=[]) resp = product_tracks_isrc_validation(product_id, tracks) if resp: product_issue_count += 1 products.extend(resp) return api_utils.create_isrc_validation_response( product_ids, product_issue_count, products) def product_tracks_isrc_validation(product_id, tracks): """If applicable, run post_submission validation.""" cross_track_isrc_mismatch_warnings = [] cross_isrc_osr_mismatch_warnings = [] if product_id not in EXCLUDE_PRODUCT_ID_OSR_VALIDATION: sound_recording_matches = ows_sound_recordings.get_formatted_sound_recording_matches(product_id) cross_track_isrc_mismatch_warnings = validate_cross_track_isrc_mismatch_reporting( product_id, sound_recording_matches ) cross_isrc_osr_mismatch_warnings = get_cross_isrc_osr_mismatch_warnings_reporting( product_id, tracks ) return cross_track_isrc_mismatch_warnings + cross_isrc_osr_mismatch_warnings def validate_cross_track_isrc_mismatch_reporting(product_id, sound_recording_matches): """Validate and flatten cross track ISRC mismatches.""" formatted_matches = [] for tuid, data in sound_recording_matches.items(): isrc = data["isrc"] for matched_track in data.get("matched_tracks", []): if isrc != matched_track.get("isrc"): formatted_matches.append( format_warning( product_id=product_id, track_tuid=tuid, track_isrc=isrc, warning_type="Cross Track ISRC Mismatch", match=matched_track ) ) return formatted_matches def get_cross_isrc_osr_mismatch_warnings_reporting(product_id, tracks): """Get potential isrc misuse warnings.""" tuids_to_isrcs = {track['tuid']: track['isrc'] for track in tracks} isrc_matches = ows_sound_recordings.get_formatted_isrc_matches( product_id, list(tuids_to_isrcs.values()), tuids_to_isrcs.keys()) return validate_cross_isrc_osr_mismatch_reporting(product_id, isrc_matches, tuids_to_isrcs) def validate_cross_isrc_osr_mismatch_reporting(product_id, isrc_matches, tuids_to_isrcs): """Validate and flatten potential ISRC misuse warnings.""" formatted_matches = [] for current_tuid, current_osr_id in isrc_matches['tuids_to_osr_ids'].items(): if current_osr_id is None: continue matches = track_logic.get_same_isrc_different_osr( current_osr_id, tuids_to_isrcs.get(current_tuid), isrc_matches ) for match in matches: formatted_matches.append( format_warning( product_id=product_id, track_tuid=current_tuid, track_isrc=tuids_to_isrcs.get(current_tuid), warning_type="Potential ISRC Misuse", match=match ) ) return formatted_matches def format_warning(product_id, track_tuid, track_isrc, warning_type, match): return { "product_id": product_id, "track_tuid": track_tuid, "track_isrc": track_isrc, "warning_type": warning_type, "match_tuid": match.get("tuid"), "match_isrc": match.get("isrc"), "match_product_id": match.get("product_id"), "match_upc": match.get("upc"), "match_vendor_id": match.get("vendor_id"), }