"""Logic related to features.""" from ddtrace import tracer from owsresponse import response from account.connectors import mysql from account.logic import vendor from account.models import feature as feature_model from account.utils.dataloader_util import format_for_dataloader @tracer.wrap() def get_enabled_features_for_vendor(vendor_id): """Get a list of enabled feature controls for a vendor. Args: vendor_id (int): unique identifier for a vendor. Returns: response.response: containing the list of enabled feature controls. """ if vendor.is_vendor(vendor_id): return feature_model.get_enabled_features_for_vendor(vendor_id) return response.create_not_found_response() @tracer.wrap() def lookup_features_by_vendor_uuids(uuids: list[str]) -> response.Response: """Lookup enabled feature IDs for vendors by UUID. Returns results as an ordered list matching the input UUID order. UUIDs not found in the database are included with feature_ids: []. Args: uuids (list[str]): list of vendor UUIDs. Returns: response.Response: containing a list of vendor feature mappings. """ with mysql.session_scope(read_only=True) as session: features_by_uuid = feature_model.get_enabled_feature_ids_for_vendor_uuids(uuids, session) items = [ {'vendor_uuid': uuid, 'feature_ids': feature_ids} for uuid, feature_ids in features_by_uuid.items() ] return response.Response({'vendors': format_for_dataloader(items, uuids, 'vendor_uuid')}) @tracer.wrap() def lookup_features_by_subaccount_uuids(uuids: list[str]) -> response.Response: """Lookup enabled feature IDs for subaccounts by UUID. Returns results as an ordered list matching the input UUID order. UUIDs not found in the database are included with feature_ids: []. Args: uuids (list[str]): list of subaccount UUIDs. Returns: response.Response: containing a list of subaccount feature mappings. """ with mysql.session_scope(read_only=True) as session: features_by_uuid = feature_model.get_enabled_feature_ids_for_subaccount_uuids( uuids, session ) items = [ {'subaccount_uuid': uuid, 'feature_ids': feature_ids} for uuid, feature_ids in features_by_uuid.items() ] return response.Response( {'subaccounts': format_for_dataloader(items, uuids, 'subaccount_uuid')} ) @tracer.wrap() def bulk_add_restricted_features_for_vendor(vendor_id, feature_ids): """Bulk add restricted features for a vendor. Args: vendor_id (int): unique identifier for a vendor. feature_ids list(int): list of feature IDs. """ is_vendor = vendor.is_vendor(vendor_id) if not is_vendor: return is_vendor is_valid_features = feature_model.is_valid_features(feature_ids) if not is_valid_features: return is_valid_features return feature_model.bulk_add_restricted_features_for_vendor(vendor_id, feature_ids) @tracer.wrap() def bulk_remove_restricted_features_for_vendor(vendor_id, feature_ids): """Bulk remove restricted features for a vendor. Args: vendor_id (int): unique identifier for a vendor. feature_ids list(int): list of feature IDs. """ return feature_model.bulk_remove_restricted_features_for_vendor(vendor_id, feature_ids)