"""Get feature flags on backend.""" from flask import g from flask import has_request_context from flask import request from pythonfeatures import pythonfeatures from pythonfeatures.constants import split as split_constants from backend.constants import feature_flag from backend.constants import header from backend.logic.features import is_enabled as is_enabled_split_direct def is_classical_check_same_track_name_and_composer_enabled(): """Check whether classical_check_same_track_name_and_composer_enabled is enabled. Returns: bool: is feature flag enabled or not """ return is_feature_flag_enabled(feature_flag.CLASSICAL_CHECK_SAME_TRACK_NAME_AND_COMPOSER) def is_bypass_name_validation_if_diff_explicit_enabled(): """Check whether inc_allow_same_track_name_ver_if_diff_explicit is enabled. Returns: bool: is feature flag enabled or not """ return is_feature_flag_enabled(feature_flag.BYPASS_NAME_VALIDATION_IF_DIFF_EXPLICIT) def is_incfeatures_single_focus_track_enabled(): """Checks whether distro_support_focus_tracks is enabled. Returns: bool: is feature flag enabled or not """ if is_feature_flag_enabled_for_identity_id(feature_flag.INCFEATURES_SINGLE_FOCUS_TRACK): return True return is_feature_flag_enabled(feature_flag.INCFEATURES_SINGLE_FOCUS_TRACK) def is_single_track_and_product_mismatch_enabled(vendor_id): """Checks whether single_track_and_product_mismatch is enabled. Returns: bool: is feature flag enabled or not """ if is_feature_flag_enabled_for_vendor(feature_flag.SINGLE_TRACK_AND_PRODUCT_MISMATCH, vendor_id): return True return is_feature_flag_enabled(feature_flag.SINGLE_TRACK_AND_PRODUCT_MISMATCH) def is_single_track_composer_mismatch_enabled(vendor_id): """Checks whether single_track_composer_mismatch is enabled. Returns: bool: is feature flag enabled or not """ if is_feature_flag_enabled_for_vendor(feature_flag.SINGLE_TRACK_COMPOSER_MISMATCH, vendor_id): return True return is_feature_flag_enabled(feature_flag.SINGLE_TRACK_COMPOSER_MISMATCH) def is_single_track_classical_artists_mismatch_enabled(vendor_id): """Checks whether single_track_classical_artists_mismatch is enabled. Returns: bool: is feature flag enabled or not """ if is_feature_flag_enabled_for_vendor(feature_flag.SINGLE_TRACK_CLASSICAL_ARTISTS_MISMATCH, vendor_id): return True return is_feature_flag_enabled(feature_flag.SINGLE_TRACK_CLASSICAL_ARTISTS_MISMATCH) def is_ai_generated_audio_validation_enabled(vendor_id): """Check whether content_review_ai_generated_audio_validation is enabled. Args: vendor_id (int): vendor id to check. Returns: bool: is feature flag enabled or not """ if is_feature_flag_enabled_for_vendor(feature_flag.AI_GENERATED_AUDIO_VALIDATION, vendor_id): return True return is_feature_flag_enabled(feature_flag.AI_GENERATED_AUDIO_VALIDATION) def is_ai_generated_audio_error_enabled(vendor_id): """Check whether content_review_ai_generated_audio_error is enabled. When enabled, suspected AI-generated audio is a hard blocker (error) rather than a warning. Args: vendor_id (int): vendor id to check. Returns: bool: is feature flag enabled or not """ if is_feature_flag_enabled_for_vendor(feature_flag.AI_GENERATED_AUDIO_ERROR, vendor_id): return True return is_feature_flag_enabled(feature_flag.AI_GENERATED_AUDIO_ERROR) def is_spotify_watchlist_artist_validation_enabled(vendor_id): """Check whether content_review_spotify_watchlist is enabled. Args: vendor_id (int): vendor id to check. Returns: bool: is feature flag enabled or not """ if is_feature_flag_enabled_for_vendor(feature_flag.SPOTIFY_WATCHLIST_ARTIST_VALIDATION, vendor_id): return True return is_feature_flag_enabled(feature_flag.SPOTIFY_WATCHLIST_ARTIST_VALIDATION) def is_cdam_spatial_isrc_validation_enabled(): """Check whether cdam_spatial_isrc_validation is enabled. Returns: bool: is feature flag enabled or not """ return is_feature_flag_enabled(feature_flag.CDAM_SPATIAL_ISRC_VALIDATION) def is_feature_flag_enabled(flag_name): """Check if users requested feature flag is enabled. Args: flag_name (str): name of the flag to be checked. Returns: bool: whether feature is enabled """ is_enabled = pythonfeatures.get_single_feature( flag_name, g.request_context ).message == split_constants.FEATURE_ENABLED g.ows.log.info(f'split {flag_name}: called with context_type {g.request_context} is {is_enabled}') return is_enabled def is_feature_flag_enabled_for_vendor(flag_name, vendor_id): """Check if feature flag is enabled for requested vendor. Args: flag_name (str): name of the flag to be checked. vendor_id (int): vendor_id to check. Returns: bool: whether feature is enabled """ return pythonfeatures.get_single_feature_by_attributes( flag_name, {'vendor_id': vendor_id} ).message == split_constants.FEATURE_ENABLED def is_feature_flag_enabled_for_identity_id(flag_name): """Check feature is enabled for specific identity. Args: flag_name (str): feature to check Returns: bool: whether feature is enabled """ if has_request_context(): orchard_identity_id = request.headers.get(header.ORCHARD_IDENTITY_ID) if orchard_identity_id: return pythonfeatures.get_single_feature_by_attributes( flag_name, {header.ORCHARD_IDENTITY_ID: orchard_identity_id} ).message == split_constants.FEATURE_ENABLED return False def is_validate_missing_producer_enabled(attributes): """Check whether ccm_track_artist_producer_mandatory is enabled. Returns: bool: is feature flag enabled or not """ validate_missing_producer = is_enabled_split_direct(feature_flag.TRACK_ARTIST_PRODUCER_MANDATORY, attributes) g.log.info( f'Feature flag value for ows-track ccm_track_artist_producer_mandatory {validate_missing_producer}' ) return validate_missing_producer