"""Validation utils.""" from owsresponse import status as owsresponse_status from product_review.constants.error import ( ERROR_CODE_PRODUCT_ERRORS_BLOCK_APPROVAL, ERROR_CODE_TRACK_APPROVAL_REASONS_REQUIRED, ERROR_MESSAGE_TRACK_APPROVAL_REASONS_REQUIRED ) from product_review.constants.validations import ( BULK_APPROVAL_CANNED_RESPONSE, BULK_APPROVAL_NOTE ) from product_review.models import ows_product_digital, review_validation_history from product_review.models import splitio as splitio_model from product_review.util.exception import raise_exception_for_ows_response def create_review_validation_history(review_queue_id, product_id, validation_results): """Create the review validation history.""" validations = [] for product_error in validation_results["errors"]: validations.append( { "review_queue_id": review_queue_id, "product_id": product_id, "validation_code": product_error["code"], "details": product_error["reason"], "track_id": None, } ) for product_warning in validation_results["warnings"]: validations.append( { "review_queue_id": review_queue_id, "product_id": product_id, "validation_code": product_warning["code"], "details": product_warning["reason"], "track_id": None, } ) for tuid, track_body in validation_results["tracks"].items(): for track_error in track_body["errors"]: validations.append( { "review_queue_id": review_queue_id, "product_id": product_id, "validation_code": track_error["code"], "details": track_error["reason"], "track_id": int(tuid), } ) for track_warning in track_body["warnings"]: validations.append( { "review_queue_id": review_queue_id, "product_id": product_id, "validation_code": track_warning["code"], "details": track_warning["reason"], "track_id": int(tuid), } ) review_validation_history.create_bulk(validations) def block_invalid_approval( product_validation_result, note, canned_response_id, tracks, canned_response_ids, spotify_watchlist_feature_enabled ): """Block invalid approval.""" if ( not ows_product_digital.is_product_valid(product_validation_result) and splitio_model.is_enabled_prevent_approval_with_blockers() ): raise_exception_for_ows_response( status=owsresponse_status.BAD_REQUEST, code=ERROR_CODE_PRODUCT_ERRORS_BLOCK_APPROVAL, message=product_validation_result, ) is_bulk_approval = bool( ( canned_response_id == BULK_APPROVAL_CANNED_RESPONSE if not spotify_watchlist_feature_enabled else BULK_APPROVAL_CANNED_RESPONSE in canned_response_ids ) or note == BULK_APPROVAL_NOTE ) potential_audio_infringement_track_warnings = ( ows_product_digital.select_potential_audio_infringement_track_warnings( product_validation_result ) ) has_potential_audio_infringement_track_warning = bool( potential_audio_infringement_track_warnings and not is_bulk_approval ) if has_potential_audio_infringement_track_warning: track_ids_with_warning = { track.get('track_id') for track in potential_audio_infringement_track_warnings } track_ids_approved = { track.get('track_id') for track in (tracks or []) if track.get('track_id') and track.get('canned_response_id') } if track_ids_with_warning != track_ids_approved: raise_exception_for_ows_response( status=owsresponse_status.BAD_REQUEST, code=ERROR_CODE_TRACK_APPROVAL_REASONS_REQUIRED, message=ERROR_MESSAGE_TRACK_APPROVAL_REASONS_REQUIRED )