"""Logic for Validating assets.""" from typing import Any from flask import g from assets.constants import asset_types, asset_upload_types from assets.models import asset_final, asset_upload_type, ows_track def _generate_error_messages( product_id: int, tuids_in_product: list[int], wav_by_track: dict[int, dict[str, Any]], atmos_by_track: dict[int, dict[str, Any]], ) -> list[str]: """Generate error messages for missing or in-progress product assets. Args: product_id (int): Product id. tuids_in_product (list): Track unique ids belonging to the product. wav_by_track (dict): WAV finals keyed by track_unique_id. atmos_by_track (dict): ATMOS finals keyed by track_unique_id. Returns: list: Validation error messages. """ tracks_missing_audio = False tracks_still_processing = False tracks_atmos_still_processing = False for tuid in tuids_in_product: wav = wav_by_track.get(tuid) if wav is None: tracks_missing_audio = True elif wav["asset_type"] is None: tracks_still_processing = True atmos = atmos_by_track.get(tuid) if atmos is not None and atmos["asset_type"] is None: tracks_atmos_still_processing = True if ( tracks_missing_audio and tracks_still_processing and tracks_atmos_still_processing ): break error_msgs = [] if tracks_missing_audio: g.log.error( f"This product ({product_id}) has missing audio assets, please contact the label user." ) error_msgs.append( "This product has missing audio assets, please contact the label user." ) if tracks_still_processing: g.log.error( f"This product ({product_id}) has in-progress audio asset updates, please contact the label user." ) error_msgs.append( "This product has in-progress audio asset updates, please contact the label user." ) if tracks_atmos_still_processing: g.log.error( f"This product ({product_id}) has in-progress atmos asset updates, please contact the label user." ) error_msgs.append( "This product has in-progress atmos asset updates, please contact the label user." ) return error_msgs def validate_audio_assets(product_id: int) -> list[str]: """Validate asset finals for a product per business rules. Rules: - Exactly 1 undeleted stereo (WAV) asset per track - At most 1 undeleted atmos asset per track (0 is valid) Args: product_id (int): Product id. Returns: list: Validation error messages, empty if valid. """ # Get all tuids for this product tuids_in_product = [] tracks_result = ows_track.get_tracks_by_product_id(product_id) for track_details in tracks_result.get("items", []): tuids_in_product.append(track_details["tuid"]) audio_finals = asset_final.get_product_asset_upload_and_final( product_id, [asset_types.TYPE_FILE_WAV, asset_types.TYPE_FILE_ATMOS] ) stereo_type_id = asset_upload_type.resolve_asset_upload_type_id( asset_upload_types.STEREO ) atmos_type_id = asset_upload_type.resolve_asset_upload_type_id( asset_upload_types.ATMOS ) wav_finals = [ x for x in audio_finals if x["asset_upload_type_id"] == stereo_type_id ] atmos_finals = [ x for x in audio_finals if x["asset_upload_type_id"] == atmos_type_id ] wav_by_track = {x["track_unique_id"]: x for x in wav_finals} atmos_by_track = {x["track_unique_id"]: x for x in atmos_finals} # Determine if any assets are missing or still in-progress and generate error messages return _generate_error_messages( product_id, tuids_in_product, wav_by_track, atmos_by_track )