def ua_contracts_api_authentication_error_view(error): flask.current_app.extensions["sentry"].captureException( extra={ "session_keys": flask.session.keys(), "request_url": error.request.url, "request_headers": error.request.headers, "response_headers": error.response.headers, "response_body": error.response.json(), "response_code": error.response.json()["code"], "response_message": error.response.json()["message"], }) empty_session(flask.session) return flask.redirect(flask.request.url)
def ua_contracts_api_error_view(error): sentry.captureException( extra={ "user_info": user_info(flask.session), "request_url": error.request.url, "request_headers": error.request.headers, "response_headers": error.response.headers, "response_body": error.response.json(), }) if error.response.status_code == 401: empty_session(flask.session) return flask.redirect(flask.request.url) return flask.render_template("500.html"), 500
def ua_contracts_api_error(error): sentry.captureException( extra={ "user_info": user_info(flask.session), "request_url": error.request.url, "request_headers": error.request.headers, "response_headers": error.response.headers, "response_body": error.response.json(), }) if error.response.status_code == 401: empty_session(flask.session) return ( flask.jsonify({"errors": error.response.json()["message"]}), error.response.status_code or 500, )
def advantage_view(): accounts = None personal_account = None enterprise_contracts = {} entitlements = {} open_subscription = flask.request.args.get("subscription", None) stripe_publishable_key = os.getenv( "STRIPE_PUBLISHABLE_KEY", "pk_live_68aXqowUeX574aGsVck8eiIE" ) if user_info(flask.session): advantage = AdvantageContracts( session, flask.session["authentication_token"], api_url=flask.current_app.config["CONTRACTS_API_URL"], ) try: accounts = advantage.get_accounts() except HTTPError as http_error: if http_error.response.status_code == 401: # We got an unauthorized request, so we likely # need to re-login to refresh the macaroon flask.current_app.extensions["sentry"].captureException( extra={ "session_keys": flask.session.keys(), "request_url": http_error.request.url, "request_headers": http_error.request.headers, "response_headers": http_error.response.headers, "response_body": http_error.response.json(), "response_code": http_error.response.json()["code"], "response_message": http_error.response.json()[ "message" ], } ) empty_session(flask.session) return flask.render_template("advantage/index.html") raise http_error for account in accounts: account["contracts"] = advantage.get_account_contracts(account) for contract in account["contracts"]: contract["token"] = advantage.get_contract_token(contract) machines = advantage.get_contract_machines(contract).get( "machines" ) contract["machineCount"] = 0 if machines: contract["machineCount"] = len(machines) if contract["contractInfo"].get("origin", "") == "free": personal_account = account personal_account["free_token"] = contract["token"] for entitlement in contract["contractInfo"][ "resourceEntitlements" ]: if entitlement["type"] == "esm-infra": entitlements["esm-infra"] = True elif entitlement["type"] == "esm-apps": entitlements["esm-apps"] = True elif entitlement["type"] == "livepatch": entitlements["livepatch"] = True elif entitlement["type"] == "fips": entitlements["fips"] = True elif entitlement["type"] == "cc-eal": entitlements["cc-eal"] = True personal_account["entitlements"] = entitlements else: entitlements = {} for entitlement in contract["contractInfo"][ "resourceEntitlements" ]: contract["supportLevel"] = "-" if entitlement["type"] == "esm-infra": entitlements["esm-infra"] = True elif entitlement["type"] == "esm-apps": entitlements["esm-apps"] = True elif entitlement["type"] == "livepatch": entitlements["livepatch"] = True elif entitlement["type"] == "fips": entitlements["fips"] = True elif entitlement["type"] == "cc-eal": entitlements["cc-eal"] = True elif entitlement["type"] == "support": contract["supportLevel"] = entitlement[ "affordances" ]["supportLevel"] contract["entitlements"] = entitlements created_at = dateutil.parser.parse( contract["contractInfo"]["createdAt"] ) contract["contractInfo"][ "createdAtFormatted" ] = created_at.strftime("%d %B %Y") contract["contractInfo"]["status"] = "active" if "effectiveTo" in contract["contractInfo"]: effective_to = dateutil.parser.parse( contract["contractInfo"]["effectiveTo"] ) contract["contractInfo"][ "effectiveToFormatted" ] = effective_to.strftime("%d %B %Y") time_now = datetime.utcnow().replace(tzinfo=pytz.utc) if effective_to < time_now: contract["contractInfo"]["status"] = "expired" contract["contractInfo"][ "expired_restart_date" ] = time_now - timedelta(days=1) date_difference = effective_to - time_now contract["expiring"] = date_difference.days <= 30 contract["contractInfo"][ "daysTillExpiry" ] = date_difference.days contract["renewal"] = make_renewal( advantage, contract["contractInfo"] ) enterprise_contract = enterprise_contracts.setdefault( contract["accountInfo"]["name"], [] ) # If a subscription id is present and this contract # matches add it to the start of the list if contract["contractInfo"]["id"] == open_subscription: enterprise_contract.insert(0, contract) else: enterprise_contract.append(contract) return flask.render_template( "advantage/index.html", accounts=accounts, enterprise_contracts=enterprise_contracts, personal_account=personal_account, open_subscription=open_subscription, stripe_publishable_key=stripe_publishable_key, )
def advantage_shop_view(): account = previous_purchase_id = None is_test_backend = flask.request.args.get("test_backend", False) stripe_publishable_key = os.getenv("STRIPE_LIVE_PUBLISHABLE_KEY", "pk_live_68aXqowUeX574aGsVck8eiIE") api_url = flask.current_app.config["CONTRACTS_LIVE_API_URL"] if is_test_backend: stripe_publishable_key = os.getenv( "STRIPE_TEST_PUBLISHABLE_KEY", "pk_test_yndN9H0GcJffPe0W58Nm64cM00riYG4N46", ) api_url = flask.current_app.config["CONTRACTS_TEST_API_URL"] if user_info(flask.session): advantage = AdvantageContracts( session, flask.session["authentication_token"], api_url=api_url, ) if flask.session.get("guest_authentication_token"): flask.session.pop("guest_authentication_token") try: account = advantage.get_purchase_account() except HTTPError as err: code = err.response.status_code if code == 401: # We got an unauthorized request, so we likely # need to re-login to refresh the macaroon flask.current_app.extensions["sentry"].captureException( extra={ "session_keys": flask.session.keys(), "request_url": err.request.url, "request_headers": err.request.headers, "response_headers": err.response.headers, "response_body": err.response.json(), "response_code": err.response.json()["code"], "response_message": err.response.json()["message"], }) empty_session(flask.session) return flask.render_template( "advantage/subscribe/index.html", account=None, previous_purchase_id=None, product_listings=[], stripe_publishable_key=stripe_publishable_key, is_test_backend=is_test_backend, ) if code != 404: raise # There is no purchase account yet for this user. # One will need to be created later, but this is an expected # condition. else: advantage = AdvantageContracts(session, None, api_url=api_url) if account is not None: resp = advantage.get_account_subscriptions_for_marketplace( account["id"], "canonical-ua") subs = resp.get("subscriptions") if subs: previous_purchase_id = subs[0].get("lastPurchaseID") listings_response = advantage.get_marketplace_product_listings( "canonical-ua") product_listings = listings_response.get("productListings") if not product_listings: # For the time being, no product listings means the shop has not been # activated, so fallback to shopify. This should become an error later. return flask.redirect("https://buy.ubuntu.com/") products = {pr["id"]: pr for pr in listings_response["products"]} listings = [] for listing in product_listings: if "price" not in listing: continue listing["product"] = products[listing["productID"]] listings.append(listing) return flask.render_template( "advantage/subscribe/index.html", account=account, previous_purchase_id=previous_purchase_id, product_listings=listings, stripe_publishable_key=stripe_publishable_key, is_test_backend=is_test_backend, )