| 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
 | ###########
Discussions
###########
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.
Reference
=========
* 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:
  + :class:`gitlab.v4.objects.ProjectSnippetDiscussion`
  + :class:`gitlab.v4.objects.ProjectSnippetDiscussionManager`
  + :class:`gitlab.v4.objects.ProjectSnippetDiscussionNote`
  + :class:`gitlab.v4.objects.ProjectSnippetDiscussionNoteManager`
  + :attr:`gitlab.v4.objects.ProjectSnippet.notes`
* GitLab API: https://docs.gitlab.com/ce/api/discussions.html
Examples
========
List the discussions for a resource (issue, merge request, snippet or commit)::
    discussions = resource.discussions.list()
Get a single discussion::
    discussion = resource.discussions.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.discussions.get(discussion_id)
    # Get the latest note's id
    note_id = discussion.attributes['notes'][-1]['id']
    last_note = discussion.notes.get(note_id)
    last_note.body = 'Updated comment'
    last_note.save()
Create a new discussion::
    discussion = resource.discussions.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()
 |