Skip to content

Commit 8f059b1

Browse files
committed
Merge pull request pyapi-gitlab#1 from Itxaka/develop
Merging latest
2 parents c553521 + e1653ad commit 8f059b1

File tree

2 files changed

+222
-25
lines changed

2 files changed

+222
-25
lines changed

gitlab/__init__.py

Lines changed: 214 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,13 @@ def __init__(self, host, token="", verify_ssl=True):
2929
self.host = host
3030
if self.host[:7] != 'http://':
3131
self.host = 'http://' + self.host
32-
self.projects_url = self.host + "/api/v3/projects"
33-
self.users_url = self.host + "/api/v3/users"
34-
self.keys_url = self.host + "/api/v3/user/keys"
35-
self.groups_url = self.host + "/api/v3/groups"
36-
self.search_url = self.host + "/api/v3/projects/search/"
32+
33+
self.api_url = self.host + "/api/v3"
34+
self.projects_url = self.api_url + "/projects"
35+
self.users_url = self.api_url + "/users"
36+
self.keys_url = self.api_url + "/user/keys"
37+
self.groups_url = self.api_url + "/groups"
38+
self.search_url = self.api_url + "/projects/search/"
3739
self.verify_ssl = verify_ssl
3840

3941
def login(self, user, password):
@@ -379,6 +381,18 @@ def createproject(self, name, description="", default_branch="",
379381

380382
return False
381383

384+
def deleteproject(self, project_id):
385+
"""
386+
Delete a project
387+
:param id_: project id
388+
:return: always true
389+
"""
390+
request = requests.delete(self.projects_url + "/" + str(project_id),
391+
headers=self.headers)
392+
if request.status_code == 200:
393+
return True
394+
395+
382396
def createprojectuser(self, id_, name, description="", default_branch="",
383397
issues_enabled=0, wall_enabled=0,
384398
merge_requests_enabled=0, wiki_enabled=0,
@@ -961,11 +975,12 @@ def creategroup(self, name, path):
961975
request = requests.post(self.groups_url,
962976
data={'name': name, 'path': path},
963977
headers=self.headers, verify=self.verify_ssl)
978+
print request.status_code
979+
print request.content
964980
if request.status_code == 201:
965981
return True
966982
else:
967-
968-
return False
983+
return exceptions.HttpError(json.loads(request.content)['message'])
969984

970985
def getgroups(self, id_=None, page=1, per_page=20, sudo=""):
971986
"""
@@ -1317,51 +1332,226 @@ def getfilearchive(self, project_id, filepath="", sha1=""):
13171332
def deletegroup(self, group_id):
13181333
"""
13191334
groups section, new in 6.2
1335+
1336+
Deletes an group by ID
1337+
:param id_: id of the group to delete
1338+
:return: True if it deleted, False if it couldn't. False could happen
1339+
for several reasons, but there isn't a
1340+
good way of differentiating them
13201341
"""
1321-
pass
1342+
request = requests.delete(self.groups_url + "/" + str(group_id),
1343+
headers=self.headers)
1344+
if request.status_code == 200:
1345+
return True
1346+
else:
1347+
return False
13221348

1323-
def listgroupmembers(self, id):
1349+
def listgroupmembers(self, group_id):
13241350
"""
13251351
list group members
13261352
new in 6.2
1353+
1354+
lists the members of a given group id
1355+
:param group_id: the group id
1356+
:return: the group's members
13271357
"""
1328-
pass
1358+
request = requests.get(self.groups_url + "/" + str(group_id) + "/members",
1359+
headers=self.headers, verify=self.verify_ssl)
1360+
if request.status_code == 200:
1361+
return json.loads(request.content.decode("utf-8"))
1362+
else:
1363+
return False
13291364

1330-
def addgroupmember(self, group_id, user_id, access_level):
1365+
def addgroupmember(self, group_id, user_id, access_level, sudo=""):
13311366
"""
13321367
add a user to a group
13331368
new in 6.2
1369+
1370+
# check the access level and put into a number
1371+
1372+
adds a project member to a project
1373+
:param id_: project id
1374+
:param user_id: user id
1375+
:param access_level: access level, see gitlab help to know more
1376+
:param sudo: do the request with another user
1377+
:return: True if success
13341378
"""
1335-
pass
1379+
if access_level.lower() == "master":
1380+
access_level = 40
1381+
elif access_level.lower() == "developer":
1382+
access_level = 30
1383+
elif access_level.lower() == "reporter":
1384+
access_level = 20
1385+
else:
1386+
access_level = 10
1387+
data = {"id": group_id, "user_id": user_id, "access_level": access_level}
1388+
if sudo != "":
1389+
data['sudo'] = sudo
1390+
request = requests.post(self.groups_url + "/" + str(group_id) + "/members",
1391+
headers=self.headers, data=data, verify=self.verify_ssl)
1392+
if request.status_code == 201:
1393+
return True
1394+
else:
1395+
return False
13361396

1337-
def removegroupmember(self, group_id, user_id):
1397+
def deletegroupmember(self, group_id, user_id):
13381398
"""
1339-
remove a user from a group
1340-
new in 6.2
1399+
Delete a group member
1400+
:param id_: project id
1401+
:param user_id: user id
1402+
:return: always true
13411403
"""
1342-
pass
1343-
1404+
request = requests.delete(self.groups_url + "/" + str(group_id)
1405+
+ "/members/" + str(user_id),
1406+
headers=self.headers)
1407+
if request.status_code == 200:
1408+
return True # It always returns true
13441409

1345-
# There is now a wall where you can post notes. All this below is new in 6.2
1346-
# there is also notes in issues, merge_requests and snippets so we need to
1347-
# create methods for all of them
13481410
def getprojectwallnotes(self, project_id):
13491411
"""
13501412
get the notes from the wall of a project
1351-
new in 6.2
13521413
"""
1353-
pass
1414+
request = requests.get(self.projects_url + "/" + str(project_id) + "/notes",
1415+
headers=self.headers)
1416+
1417+
if request.status_code == 200:
1418+
return json.loads(request.content.decode("utf-8"))
1419+
else:
1420+
return False
13541421

13551422
def getprojectwallnote(self, project_id, note_id):
13561423
"""
13571424
get one note from the wall of the project
13581425
"""
1359-
pass
1426+
request = requests.get(self.projects_url + "/" + str(project_id) + "/notes/" + str(note_id),
1427+
headers=self.headers)
1428+
1429+
if request.status_code == 200:
1430+
return json.loads(request.content.decode("utf-8"))
1431+
else:
1432+
return False
13601433

13611434
def createprojectwallnote(self, project_id, content):
13621435
"""
13631436
create a new note
13641437
"""
1365-
pass
1438+
data = {"body": content}
1439+
request = requests.post(self.projects_url + "/" + str(project_id) + "/notes",
1440+
headers=self.headers, data=data)
13661441

1442+
if request.status_code == 201:
1443+
return True
1444+
else:
1445+
return False
1446+
1447+
def getissuewallnotes(self, project_id, issue_id):
1448+
"""
1449+
get the notes from the wall of a issue
1450+
"""
1451+
request = requests.get(self.projects_url + "/" + str(project_id) + "/issues/" + str(issue_id) + "/notes",
1452+
headers=self.headers)
1453+
1454+
if request.status_code == 200:
1455+
return json.loads(request.content.decode("utf-8"))
1456+
else:
1457+
return False
1458+
1459+
def getissuewallnote(self, project_id, issue_id, note_id):
1460+
"""
1461+
get one note from the wall of the issue
1462+
"""
1463+
request = requests.get(self.projects_url + "/" + str(project_id) + "/issues/" + str(issue_id) + "/notes/" + str(note_id),
1464+
headers=self.headers)
1465+
1466+
if request.status_code == 200:
1467+
return json.loads(request.content.decode("utf-8"))
1468+
else:
1469+
return False
1470+
1471+
def createissuewallnote(self, project_id, issue_id, content):
1472+
"""
1473+
create a new note
1474+
"""
1475+
data = {"body": content}
1476+
request = requests.post(self.projects_url + "/" + str(project_id) + "/issues/" + str(issue_id) + "/notes",
1477+
headers=self.headers, data=data)
1478+
1479+
if request.status_code == 201:
1480+
return True
1481+
else:
1482+
return False
1483+
1484+
def getsnippetwallnotes(self, project_id, snippet_id):
1485+
"""
1486+
get the notes from the wall of a snippet
1487+
"""
1488+
request = requests.get(self.projects_url + "/" + str(project_id) + "/snippets/" + str(snippet_id) + "/notes",
1489+
headers=self.headers)
1490+
1491+
if request.status_code == 200:
1492+
return json.loads(request.content.decode("utf-8"))
1493+
else:
1494+
return False
1495+
1496+
def getsnippetwallnote(self, project_id, snippet_id, note_id):
1497+
"""
1498+
get one note from the wall of the snippet
1499+
"""
1500+
request = requests.get(self.projects_url + "/" + str(project_id) + "/snippets/" + str(snippet_id) + "/notes/" + str(note_id),
1501+
headers=self.headers)
1502+
1503+
if request.status_code == 200:
1504+
return json.loads(request.content.decode("utf-8"))
1505+
else:
1506+
return False
1507+
1508+
def createsnippetewallnote(self, project_id, snippet_id, content):
1509+
"""
1510+
create a new note
1511+
"""
1512+
data = {"body": content}
1513+
request = requests.post(self.projects_url + "/" + str(project_id) + "/snippets/" + str(snippet_id) + "/notes",
1514+
headers=self.headers, data=data)
1515+
1516+
if request.status_code == 201:
1517+
return True
1518+
else:
1519+
return False
1520+
1521+
def getmergerequestwallnotes(self, project_id, merge_request_id):
1522+
"""
1523+
get the notes from the wall of a merge request
1524+
"""
1525+
request = requests.get(self.projects_url + "/" + str(project_id) + "/merge_requests/" + str(merge_request_id) + "/notes",
1526+
headers=self.headers)
1527+
1528+
if request.status_code == 200:
1529+
return json.loads(request.content.decode("utf-8"))
1530+
else:
1531+
return False
1532+
1533+
def getmergerequestwallnote(self, project_id, merge_request_id, note_id):
1534+
"""
1535+
get one note from the wall of the merge request
1536+
"""
1537+
request = requests.get(self.projects_url + "/" + str(project_id) + "/merge_requests/" + str(merge_request_id) + "/notes/" + str(note_id),
1538+
headers=self.headers)
1539+
1540+
if request.status_code == 200:
1541+
return json.loads(request.content.decode("utf-8"))
1542+
else:
1543+
return False
1544+
1545+
def createmergerequestewallnote(self, project_id, merge_request_id, content):
1546+
"""
1547+
create a new note
1548+
"""
1549+
data = {"body": content}
1550+
request = requests.post(self.projects_url + "/" + str(project_id) + "/merge_requests/" + str(merge_request_id) + "/notes",
1551+
headers=self.headers, data=data)
1552+
1553+
if request.status_code == 201:
1554+
return True
1555+
else:
1556+
return False
13671557

tests/pyapi-gitlab_test.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,4 +153,11 @@ def test_filearchive(self):
153153
# test it works
154154
self.assertTrue(self.git.getfilearchive(2))
155155
# test for failure
156-
self.failUnlessRaises(gitlab.exceptions.HttpError, self.git.getfilearchive, 999999)
156+
self.failUnlessRaises(gitlab.exceptions.HttpError, self.git.getfilearchive, 999999)
157+
158+
def test_group(self):
159+
self.git.login(user=user, password=password)
160+
self.assertTrue(self.git.creategroup("test_group", "test"))
161+
assert isinstance(self.git.getgroups(), list)
162+
print self.git.getgroups()
163+
#self.assertTrue(self.git.deletegroup(self.git.getgroups()[:-1]))

0 commit comments

Comments
 (0)