partnercenter/azext_partnercenter/clients/offer_listing_client.py (158 lines of code) (raw):
# --------------------------------------------------------------------------------------------
# Copyright (c) Microsoft Corporation. All rights reserved.
# Licensed under the MIT License. See License.txt in the project root for license information.
# --------------------------------------------------------------------------------------------
# pylint: disable=line-too-long
# pylint: disable=protected-access
from azext_partnercenter.models import ListingContact, Listing, ListingUri, Resource
from azext_partnercenter.vendored_sdks.v1.partnercenter.models import (
MicrosoftIngestionApiModelsListingsAzureListing,
MicrosoftIngestionApiModelsListingsListingContact,
MicrosoftIngestionApiModelsListingsListingUri)
from azext_partnercenter.clients import OfferClient, PlanClient
from ._base_client import BaseClient
class OfferListingClient(BaseClient):
def __init__(self, cli_ctx, *_):
super().__init__(cli_ctx, *_)
self._offer_client = OfferClient(cli_ctx, *_)
self._plan_client = PlanClient(cli_ctx, *_)
def get_plan_listing(self, offer_external_id, plan_external_id):
product_listing_branches = self._get_product_listing_branches(offer_external_id)
if not product_listing_branches:
return None
product = self._offer_client.get(offer_external_id)
if product is None:
return None
product_id = product.resource.durable_id
plan = self._plan_client.find_by_external_id(offer_external_id, plan_external_id)
if plan is None:
return None
plan_durable_id = plan._resource.durable_id
branch = next(filter(lambda b: b.variant_id == plan_durable_id, product_listing_branches), None)
if branch is None:
return None
instance_id = branch.current_draft_instance_id
result = self._sdk.listing_client.products_product_id_listings_get_by_instance_id_instance_i_dinstance_id_get(
product_id,
instance_id,
self._get_access_token())
listing = result.value[0]
return Listing(
description=listing.description,
title=listing.title,
summary=listing.summary if hasattr(listing, 'summary') else '',
language_code=listing.language_code if hasattr('language_code', 'summary') else '',
short_description=listing.short_description if hasattr('short_description', 'summary') else '',
contacts=list(map(lambda c: ListingContact(**c.to_dict()), listing.listing_contacts)),
uris=list(map(lambda c: ListingUri(**c.to_dict()), listing.listing_uris)),
odata_etag=listing.odata_etag,
offer_id=offer_external_id,
resource=Resource(id=listing.id, type=listing.resource_type)
)
def update(self, offer_external_id, parameters: Listing):
"""Update an offer listing"""
return self.create_or_update(offer_external_id, parameters)
def create_or_update(self, offer_external_id, listing_model: Listing, plan_external_id=None):
offer = self._offer_client.get(offer_external_id)
if offer is None:
return None
product_id = offer.resource.durable_id
listing = None
if plan_external_id is None:
listing = self._offer_client.get_listing(offer_external_id)
else:
listing = self.get_plan_listing(offer_external_id, plan_external_id)
if listing is None:
return None
listing_id = listing._resource.durable_id
listing_contacts = self._get_api_listing_contacts(listing_model)
listing_uris = self._get_api_listing_uris(listing_model)
updated_listing = MicrosoftIngestionApiModelsListingsAzureListing(
resource_type='AzureListing',
description=listing_model.description,
title=listing_model.title,
summary=listing_model.summary,
short_description=listing_model.short_description,
odata_etag=listing.odata_etag,
listing_uris=listing_uris,
listing_contacts=listing_contacts)
update_result = self._sdk.listing_client.products_product_id_listings_listing_id_put(
product_id,
listing_id,
self._get_access_token(),
microsoft_ingestion_api_models_listings_azure_listing=updated_listing)
return Listing(
description=update_result.description,
title=update_result.title,
summary=update_result.summary,
language_code=update_result.language_code,
short_description=update_result.short_description,
contacts=list(map(lambda c: ListingContact(**c.to_dict()), update_result.listing_contacts)),
uris=list(map(
lambda c: ListingUri(type=c.type, subtype=c.subtype, uri=c.uri, display_text=c.display_text), update_result.listing_uris)
),
odata_etag=update_result.odata_etag,
resource=Resource(id=update_result.id, type=update_result.resource_type)
)
def get_contacts(self, offer_external_id):
listing = self.get(offer_external_id)
return listing.contacts
def update_contacts(self, offer_external_id, parameters=list[ListingContact]):
listing = self.get(offer_external_id)
listing.contacts = parameters
result = self.create_or_update(offer_external_id, listing)
return result.contacts
def get_uris(self, offer_external_id):
listing = self.get(offer_external_id)
return listing.uris
def update_uris(self, offer_external_id, parameters=list[ListingUri]):
listing = self.get(offer_external_id)
listing.uris = parameters
result = self.create_or_update(offer_external_id, listing)
return result.uris
def _get_api_listing_uris(self, listing_model: Listing):
return list(map(lambda u: MicrosoftIngestionApiModelsListingsListingUri(
type=u.type if u.type is not None else '',
subtype=u.subtype if u.subtype is not None else '',
display_text=u.display_text if u.display_text is not None else '',
uri=u.uri if u.uri is not None else ''),
listing_model.uris))
def _get_api_listing_contacts(self, listing_model: Listing):
return list(map(lambda c: MicrosoftIngestionApiModelsListingsListingContact(
type=c.type,
email=c.email,
name=c.name,
phone=c.phone,
uri=c.uri),
listing_model.contacts))
def delete_offer_listing(self, product_external_id):
product = self._offer_client.get(product_external_id)
if product is None:
return None
product_id = product.resource.durable_id
listing = self._offer_client.get_listing(product_external_id)
if listing is None:
return None
listing_id = listing._resource.durable_id
return self._sdk.listing_client.products_product_id_listings_listing_id_delete(product_id, listing_id, self._get_access_token())
def delete_listing_contact(self, offer_external_id, contact: ListingContact):
listing = self._offer_client.get_listing(offer_external_id)
try:
listing.contacts.remove(contact)
except ValueError:
return None
return self.create_or_update(offer_external_id, listing)
def delete_uri(self, offer_external_id, uri: ListingUri):
listing = self._offer_client.get_listing(offer_external_id)
try:
listing.uris.remove(uri)
except ValueError:
return None
return self.create_or_update(offer_external_id, listing)
def delete_latest_listing_uri(self, product_external_id):
listing = self._offer_client.get_listing(product_external_id)
if len(listing.uris) > 0:
del listing.uris[0]
return self.create_or_update(product_external_id, listing)
def get(self, offer_external_id):
return self._offer_client.get_listing(offer_external_id)
def _get_product_listing_branches(self, product_external_id):
offer = self._offer_client.get(product_external_id)
product_id = offer.resource.durable_id
module = 'Listing'
branches = self._sdk.branches_client.products_product_id_branches_get_by_module_modulemodule_get(
product_id, module, self._get_access_token())
return list(filter(lambda x: hasattr(x, 'variant_id'), branches.value))