diff options
Diffstat (limited to 'gitlab.py')
| -rw-r--r-- | gitlab.py | 121 |
1 files changed, 83 insertions, 38 deletions
@@ -20,7 +20,7 @@ import json import requests __title__ = 'python-gitlab' -__version__ = '0.1' +__version__ = '0.2' __author__ = 'Gauvain Pocentek' __email__ = 'gauvain@pocentek.net' __license__ = 'LGPL3' @@ -74,7 +74,7 @@ class GitlabAuthenticationError(Exception): class Gitlab(object): """Represents a GitLab server connection""" - def __init__(self, url, private_token=None, email=None, password=None): + def __init__(self, url, private_token=None, email=None, password=None, ssl_verify=True): """Stores informations about the server url: the URL of the Gitlab server @@ -83,9 +83,10 @@ class Gitlab(object): password: the user password (associated with email) """ self._url = '%s/api/v3' % url - self.private_token = private_token + self.setToken(private_token) self.email = email self.password = password + self.ssl_verify = ssl_verify def auth(self): """Performs an authentication using either the private token, or the @@ -93,11 +94,9 @@ class Gitlab(object): The user attribute will hold a CurrentUser object on success. """ - r = False if self.private_token: - r = self.token_auth() - - if not r: + self.token_auth() + else: self.credentials_auth() def credentials_auth(self): @@ -111,14 +110,10 @@ class Gitlab(object): else: raise GitlabAuthenticationError(r.json()['message']) - self.private_token = self.user.private_token + self.setToken(self.user.private_token) def token_auth(self): - try: - self.user = CurrentUser(self) - return True - except: - return False + self.user = CurrentUser(self) def setUrl(self, url): """Updates the gitlab URL""" @@ -126,20 +121,22 @@ class Gitlab(object): def setToken(self, token): """Sets the private token for authentication""" - self.private_token = token + if token: + self.private_token = token + self.headers = {"PRIVATE-TOKEN": token} + else: + self.private_token = None + self.headers = {} def setCredentials(self, email, password): """Sets the email/login and password for authentication""" self.email = email self.password = password - def rawGet(self, path, with_token=False): + def rawGet(self, path): url = '%s%s' % (self._url, path) try: - if with_token: - r = requests.get(url, headers={"PRIVATE-TOKEN": self.private_token}) - else: - r = requests.get(url) + r = requests.get(url, headers=self.headers, verify=self.ssl_verify) except: raise GitlabConnectionError( "Can't connect to GitLab server (%s)" % self._url) @@ -149,21 +146,20 @@ class Gitlab(object): def rawPost(self, path, data): url = '%s%s' % (self._url, path) try: - r = requests.post(url, data) + r = requests.post(url, data, + headers=self.headers, + verify=self.ssl_verify) except: raise GitlabConnectionError( "Can't connect to GitLab server (%s)" % self._url) return r - def rawPut(self, path, with_token=False): + def rawPut(self, path): url = '%s%s' % (self._url, path) try: - if with_token: - r = requests.put(url, headers={"PRIVATE-TOKEN": self.private_token}) - else: - r = requests.put(url) + r = requests.put(url, headers=self.headers, verify=self.ssl_verify) except: raise GitlabConnectionError( "Can't connect to GitLab server (%s)" % self._url) @@ -184,11 +180,11 @@ class Gitlab(object): url = obj_class._url % kwargs url = '%s%s' % (self._url, url) if kwargs: - url += "&%s" % ("&".join( + url += "?%s" % ("&".join( ["%s=%s" % (k, v) for k, v in kwargs.items()])) try: - r = requests.get(url, headers={"PRIVATE-TOKEN": self.private_token}) + r = requests.get(url, headers=self.headers, verify=self.ssl_verify) except: raise GitlabConnectionError( "Can't connect to GitLab server (%s)" % self._url) @@ -234,7 +230,7 @@ class Gitlab(object): (self._url, url) try: - r = requests.get(url, headers={"PRIVATE-TOKEN": self.private_token}) + r = requests.get(url, headers=self.headers, verify=self.ssl_verify) except: raise GitlabConnectionError( "Can't connect to GitLab server (%s)" % self._url) @@ -254,7 +250,7 @@ class Gitlab(object): (self._url, url, obj.id) try: - r = requests.delete(url, headers={"PRIVATE-TOKEN": self.private_token}) + r = requests.delete(url, headers=self.headers, verify=self.ssl_verify) except: raise GitlabConnectionError( "Can't connect to GitLab server (%s)" % self._url) @@ -279,13 +275,10 @@ class Gitlab(object): url = obj._url % obj.__dict__ url = '%s%s' % (self._url, url) - print url - print obj.__dict__ - try: # TODO: avoid too much work on the server side by filtering the # __dict__ keys - r = requests.post(url, obj.__dict__, headers={"PRIVATE-TOKEN": self.private_token}) + r = requests.post(url, obj.__dict__, headers=self.headers, verify=self.ssl_verify) except: raise GitlabConnectionError( "Can't connect to GitLab server (%s)" % self._url) @@ -309,7 +302,7 @@ class Gitlab(object): d[k] = str(v) try: - r = requests.put(url, d, headers={"PRIVATE-TOKEN": self.private_token}) + r = requests.put(url, d, headers=self.headers, verify=self.ssl_verify) except: raise GitlabConnectionError( "Can't connect to GitLab server (%s)" % self._url) @@ -386,6 +379,20 @@ class Gitlab(object): """ return self._getListOrObject(User, id, **kwargs) + def Team(self, id=None, **kwargs): + """Creates/gets/lists team(s) known by the GitLab server. + + If id is None, returns a list of teams. + + If id is an integer, returns the matching project (or raise a + GitlabGetError if not found) + + If id is a dict, create a new object using attributes provided. The + object is NOT saved on the server. Use the save() method on the object + to write it on the server. + """ + return self._getListOrObject(Team, id, **kwargs) + class GitlabObject(object): _url = None @@ -579,7 +586,7 @@ class Group(GitlabObject): def transfer_project(self, id): url = '/groups/%d/projects/%d' % \ (self.id, id) - r = self.gitlab.rawPost(url, None, headers={"PRIVATE-TOKEN": self.gitlab.private_token}) + r = self.gitlab.rawPost(url, None) if r.status_code != 201: raise GitlabTransferProjectError() @@ -617,7 +624,7 @@ class ProjectBranch(GitlabObject): url = "%s/%s/protect" % (url, self.name) else: url = "%s/%s/unprotect" % (url, self.name) - r = self.gitlab.rawPut(url, True) + r = self.gitlab.rawPut(url) if r.status_code == 200: if protect: @@ -727,7 +734,7 @@ class ProjectMergeRequestNote(GitlabObject): class ProjectMergeRequest(GitlabObject): - _url = '/projects/%(project_id)s/merge_request' + _url = '/projects/%(project_id)s/merge_requests' _constructorTypes = {'author': 'User', 'assignee': 'User'} canDelete = False requiredListAttrs = ['project_id'] @@ -774,7 +781,7 @@ class ProjectSnippet(GitlabObject): def Content(self): url = "/projects/%(project_id)s/snippets/%(snippet_id)s/raw" % \ {'project_id': self.project_id, 'snippet_id': self.id} - r = self.gitlab.rawGet(url, True) + r = self.gitlab.rawGet(url) if r.status_code == 200: return r.content @@ -853,3 +860,41 @@ class Project(GitlabObject): return self._getListOrObject(ProjectTag, id, project_id=self.id, **kwargs) + + +class TeamMember(GitlabObject): + _url = '/user_teams/%(team_id)s/members' + canUpdate = False + requiredCreateAttrs = ['team_id', 'user_id', 'access_level'] + requiredDeleteAttrs = ['team_id'] + requiredGetAttrs = ['team_id'] + requiredListAttrs = ['team_id'] + shortPrintAttr = 'username' + + +class TeamProject(GitlabObject): + _url = '/user_teams/%(team_id)s/projects' + _constructorTypes = {'owner': 'User', 'namespace': 'Group'} + canUpdate = False + requiredCreateAttrs = ['team_id', 'project_id', 'greatest_access_level'] + requiredDeleteAttrs = ['team_id', 'project_id'] + requiredGetAttrs = ['team_id'] + requiredListAttrs = ['team_id'] + shortPrintAttr = 'name' + + +class Team(GitlabObject): + _url = '/user_teams' + shortPrintAttr = 'name' + requiredCreateAttrs = ['name', 'path'] + canUpdate = False + + def Member(self, id=None, **kwargs): + return self._getListOrObject(TeamMember, id, + team_id=self.id, + **kwargs) + + def Project(self, id=None, **kwargs): + return self._getListOrObject(TeamProject, id, + team_id=self.id, + **kwargs) |
