From 749e8d359af3f78f7b972a0eda93201e0124703d Mon Sep 17 00:00:00 2001 From: Tal Machani <12785464+talmachani@users.noreply.github.com> Date: Tue, 18 Aug 2020 10:45:01 +0300 Subject: [PATCH] Add method get_team_membership for user to Team (#1658) * - Add method get_team_membership for user * add typing get_team_membership for member Fixes #1657 --- github/Team.py | 18 +++++ github/Team.pyi | 2 + tests/ReplayData/Team.testTeamMembership.txt | 77 ++++++++++++++++++++ tests/Team.py | 14 ++++ 4 files changed, 111 insertions(+) create mode 100644 tests/ReplayData/Team.testTeamMembership.txt diff --git a/github/Team.py b/github/Team.py index 94da1a4f..e57a7d4e 100644 --- a/github/Team.py +++ b/github/Team.py @@ -200,6 +200,24 @@ class Team(github.GithubObject.CompletableGithubObject): "PUT", self.url + "/memberships/" + member._identity, input=put_parameters ) + def get_team_membership(self, member): + """ + :calls: `GET /orgs/:org/memberships/team/:team_id/:username `_ + :param member: string or :class:`github.NamedUser.NamedUser` + :rtype: :class:`github.Membership.Membership` + """ + assert isinstance(member, str) or isinstance( + member, github.NamedUser.NamedUser + ), member + if isinstance(member, github.NamedUser.NamedUser): + member = member._identity + headers, data = self._requester.requestJsonAndCheck( + "GET", self.url + "/memberships/" + member + ) + return github.Membership.Membership( + self._requester, headers, data, completed=True + ) + def add_to_repos(self, repo): """ :calls: `PUT /teams/:id/repos/:org/:repo `_ diff --git a/github/Team.pyi b/github/Team.pyi index 6b57676c..4b9bb446 100644 --- a/github/Team.pyi +++ b/github/Team.pyi @@ -3,6 +3,7 @@ from typing import Any, Dict, Union from github.GithubObject import CompletableGithubObject, _NotSetType from github.NamedUser import NamedUser from github.Organization import Organization +from github.Membership import Membership from github.PaginatedList import PaginatedList from github.Repository import Repository from github.TeamDiscussion import TeamDiscussion @@ -17,6 +18,7 @@ class Team(CompletableGithubObject): self, member: NamedUser, role: Union[str, _NotSetType] = ... ) -> None: ... def add_to_members(self, member: NamedUser) -> None: ... + def get_team_membership(self, member: Union[str, NamedUser]) -> Membership: ... def add_to_repos(self, repo: Repository) -> None: ... def delete(self) -> None: ... @property diff --git a/tests/ReplayData/Team.testTeamMembership.txt b/tests/ReplayData/Team.testTeamMembership.txt new file mode 100644 index 00000000..c0e6a577 --- /dev/null +++ b/tests/ReplayData/Team.testTeamMembership.txt @@ -0,0 +1,77 @@ +https +GET +api.github.com +None +/users/jacquev6 +{'Authorization': 'Basic login_and_password_removed', 'User-Agent': 'PyGithub/Python'} +None +200 +[('status', '200 OK'), ('x-ratelimit-remaining', '4974'), ('content-length', '801'), ('server', 'nginx/1.0.13'), ('connection', 'keep-alive'), ('x-ratelimit-limit', '5000'), ('etag', '"fcfa200b026b10e9a41dfc2bb1057b33"'), ('date', 'Sat, 26 May 2012 21:09:53 GMT'), ('content-type', 'application/json; charset=utf-8')] +{"private_gists":5,"collaborators":0,"type":"User","disk_usage":17016,"hireable":false,"url":"https://api.github.com/users/jacquev6","plan":{"collaborators":1,"name":"micro","private_repos":5,"space":614400},"public_repos":11,"bio":"","total_private_repos":5,"company":"Criteo","blog":"http://vincent-jacques.net","gravatar_id":"b68de5ae38616c296fa345d2b9df2225","avatar_url":"https://secure.gravatar.com/avatar/b68de5ae38616c296fa345d2b9df2225?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-140.png","login":"jacquev6","email":"vincent@vincent-jacques.net","owned_private_repos":5,"followers":13,"name":"Vincent Jacques","public_gists":3,"created_at":"2010-07-09T06:10:06Z","location":"Paris, France","id":327146,"following":24,"html_url":"https://github.com/jacquev6"} + +https +GET +api.github.com +None +/teams/189850/members +{'Authorization': 'Basic login_and_password_removed', 'User-Agent': 'PyGithub/Python'} +None +200 +[('status', '200 OK'), ('x-ratelimit-remaining', '4973'), ('content-length', '2'), ('server', 'nginx/1.0.13'), ('connection', 'keep-alive'), ('x-ratelimit-limit', '5000'), ('etag', '"d751713988987e9331980363e24189ce"'), ('date', 'Sat, 26 May 2012 21:09:54 GMT'), ('content-type', 'application/json; charset=utf-8')] +[] + +https +GET +api.github.com +None +/teams/189850/members/jacquev6 +{'Authorization': 'Basic login_and_password_removed', 'User-Agent': 'PyGithub/Python'} +None +404 +[('status', '404 Not Found'), ('x-ratelimit-remaining', '4972'), ('content-length', '23'), ('server', 'nginx/1.0.13'), ('connection', 'keep-alive'), ('x-ratelimit-limit', '5000'), ('etag', '"e66a7a6c91e2c26803f3f49feb7a883f"'), ('date', 'Sat, 26 May 2012 21:09:54 GMT'), ('content-type', 'application/json; charset=utf-8')] +{"message":"Not Found"} + +https +PUT +api.github.com +None +/teams/189850/memberships/jacquev6 +{'Content-Type': 'application/json', 'Authorization': 'Basic login_and_password_removed', 'User-Agent': 'PyGithub/Python'} +{"role": "member"} +200 +[('status', '200 OK'), ('x-ratelimit-remaining', '4949'), ('content-length', '151'), ('server', 'nginx/1.0.13'), ('connection', 'keep-alive'), ('x-ratelimit-limit', '5000'), ('etag', '"8856425cedbdf3075576e823f39fc3d6"'), ('date', 'Sat, 26 May 2012 21:14:46 GMT'), ('content-type', 'application/json; charset=utf-8')] +[] + +https +GET +api.github.com +None +/teams/189850/members +{'Authorization': 'Basic login_and_password_removed', 'User-Agent': 'PyGithub/Python'} +None +200 +[('status', '200 OK'), ('x-ratelimit-remaining', '4970'), ('content-length', '298'), ('server', 'nginx/1.0.13'), ('connection', 'keep-alive'), ('x-ratelimit-limit', '5000'), ('etag', '"5c59999e9aff00a09d7aa96ad73d5ff2"'), ('date', 'Sat, 26 May 2012 21:09:56 GMT'), ('content-type', 'application/json; charset=utf-8')] +[{"url":"https://api.github.com/users/jacquev6","gravatar_id":"b68de5ae38616c296fa345d2b9df2225","login":"jacquev6","id":327146,"avatar_url":"https://secure.gravatar.com/avatar/b68de5ae38616c296fa345d2b9df2225?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-140.png"}] + +https +GET +api.github.com +None +/teams/189850/members/jacquev6 +{'Authorization': 'Basic login_and_password_removed', 'User-Agent': 'PyGithub/Python'} +None +204 +[('status', '204 No Content'), ('x-ratelimit-remaining', '4969'), ('server', 'nginx/1.0.13'), ('connection', 'keep-alive'), ('x-ratelimit-limit', '5000'), ('etag', '"d41d8cd98f00b204e9800998ecf8427e"'), ('date', 'Sat, 26 May 2012 21:09:56 GMT')] + + +https +GET +api.github.com +None +/teams/189850/memberships/jacquev6 +{'Authorization': 'Basic login_and_password_removed', 'User-Agent': 'PyGithub/Python'} +None +200 +[('status', '204 No Content'), ('x-ratelimit-remaining', '4971'), ('server', 'nginx/1.0.13'), ('connection', 'keep-alive'), ('x-ratelimit-limit', '5000'), ('etag', '"d41d8cd98f00b204e9800998ecf8427e"'), ('date', 'Sat, 26 May 2012 21:09:55 GMT')] +{"url":"https://api.github.com/orgs/BeaverSoftware/memberships/jacquev6","state":"active","role":"member","user":{"following_url":"https://api.github.com/users/jacquev6/following{/other_user}","events_url":"https://api.github.com/users/jacquev6/events{/privacy}","avatar_url":"https://avatars0.githubusercontent.com/u/15225059?v=4","url":"https://api.github.com/users/jacquev6","gists_url":"https://api.github.com/users/jacquev6/gists{/gist_id}","html_url":"https://github.com/jacquev6","subscriptions_url":"https://api.github.com/users/jacquev6/subscriptions","node_id":"MDQ6VXNlcjE1MjI1MDU5","repos_url":"https://api.github.com/users/jacquev6/repos","received_events_url":"https://api.github.com/users/jacquev6/received_events","gravatar_id":"","starred_url":"https://api.github.com/users/jacquev6/starred{/owner}{/repo}","site_admin":false,"login":"jacquev6","type":"User","id":15225059,"followers_url":"https://api.github.com/users/jacquev6/followers","organizations_url":"https://api.github.com/users/jacquev6/orgs"},"organization":{"issues_url":"https://api.github.com/orgs/BeaverSoftware/issues","members_url":"https://api.github.com/orgs/BeaverSoftware/members{/member}","description":null,"public_members_url":"https://api.github.com/orgs/BeaverSoftware/public_members{/member}","url":"https://api.github.com/orgs/BeaverSoftware","events_url":"https://api.github.com/orgs/BeaverSoftware/events","avatar_url":"https://avatars0.githubusercontent.com/u/1553906?v=4","node_id":"MDEyOk9yZ2FuaXphdGlvbjE1NTM5MDY=","repos_url":"https://api.github.com/orgs/BeaverSoftware/repos","login":"BeaverSoftware","id":1553906,"hooks_url":"https://api.github.com/orgs/BeaverSoftware/hooks"},"organization_url":"https://api.github.com/orgs/BeaverSoftware"} + diff --git a/tests/Team.py b/tests/Team.py index 6a21c67e..f285b049 100644 --- a/tests/Team.py +++ b/tests/Team.py @@ -105,6 +105,20 @@ class Team(Framework.TestCase): self.assertRaises(AssertionError, self.team.add_membership, user, "admin") self.team.remove_membership(user) + def testTeamMembership(self): + user = self.g.get_user("jacquev6") + self.assertEqual(list(self.team.get_members()), []) + self.assertFalse(self.team.has_in_members(user)) + self.team.add_membership(user) + self.assertListKeyEqual( + self.team.get_members(), lambda u: u.login, ["jacquev6"] + ) + self.assertTrue(self.team.has_in_members(user)) + membership_data = self.team.get_team_membership(user) + self.assertEqual(membership_data.user.login, "jacquev6") + self.assertEqual(membership_data.role, "member") + self.assertEqual(membership_data.organization.login, "BeaverSoftware") + def testRepoPermission(self): repo = self.org.get_repo("FatherBeaver") self.team.set_repo_permission(repo, "admin")