'list of selectable attributes of a product
:return: list of product variant description
(variant id, [visible attribute ids], variant price, variant sale price)'

def get_attribute_value_ids(self, product):

    quantity = (product._context.get('quantity') or 1)
    product = product.with_context(quantity=quantity)
    visible_attrs_ids = product.attribute_line_ids.filtered((lambda l: (len(l.value_ids) > 1))).mapped('attribute_id').ids
    to_currency = request.website.get_current_pricelist().currency_id
    attribute_value_ids = []
    for variant in product.product_variant_ids:
        if (to_currency != product.currency_id):
            price = (variant.currency_id.compute(variant.website_public_price, to_currency) / quantity)
        else:
            price = (variant.website_public_price / quantity)
        visible_attribute_ids = [v.id for v in variant.attribute_value_ids if (v.attribute_id.id in visible_attrs_ids)]
        attribute_value_ids.append([variant.id, visible_attribute_ids, variant.website_price, price])
    return attribute_value_ids
