Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit ef2dbf7

Browse filesBrowse files
author
Gauvain Pocentek
committed
Add support for project services API
1 parent ded5258 commit ef2dbf7
Copy full SHA for ef2dbf7

File tree

Expand file treeCollapse file tree

4 files changed

+137
-1
lines changed
Open diff view settings
Filter options
Expand file treeCollapse file tree

4 files changed

+137
-1
lines changed
Open diff view settings
Collapse file

‎docs/gl_objects/projects.py‎

Copy file name to clipboardExpand all lines: docs/gl_objects/projects.py
+21Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -361,3 +361,24 @@
361361
# notes delete
362362
note.delete()
363363
# end notes delete
364+
365+
# service get
366+
service = gl.project_services.get(service_name='asana', project_id=1)
367+
# or
368+
service = project.services.get(service_name='asana', project_id=1)
369+
# display it's status (enabled/disabled)
370+
print(service.active)
371+
# end service get
372+
373+
# service list
374+
services = gl.project_services.available()
375+
# end service list
376+
377+
# service update
378+
service.api_key = 'randomkey'
379+
service.save()
380+
# end service update
381+
382+
# service delete
383+
service.delete()
384+
# end service delete
Collapse file

‎docs/gl_objects/projects.rst‎

Copy file name to clipboardExpand all lines: docs/gl_objects/projects.rst
+33-1Lines changed: 33 additions & 1 deletion
  • Display the source diff
  • Display the rich diff
Original file line numberDiff line numberDiff line change
@@ -371,7 +371,7 @@ List the project hooks:
371371
:start-after: # hook list
372372
:end-before: # end hook list
373373

374-
Get a project hook
374+
Get a project hook:
375375

