From ceda3e70bd13e38771e87ee28714507b28293b51 Mon Sep 17 00:00:00 2001 From: Kostas Karmas Date: Tue, 13 Oct 2020 16:30:29 +0200 Subject: [PATCH 1/4] Include organization id and type of enterprise plan in slice data CURA-7717 --- cura/OAuth2/AuthorizationHelpers.py | 28 ++++++++++++++++++++--- cura/OAuth2/Models.py | 4 +++- plugins/SliceInfoPlugin/SliceInfo.py | 5 +++- plugins/SliceInfoPlugin/example_data.html | 4 +++- 4 files changed, 35 insertions(+), 6 deletions(-) diff --git a/cura/OAuth2/AuthorizationHelpers.py b/cura/OAuth2/AuthorizationHelpers.py index e825afd2a9..d0c582180d 100644 --- a/cura/OAuth2/AuthorizationHelpers.py +++ b/cura/OAuth2/AuthorizationHelpers.py @@ -1,11 +1,11 @@ -# Copyright (c) 2019 Ultimaker B.V. +# Copyright (c) 2020 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. from datetime import datetime import json import random from hashlib import sha512 from base64 import b64encode -from typing import Optional +from typing import Optional, Any, Dict, Tuple import requests @@ -16,6 +16,7 @@ from cura.OAuth2.Models import AuthenticationResponse, UserProfile, OAuth2Settin catalog = i18nCatalog("cura") TOKEN_TIMESTAMP_FORMAT = "%Y-%m-%d %H:%M:%S" + class AuthorizationHelpers: """Class containing several helpers to deal with the authorization flow.""" @@ -121,10 +122,12 @@ class AuthorizationHelpers: if not user_data or not isinstance(user_data, dict): Logger.log("w", "Could not parse user data from token: %s", user_data) return None + enterprise_info = self.extractEnterpriseSubscriptionInformation(user_data) return UserProfile( user_id = user_data["user_id"], username = user_data["username"], - profile_image_url = user_data.get("profile_image_url", "") + profile_image_url = user_data.get("profile_image_url", ""), + **enterprise_info ) @staticmethod @@ -147,3 +150,22 @@ class AuthorizationHelpers: encoded = sha512(verification_code.encode()).digest() return b64encode(encoded, altchars = b"_-").decode() + + @staticmethod + def extractEnterpriseSubscriptionInformation(user_data: Dict[str, Any]) -> Dict[str, Any]: + """ + Extracts information related to the enterprise subscription of the account. + + :param user_data: Dictionary containing the unencoded user_data received by the JWT + :returns: enterprise_info: Dictionary containing information related to enterprise subscriptions + """ + enterprise_info = {} + subscriptions = user_data.get("subscriptions", []) + enterprise_subscription = {} + for subscription in subscriptions: + if subscription.get("type_id", "") == "customer.enterprise": + enterprise_subscription = subscription + break + enterprise_info["enterprise_plan"] = enterprise_subscription.get("plan_id", "") + enterprise_info["organization_id"] = user_data.get("organization", {}).get("organization_id", "") + return enterprise_info diff --git a/cura/OAuth2/Models.py b/cura/OAuth2/Models.py index 93b44e8057..d227053126 100644 --- a/cura/OAuth2/Models.py +++ b/cura/OAuth2/Models.py @@ -1,4 +1,4 @@ -# Copyright (c) 2019 Ultimaker B.V. +# Copyright (c) 2020 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. from typing import Optional, Dict, Any @@ -27,6 +27,8 @@ class UserProfile(BaseModel): user_id = None # type: Optional[str] username = None # type: Optional[str] profile_image_url = None # type: Optional[str] + enterprise_plan = None # type: Optional[str] + organization_id = None # type: Optional[str] class AuthenticationResponse(BaseModel): diff --git a/plugins/SliceInfoPlugin/SliceInfo.py b/plugins/SliceInfoPlugin/SliceInfo.py index 284389064c..4957f2f1d3 100755 --- a/plugins/SliceInfoPlugin/SliceInfo.py +++ b/plugins/SliceInfoPlugin/SliceInfo.py @@ -1,4 +1,4 @@ -# Copyright (c) 2018 Ultimaker B.V. +# Copyright (c) 2020 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. import json @@ -116,6 +116,7 @@ class SliceInfo(QObject, Extension): machine_manager = self._application.getMachineManager() print_information = self._application.getPrintInformation() + user_profile = self._application.getCuraAPI().account.userProfile global_stack = machine_manager.activeMachine @@ -124,6 +125,8 @@ class SliceInfo(QObject, Extension): data["schema_version"] = 0 data["cura_version"] = self._application.getVersion() data["cura_build_type"] = ApplicationMetadata.CuraBuildType + data["enterprise_plan"] = user_profile.get("enterprise_plan", "") if user_profile else "" + data["organization_id"] = user_profile.get("organization_id", "") if user_profile else "" active_mode = self._application.getPreferences().getValue("cura/active_mode") if active_mode == 0: diff --git a/plugins/SliceInfoPlugin/example_data.html b/plugins/SliceInfoPlugin/example_data.html index 103eb55a6a..5dd63b4c9c 100644 --- a/plugins/SliceInfoPlugin/example_data.html +++ b/plugins/SliceInfoPlugin/example_data.html @@ -6,7 +6,9 @@ Machine Type: Ultimaker S5
Intent Profile: Default
Quality Profile: Fast
- Using Custom Settings: No + Using Custom Settings: No
+ Enterprise Plan: Essentials
+ Organization ID: Ultimaker B.V.

Extruder 1: