From fd43963b09bcd7eeae34ec3030aac10648e2fb5e Mon Sep 17 00:00:00 2001 From: Dmytro Lutsyk Date: Fri, 23 Apr 2021 17:30:06 +0200 Subject: [PATCH 1/3] update profile ressource --- appstoreconnect/resources.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/appstoreconnect/resources.py b/appstoreconnect/resources.py index 1bc6313..12b5359 100644 --- a/appstoreconnect/resources.py +++ b/appstoreconnect/resources.py @@ -301,7 +301,13 @@ class Device(Resource): class Profile(Resource): endpoint = '/v1/profiles' documentation = 'https://developer.apple.com/documentation/appstoreconnectapi/profile/attributes' - + type = 'profiles' + attributes = ['name', 'platform', 'profileContent', 'uuid', 'createdDate', 'profileState', 'profileType', 'expirationDate'] + relationships = { + 'certificates': {'multiple': True}, + 'devices': {'multiple': True}, + 'bundleId': {'multiple': False}, + } # Reporting From 495c60b012b4aade3372b9a3d7e059ea791a9d8d Mon Sep 17 00:00:00 2001 From: Dmytro Lutsyk Date: Tue, 27 Apr 2021 12:40:54 +0200 Subject: [PATCH 2/3] update BundleId ressource comment in Ressouce Class relationships bullshit and add read_profile, get_profiles_with_budleId in api.py --- appstoreconnect/api.py | 25 ++++++++++++++++++++++++- appstoreconnect/resources.py | 12 ++++++++++-- 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/appstoreconnect/api.py b/appstoreconnect/api.py index 83f8852..d783be1 100644 --- a/appstoreconnect/api.py +++ b/appstoreconnect/api.py @@ -34,7 +34,7 @@ def __init__(self, error_string, status_code): class Api: - def __init__(self, key_id, key_file, issuer_id, submit_stats=True): + def __init__(self, key_id, key_file, issuer_id, submit_stats=False): self._token = None self.token_gen_date = None self.exp = None @@ -165,6 +165,10 @@ def __init__(self, api, url): self.total_length = None self.payload = None + def __getitem__(self, item): + items = list(self) + return items[item] + def __iter__(self): return self @@ -259,6 +263,7 @@ def _api_call(self, url, method=HttpMethod.GET, post_data=None): return data.decode("utf-8") else: if not 200 <= r.status_code <= 299: + print(r.status_code) raise APIError("HTTP error [%d][%s]" % (r.status_code, r.content)) return r @@ -663,8 +668,25 @@ def list_profiles(self, filters=None, sort=None): :reference: https://developer.apple.com/documentation/appstoreconnectapi/list_and_download_profiles :return: an iterator over Profile resources """ + #return self._get_resources(Profile, filters, sort, locals()) return self._get_resources(Profile, filters, sort) + def read_profile(self, profileId): + """ + :reference: https://developer.apple.com/documentation/appstoreconnectapi/read_and_download_profile_information + :return: an iterator over Profile resources + """ + return self._get_resource(Profile, profileId) + + def get_profiles_with_budleId(self, url): + """" + :reference: Dmytro's brain + :return: an iterator over profile resource + """ + payload = self._api_call(url, HttpMethod.GET) + return payload + #return Profile(payload.get('data'), {}) + def get_build_info(self, build_id): """ :reference: https://developer.apple.com/documentation/appstoreconnectapi/read_build_information @@ -757,6 +779,7 @@ def modify_app_info(self, app_information: AppInfo, primaryCategory: str = None, """ return self._modify_resource(app_information, locals()) + # Reporting def download_finance_reports(self, filters=None, split_response=False, save_to=None): # setup required filters if not provided diff --git a/appstoreconnect/resources.py b/appstoreconnect/resources.py index 12b5359..afcb454 100644 --- a/appstoreconnect/resources.py +++ b/appstoreconnect/resources.py @@ -13,7 +13,8 @@ def __getattr__(self, item): if item in self._data.get('attributes', {}): return self._data.get('attributes', {})[item] if item in self._data.get('relationships', {}): - def callable(): + return self._data.get('relationships', {})[item] + '''def callable(): # Try to fetch relationship nonlocal item is_resources = item[-1] == 's' @@ -27,7 +28,7 @@ def callable(): return self._api._get_resources(item_cls, full_url=url) else: return self._api._get_related_resource(item_cls, full_url=url) - return callable + return callable''' raise AttributeError('%s have no attributes %s' % (self.type_name, item)) @@ -281,6 +282,13 @@ class UserInvitation(Resource): # Provisioning class BundleId(Resource): endpoint = '/v1/bundleIds' + type = 'bundleIds' + attributes = ['identifier', 'name', 'platform', 'seedId'] + relationships = { + 'profiles': {'multiple': True}, + 'bundleIdCapabilities': {'multiple': True}, + 'app': {'multiple': False}, + } documentation = 'https://developer.apple.com/documentation/appstoreconnectapi/bundleid/attributes' From 59e5dd56bd454be5f5fc2af83e9de8a0bb46b2c0 Mon Sep 17 00:00:00 2001 From: Dmytro Lutsyk Date: Tue, 27 Apr 2021 16:29:10 +0200 Subject: [PATCH 3/3] clean up and reuse callable on relationships --- appstoreconnect/api.py | 11 ----------- appstoreconnect/resources.py | 5 ++--- 2 files changed, 2 insertions(+), 14 deletions(-) diff --git a/appstoreconnect/api.py b/appstoreconnect/api.py index d783be1..20178dc 100644 --- a/appstoreconnect/api.py +++ b/appstoreconnect/api.py @@ -263,7 +263,6 @@ def _api_call(self, url, method=HttpMethod.GET, post_data=None): return data.decode("utf-8") else: if not 200 <= r.status_code <= 299: - print(r.status_code) raise APIError("HTTP error [%d][%s]" % (r.status_code, r.content)) return r @@ -668,7 +667,6 @@ def list_profiles(self, filters=None, sort=None): :reference: https://developer.apple.com/documentation/appstoreconnectapi/list_and_download_profiles :return: an iterator over Profile resources """ - #return self._get_resources(Profile, filters, sort, locals()) return self._get_resources(Profile, filters, sort) def read_profile(self, profileId): @@ -678,15 +676,6 @@ def read_profile(self, profileId): """ return self._get_resource(Profile, profileId) - def get_profiles_with_budleId(self, url): - """" - :reference: Dmytro's brain - :return: an iterator over profile resource - """ - payload = self._api_call(url, HttpMethod.GET) - return payload - #return Profile(payload.get('data'), {}) - def get_build_info(self, build_id): """ :reference: https://developer.apple.com/documentation/appstoreconnectapi/read_build_information diff --git a/appstoreconnect/resources.py b/appstoreconnect/resources.py index afcb454..27a9895 100644 --- a/appstoreconnect/resources.py +++ b/appstoreconnect/resources.py @@ -13,8 +13,7 @@ def __getattr__(self, item): if item in self._data.get('attributes', {}): return self._data.get('attributes', {})[item] if item in self._data.get('relationships', {}): - return self._data.get('relationships', {})[item] - '''def callable(): + def callable(): # Try to fetch relationship nonlocal item is_resources = item[-1] == 's' @@ -28,7 +27,7 @@ def __getattr__(self, item): return self._api._get_resources(item_cls, full_url=url) else: return self._api._get_related_resource(item_cls, full_url=url) - return callable''' + return callable raise AttributeError('%s have no attributes %s' % (self.type_name, item))