Discussions organize the notes in threads. See the :ref:`project-notes` chapter for more information about notes.
Discussions are available for project issues, merge requests, snippets and commits.
v4 API:
Issues:
- :class:`gitlab.v4.objects.ProjectIssueDiscussion`
- :class:`gitlab.v4.objects.ProjectIssueDiscussionManager`
- :class:`gitlab.v4.objects.ProjectIssueDiscussionNote`
- :class:`gitlab.v4.objects.ProjectIssueDiscussionNoteManager`
- :attr:`gitlab.v4.objects.ProjectIssue.notes`
MergeRequests:
- :class:`gitlab.v4.objects.ProjectMergeRequestDiscussion`
- :class:`gitlab.v4.objects.ProjectMergeRequestDiscussionManager`
- :class:`gitlab.v4.objects.ProjectMergeRequestDiscussionNote`
- :class:`gitlab.v4.objects.ProjectMergeRequestDiscussionNoteManager`
- :attr:`gitlab.v4.objects.ProjectMergeRequest.notes`
Snippets:
GitLab API: https://docs.gitlab.com/ce/api/discussions.html
List the discussions for a resource (issue, merge request, snippet or commit):
discussions = resource.discussions.list()
Get a single discussion:
discussion = resource.discussion.get(discussion_id)
You can access the individual notes in the discussion through the notes
attribute. It holds a list of notes in chronological order:
# ``resource.notes`` is a DiscussionNoteManager, so we need to get the
# object notes using ``attributes``
for note in discussion.attributes['notes']:
print(note['body'])
Note
The notes are dicts, not objects.
You can add notes to existing discussions:
new_note = discussion.notes.create({'body': 'Episode IV: A new note'})
You can get and update a single note using the *DiscussionNote resources:
discussion = resource.discussion.get(discussion_id) # Get the latest note's id note_id = discussion.attributes['note'][-1]['id'] last_note = discussion.notes.get(note_id) last_note.body = 'Updated comment' last_note.save()
Create a new discussion:
discussion = resource.discussion.create({'body': 'First comment of discussion'})
You can comment on merge requests and commit diffs. Provide the position
dict to define where the comment should appear in the diff:
mr_diff = mr.diffs.get(diff_id)
mr.discussions.create({'body': 'Note content',
'position': {
'base_sha': mr_diff.base_commit_sha,
'start_sha': mr_diff.start_commit_sha,
'head_sha': mr_diff.head_commit_sha,
'position_type': 'text',
'new_line': 1,
'old_path': 'README.rst',
'new_path': 'README.rst'}
})
Resolve / unresolve a merge request discussion:
mr_d = mr.discussions.get(d_id) mr_d.resolved = True # True to resolve, False to unresolve mr_d.save()
Delete a comment:
discussions.notes.delete(note_id) # or note.delete()