376376
.. literalinclude:: projects.py
377377
:start-after: # hook get
@@ -394,3 +394,35 @@ Delete a project hook:
394394
.. literalinclude:: projects.py
395395
:start-after: # hook delete
396396
:end-before: # end hook delete
397+
398+
Services
399+
--------
400+
401+
Use :class:`~gitlab.objects.ProjectService` objects to manipulate projects
402+
services. The :attr:`gitlab.Gitlab.project_services` and
403+
:attr:`Project.services <gitlab.objects.Projects.services>` manager objects
404+
provide helper functions.
405+
406+
Get a service:
407+
408+
.. literalinclude:: projects.py
409+
:start-after: # service get
410+
:end-before: # end service get
411+
412+
List the code names of available services (doesn't return objects):
413+
414+
.. literalinclude:: projects.py
415+
:start-after: # service list
416+
:end-before: # end service list
417+
418+
Configure and enable a service:
419+
420+
.. literalinclude:: projects.py
421+
:start-after: # service update
422+
:end-before: # end service update
423+
424+
Disable a service:
425+
426+
.. literalinclude:: projects.py
427+
:start-after: # service delete
428+
:end-before: # end service delete
Collapse file

‎gitlab/__init__.py‎

Copy file name to clipboardExpand all lines: gitlab/__init__.py
+3Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,8 @@ class Gitlab(object):
112112
project_labels (ProjectLabelManager): Manager for GitLab projects
113113
labels
114114
project_files (ProjectFileManager): Manager for GitLab projects files
115+
project_services (ProjectServiceManager): Manager for the GitLab
116+
projects services
115117
project_snippet_notes (ProjectSnippetNoteManager): Manager for GitLab
116118
note on snippets
117119
project_snippets (ProjectSnippetManager): Manager for GitLab projects
@@ -183,6 +185,7 @@ def __init__(self, url, private_token=None, email=None, password=None,
183185
self.project_milestones = ProjectMilestoneManager(self)
184186
self.project_labels = ProjectLabelManager(self)
185187
self.project_files = ProjectFileManager(self)
188+
self.project_services = ProjectServiceManager(self)
186189
self.project_snippet_notes = ProjectSnippetNoteManager(self)
187190
self.project_snippets = ProjectSnippetManager(self)
188191
self.project_triggers = ProjectTriggerManager(self)
Collapse file

‎gitlab/objects.py‎

Copy file name to clipboardExpand all lines: gitlab/objects.py
+80Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,9 @@ def _get_object(self, k, v):
287287
return v
288288

289289
def _set_from_dict(self, data):
290+
if not hasattr(data, 'items'):
291+
return
292+
290293
for k, v in data.items():
291294
if isinstance(v, list):
292295
self.__dict__[k] = []
@@ -1687,6 +1690,82 @@ class ProjectVariableManager(BaseManager):
16871690
obj_cls = ProjectVariable
16881691

16891692

1693+
class ProjectService(GitlabObject):
1694+
_url = '/projects/%(project_id)s/services/%(service_name)s'
1695+
canList = False
1696+
canCreate = False
1697+
_id_in_update_url = False
1698+
_id_in_delete_url = False
1699+
requiredUrlAttrs = ['project_id', 'service_name']
1700+
1701+
_service_attrs = {
1702+
'asana': (('api_key', ), ('restrict_to_branch', )),
1703+
'assembla': (('token', ), ('subdomain', )),
1704+
'bamboo': (('bamboo_url', 'build_key', 'username', 'password'),
1705+
tuple()),
1706+
'buildkite': (('token', 'project_url'), ('enable_ssl_verification', )),
1707+
'campfire': (('token', ), ('subdomain', 'room')),
1708+
'custom-issue-tracker': (('new_issue_url', 'issues_url',
1709+
'project_url'),
1710+
('description', 'title')),
1711+
'drone-ci': (('token', 'drone_url'), ('enable_ssl_verification', )),
1712+
'emails-on-push': (('recipients', ), ('disable_diffs',
1713+
'send_from_committer_email')),
1714+
'external-wiki': (('external_wiki_url', ), tuple()),
1715+
'flowdock': (('token', ), tuple()),
1716+
'gemnasium': (('api_key', 'token', ), tuple()),
1717+
'hipchat': (('token', ), ('color', 'notify', 'room', 'api_version',
1718+
'server')),
1719+
'irker': (('recipients', ), ('default_irc_uri', 'server_port',
1720+
'server_host', 'colorize_messages')),
1721+
'jira': (('new_issue_url', 'project_url', 'issues_url'),
1722+
('description', 'username', 'password')),
1723+
'pivotaltracker': (('token', ), tuple()),
1724+
'pushover': (('api_key', 'user_key', 'priority'), ('device', 'sound')),
1725+
'redmine': (('new_issue_url', 'project_url', 'issues_url'),
1726+
('description', )),
1727+
'slack': (('webhook', ), ('username', 'channel')),
1728+
'teamcity': (('teamcity_url', 'build_type', 'username', 'password'),
1729+
tuple())
1730+
}
1731+
1732+
def _data_for_gitlab(self, extra_parameters={}, update=False,
1733+
as_json=True):
1734+
data = (super(ProjectService, self)
1735+
._data_for_gitlab(extra_parameters, update=update,
1736+
as_json=False))
1737+
missing = []
1738+
# Mandatory args
1739+
for attr in self._service_attrs[self.service_name][0]:
1740+
if not hasattr(self, attr):
1741+
missing.append(attr)
1742+
else:
1743+
data[attr] = getattr(self, attr)
1744+
1745+
if missing:
1746+
raise GitlabUpdateError('Missing attribute(s): %s' %
1747+
", ".join(missing))
1748+
1749+
# Optional args
1750+
for attr in self._service_attrs[self.service_name][1]:
1751+
if hasattr(self, attr):
1752+
data[attr] = getattr(self, attr)
1753+
1754+
return json.dumps(data)
1755+
1756+
1757+
class ProjectServiceManager(BaseManager):
1758+
obj_cls = ProjectService
1759+
1760+
def available(self, **kwargs):
1761+
"""List the services known by python-gitlab.
1762+
1763+
Returns:
1764+
list (str): The list of service code names.
1765+
"""
1766+
return json.dumps(ProjectService._service_attrs.keys())
1767+
1768+
16901769
class Project(GitlabObject):
16911770
_url = '/projects'
16921771
_constructorTypes = {'owner': 'User', 'namespace': 'Group'}
@@ -1725,6 +1804,7 @@ class Project(GitlabObject):
17251804
('mergerequests', ProjectMergeRequestManager, [('project_id', 'id')]),
17261805
('milestones', ProjectMilestoneManager, [('project_id', 'id')]),
17271806
('notes', ProjectNoteManager, [('project_id', 'id')]),
1807+
('services', ProjectServiceManager, [('project_id', 'id')]),
17281808
('snippets', ProjectSnippetManager, [('project_id', 'id')]),
17291809
('tags', ProjectTagManager, [('project_id', 'id')]),
17301810
('triggers', ProjectTriggerManager, [('project_id', 'id')]),

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.