88"""
99from __future__ import unicode_literals
1010
11+ import warnings
12+
1113from json import dumps
1214from .events import Event
1315from .models import BaseAccount , GitHubCore
@@ -66,6 +68,11 @@ def add_member(self, login):
6668
6769 :returns: bool
6870 """
71+ warnings .warn (
72+ 'This is no longer supported by the GitHub API, see '
73+ 'https://developer.github.com/changes/2014-09-23-one-more-week'
74+ '-before-the-add-team-member-api-breaking-change/' ,
75+ DeprecationWarning )
6976 url = self ._build_url ('members' , login , base_url = self ._api )
7077 return self ._boolean (self ._put (url ), 204 , 404 )
7178
@@ -112,6 +119,20 @@ def has_repo(self, repo):
112119 url = self ._build_url ('repos' , repo , base_url = self ._api )
113120 return self ._boolean (self ._get (url ), 204 , 404 )
114121
122+ @requires_auth
123+ def invite (self , username ):
124+ """Invite the user to join this team.
125+
126+ This returns a dictionary like so::
127+
128+ {'state': 'pending', 'url': 'https://api.github.com/teams/...'}
129+
130+ :param str username: (required), user to invite to join this team.
131+ :returns: dictionary
132+ """
133+ url = self ._build_url ('memberships' , username , base_url = self ._api )
134+ return self ._json (self ._put (url ), 200 )
135+
115136 def is_member (self , login ):
116137 """Check if ``login`` is a member of this team.
117138
@@ -146,16 +167,42 @@ def iter_repos(self, number=-1, etag=None):
146167 url = self ._build_url ('repos' , base_url = self ._api )
147168 return self ._iter (int (number ), url , Repository , etag = etag )
148169
170+ @requires_auth
171+ def membership_for (self , username ):
172+ """Retrieve the membership information for the user.
173+
174+ :param str username: (required), name of the user
175+ :returns: dictionary
176+ """
177+ url = self ._build_url ('memberships' , username , base_url = self ._api )
178+ json = self ._json (self ._get (url ), 200 )
179+ return json or {}
180+
149181 @requires_auth
150182 def remove_member (self , login ):
151183 """Remove ``login`` from this team.
152184
153185 :param str login: (required), login of the member to remove
154186 :returns: bool
155187 """
188+ warnings .warn (
189+ 'This is no longer supported by the GitHub API, see '
190+ 'https://developer.github.com/changes/2014-09-23-one-more-week'
191+ '-before-the-add-team-member-api-breaking-change/' ,
192+ DeprecationWarning )
156193 url = self ._build_url ('members' , login , base_url = self ._api )
157194 return self ._boolean (self ._delete (url ), 204 , 404 )
158195
196+ @requires_auth
197+ def revoke_membership (self , username ):
198+ """Revoke this user's team membership.
199+
200+ :param str username: (required), name of the team member
201+ :returns: bool
202+ """
203+ url = self ._build_url ('memberships' , username , base_url = self ._api )
204+ return self ._boolean (self ._delete (url ), 204 , 404 )
205+
159206 @requires_auth
160207 def remove_repo (self , repo ):
161208 """Remove ``repo`` from this team.
@@ -209,6 +256,11 @@ def __init__(self, org, session=None):
209256 def add_member (self , login , team ):
210257 """Add ``login`` to ``team`` and thereby to this organization.
211258
259+ .. warning::
260+ This method is no longer valid. To add a member to a team, you
261+ must now retrieve the team directly, and use the ``invite``
262+ method.
263+
212264 Any user that is to be added to an organization, must be added
213265 to a team as per the GitHub api.
214266
@@ -223,6 +275,11 @@ def add_member(self, login, team):
223275 :param str team: (required), team name
224276 :returns: bool
225277 """
278+ warnings .warn (
279+ 'This is no longer supported by the GitHub API, see '
280+ 'https://developer.github.com/changes/2014-09-23-one-more-week'
281+ '-before-the-add-team-member-api-breaking-change/' ,
282+ DeprecationWarning )
226283 for t in self .iter_teams ():
227284 if team == t .name :
228285 return t .add_member (login )
@@ -484,3 +541,38 @@ def team(self, team_id):
484541 url = self ._build_url ('teams' , str (team_id ))
485542 json = self ._json (self ._get (url ), 200 )
486543 return Team (json , self ._session ) if json else None
544+
545+
546+ class Membership (GitHubCore ):
547+
548+ """The wrapper for information about Team and Organization memberships."""
549+
550+ def __init__ (self , membership , session = None ):
551+ super (Membership , self ).__init__ (membership , session )
552+ self ._update_attributes (membership )
553+
554+ def _repr (self ):
555+ return '<Membership [{0}]>' .format (self .organization )
556+
557+ def _update_attributes (self , membership ):
558+ self ._api = membership .get ('url' )
559+ self .organization = Organization (membership .get ('organization' , {}),
560+ self )
561+ self .state = membership .get ('state' , '' )
562+ self .organization_url = membership .get ('organization_url' )
563+ self .active = self .state .lower () == 'active'
564+ self .pending = self .state .lower () == 'pending'
565+
566+ @requires_auth
567+ def edit (self , state ):
568+ """Edit the user's membership.
569+
570+ :param str state: (required), the state the membership should be in.
571+ Only accepts ``"active"``.
572+ :returns: itself
573+ """
574+ if state and state .lower () == 'active' :
575+ data = dumps ({'state' : state .lower ()})
576+ json = self ._json (self ._patch (self ._api , data = data ))
577+ self ._update_attributes (json )
578+ return self
0 commit comments