Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 45 additions & 0 deletions appstoreconnect/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,7 @@ def _create_resource(self, Resource, args):
url = "%s%s" % (BASE_API, Resource.endpoint)
if self._debug:
print(post_data)

payload = self._api_call(url, HttpMethod.POST, post_data)

return Resource(payload.get('data', {}), self)
Expand Down Expand Up @@ -248,6 +249,7 @@ def _api_call(self, url, method=HttpMethod.GET, post_data=None):
else:
raise APIError("Unknown HTTP method")


content_type = r.headers['content-type']

if content_type in [ "application/json", "application/vnd.api+json" ]:
Expand Down Expand Up @@ -357,13 +359,52 @@ def list_beta_testers(self, filters=None, sort=None):
"""
return self._get_resources(BetaTester, filters, sort)

def list_all_beta_testers_in_a_beta_group(self, betaGroup, filters=None, sort=None):
"""
:reference: https://developer.apple.com/documentation/appstoreconnectapi/list_all_beta_testers_in_a_beta_group
:return: an iterator over BetaTester resources
"""
full_url = BASE_API + "/v1/betaGroups/" + betaGroup.id + "/betaTesters"
return self._get_resources(BetaGroup, None, None, full_url)
#return self._api_call(BASE_API + "/v1/betaGroups/" + betaGroup.id + "/betaTesters", HttpMethod.GET)
#return self._get_resources(BetaGroup, filters, sort)

def read_beta_tester_information(self, beta_tester_id: str):
"""
:reference: https://developer.apple.com/documentation/appstoreconnectapi/read_beta_tester_information
:return: a BetaTester resource
"""
return self._get_resource(BetaTester, beta_tester_id)

def add_beta_testers_to_a_beta_group(self, betaGroup: BetaGroup, betaTesters: list): #betaTesters list of BetaTester
"""
:reference: https://developer.apple.com/documentation/appstoreconnectapi/add_beta_testers_to_a_beta_group
:return: a BetaTester resource
"""
return self._create_resource(BetaGroup, locals())

def send_an_invitation_to_a_beta_tester(self, app: App, betaTester: BetaTester): #betaTesters list of BetaTester
"""
:reference: https://developer.apple.com/documentation/appstoreconnectapi/send_an_invitation_to_a_beta_tester
:return: a BetaTester resource
"""
return self._create_resource(BetaTesterInvitation, locals())

def remove_beta_testers_from_a_beta_group(self, betaGroup: BetaGroup, betaTesters: list):
"""
:reference: https://developer.apple.com/documentation/appstoreconnectapi/remove_beta_testers_from_a_beta_group
:return: a BetaTester resource
"""
headers = {"Authorization": "Bearer %s" % self.token}
headers["Content-Type"] = "application/json"
url = BASE_API + "/v1/betaGroups/" + betaGroup.id + "/relationships/betaTesters"
post_data = { 'data': []}
for betaTester in betaTesters:
data = { 'id': betaTester.id, 'type': 'betaTesters'}
post_data["data"].append(data)
return requests.delete(url=url, data = json.dumps(post_data), headers = headers)


def create_beta_group(self, app: App, name: str, publicLinkEnabled: bool = None, publicLinkLimit: int = None, publicLinkLimitEnabled: bool = None) -> BetaGroup:
"""
:reference:https://developer.apple.com/documentation/appstoreconnectapi/create_a_beta_group
Expand Down Expand Up @@ -396,6 +437,10 @@ def read_beta_group_information(self, beta_group_ip):
return self._get_resource(BetaGroup, beta_group_ip)

def add_build_to_beta_group(self, beta_group_id, build_id):
"""
:reference: https://developer.apple.com/documentation/appstoreconnectapi/add_builds_to_a_beta_group
:return: an BetaGroup resource
"""
post_data = {'data': [{ 'id': build_id, 'type': 'builds'}]}
self._api_call(BASE_API + "/v1/betaGroups/" + beta_group_id + "/relationships/builds", HttpMethod.POST, post_data)

Expand Down
9 changes: 9 additions & 0 deletions appstoreconnect/resources.py
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,15 @@ class BetaTester(Resource):
}
documentation = 'https://developer.apple.com/documentation/appstoreconnectapi/betatester'

class BetaTesterInvitation(Resource):
endpoint = '/v1/betaTesterInvitations'
type = 'betaTesterInvitations'
attributes = []
relationships = {
'app': {'multiple': False},
'betaTester': {'multiple': False}
}
documentation = 'https://developer.apple.com/documentation/appstoreconnectapi/BetaTesterInvitation'

class BetaGroup(Resource):
endpoint = '/v1/betaGroups'
Expand Down