##// END OF EJS Templates
comments: added new events for comment editing to handle them in integrations.
marcink -
r4444:912182ba default
parent child Browse files
Show More
@@ -48,6 +48,7 b' from rhodecode.model.db import ('
48 Session, ChangesetStatus, RepositoryField, Repository, RepoGroup,
48 Session, ChangesetStatus, RepositoryField, Repository, RepoGroup,
49 ChangesetComment)
49 ChangesetComment)
50 from rhodecode.model.permission import PermissionModel
50 from rhodecode.model.permission import PermissionModel
51 from rhodecode.model.pull_request import PullRequestModel
51 from rhodecode.model.repo import RepoModel
52 from rhodecode.model.repo import RepoModel
52 from rhodecode.model.scm import ScmModel, RepoList
53 from rhodecode.model.scm import ScmModel, RepoList
53 from rhodecode.model.settings import SettingsModel, VcsSettingsModel
54 from rhodecode.model.settings import SettingsModel, VcsSettingsModel
@@ -1869,6 +1870,20 b' def edit_comment(request, apiuser, messa'
1869 raise JSONRPCError(
1870 raise JSONRPCError(
1870 "comment ({}) can't be changed with empty string".format(comment_id)
1871 "comment ({}) can't be changed with empty string".format(comment_id)
1871 )
1872 )
1873
1874 if comment.pull_request:
1875 pull_request = comment.pull_request
1876 PullRequestModel().trigger_pull_request_hook(
1877 pull_request, apiuser, 'comment_edit',
1878 data={'comment': comment})
1879 else:
1880 db_repo = comment.repo
1881 commit_id = comment.revision
1882 commit = db_repo.get_commit(commit_id)
1883 CommentsModel().trigger_commit_comment_hook(
1884 db_repo, apiuser, 'edit',
1885 data={'comment': comment, 'commit': commit})
1886
1872 data = {
1887 data = {
1873 'comment': comment,
1888 'comment': comment,
1874 'version': comment_history.version if comment_history else None,
1889 'version': comment_history.version if comment_history else None,
@@ -649,6 +649,12 b' class RepoCommitsView(RepoAppView):'
649 if not comment_history:
649 if not comment_history:
650 raise HTTPNotFound()
650 raise HTTPNotFound()
651
651
652 commit_id = self.request.matchdict['commit_id']
653 commit = self.db_repo.get_commit(commit_id)
654 CommentsModel().trigger_commit_comment_hook(
655 self.db_repo, self._rhodecode_user, 'edit',
656 data={'comment': comment, 'commit': commit})
657
652 Session().commit()
658 Session().commit()
653 return {
659 return {
654 'comment_history_id': comment_history.comment_history_id,
660 'comment_history_id': comment_history.comment_history_id,
@@ -1611,6 +1611,11 b' class RepoPullRequestsView(RepoAppView, '
1611 raise HTTPNotFound()
1611 raise HTTPNotFound()
1612
1612
1613 Session().commit()
1613 Session().commit()
1614
1615 PullRequestModel().trigger_pull_request_hook(
1616 pull_request, self._rhodecode_user, 'comment_edit',
1617 data={'comment': comment})
1618
1614 return {
1619 return {
1615 'comment_history_id': comment_history.comment_history_id,
1620 'comment_history_id': comment_history.comment_history_id,
1616 'comment_id': comment.comment_id,
1621 'comment_id': comment.comment_id,
@@ -53,7 +53,8 b' from rhodecode.events.user import ( # p'
53 )
53 )
54
54
55 from rhodecode.events.repo import ( # pragma: no cover
55 from rhodecode.events.repo import ( # pragma: no cover
56 RepoEvent, RepoCommitCommentEvent,
56 RepoEvent,
57 RepoCommitCommentEvent, RepoCommitCommentEditEvent,
57 RepoPreCreateEvent, RepoCreateEvent,
58 RepoPreCreateEvent, RepoCreateEvent,
58 RepoPreDeleteEvent, RepoDeleteEvent,
59 RepoPreDeleteEvent, RepoDeleteEvent,
59 RepoPrePushEvent, RepoPushEvent,
60 RepoPrePushEvent, RepoPushEvent,
@@ -72,8 +73,8 b' from rhodecode.events.pullrequest import'
72 PullRequestCreateEvent,
73 PullRequestCreateEvent,
73 PullRequestUpdateEvent,
74 PullRequestUpdateEvent,
74 PullRequestCommentEvent,
75 PullRequestCommentEvent,
76 PullRequestCommentEditEvent,
75 PullRequestReviewEvent,
77 PullRequestReviewEvent,
76 PullRequestMergeEvent,
78 PullRequestMergeEvent,
77 PullRequestCloseEvent,
79 PullRequestCloseEvent,
78 PullRequestCommentEvent,
79 )
80 )
@@ -19,8 +19,7 b''
19 import logging
19 import logging
20
20
21 from rhodecode.translation import lazy_ugettext
21 from rhodecode.translation import lazy_ugettext
22 from rhodecode.events.repo import (
22 from rhodecode.events.repo import (RepoEvent, _commits_as_dict, _issues_as_dict)
23 RepoEvent, _commits_as_dict, _issues_as_dict)
24
23
25 log = logging.getLogger(__name__)
24 log = logging.getLogger(__name__)
26
25
@@ -155,6 +154,7 b' class PullRequestCommentEvent(PullReques'
155 'type': self.comment.comment_type,
154 'type': self.comment.comment_type,
156 'file': self.comment.f_path,
155 'file': self.comment.f_path,
157 'line': self.comment.line_no,
156 'line': self.comment.line_no,
157 'version': self.comment.last_version,
158 'url': CommentsModel().get_url(
158 'url': CommentsModel().get_url(
159 self.comment, request=self.request),
159 self.comment, request=self.request),
160 'permalink_url': CommentsModel().get_url(
160 'permalink_url': CommentsModel().get_url(
@@ -162,3 +162,42 b' class PullRequestCommentEvent(PullReques'
162 }
162 }
163 })
163 })
164 return data
164 return data
165
166
167 class PullRequestCommentEditEvent(PullRequestEvent):
168 """
169 An instance of this class is emitted as an :term:`event` after a pull
170 request comment is edited.
171 """
172 name = 'pullrequest-comment-edit'
173 display_name = lazy_ugettext('pullrequest comment edited')
174 description = lazy_ugettext('Event triggered after a comment was edited on a code '
175 'in the pull request')
176
177 def __init__(self, pullrequest, comment):
178 super(PullRequestCommentEditEvent, self).__init__(pullrequest)
179 self.comment = comment
180
181 def as_dict(self):
182 from rhodecode.model.comment import CommentsModel
183 data = super(PullRequestCommentEditEvent, self).as_dict()
184
185 status = None
186 if self.comment.status_change:
187 status = self.comment.status_change[0].status
188
189 data.update({
190 'comment': {
191 'status': status,
192 'text': self.comment.text,
193 'type': self.comment.comment_type,
194 'file': self.comment.f_path,
195 'line': self.comment.line_no,
196 'version': self.comment.last_version,
197 'url': CommentsModel().get_url(
198 self.comment, request=self.request),
199 'permalink_url': CommentsModel().get_url(
200 self.comment, request=self.request, permalink=True),
201 }
202 })
203 return data
@@ -211,6 +211,42 b' class RepoCommitCommentEvent(RepoEvent):'
211 'comment_type': self.comment.comment_type,
211 'comment_type': self.comment.comment_type,
212 'comment_f_path': self.comment.f_path,
212 'comment_f_path': self.comment.f_path,
213 'comment_line_no': self.comment.line_no,
213 'comment_line_no': self.comment.line_no,
214 'comment_version': self.comment.last_version,
215 }
216 return data
217
218
219 class RepoCommitCommentEditEvent(RepoEvent):
220 """
221 An instance of this class is emitted as an :term:`event` after a comment is edited
222 on repository commit.
223 """
224
225 name = 'repo-commit-edit-comment'
226 display_name = lazy_ugettext('repository commit edit comment')
227 description = lazy_ugettext('Event triggered after a comment was edited '
228 'on commit inside a repository')
229
230 def __init__(self, repo, commit, comment):
231 super(RepoCommitCommentEditEvent, self).__init__(repo)
232 self.commit = commit
233 self.comment = comment
234
235 def as_dict(self):
236 data = super(RepoCommitCommentEditEvent, self).as_dict()
237 data['commit'] = {
238 'commit_id': self.commit.raw_id,
239 'commit_message': self.commit.message,
240 'commit_branch': self.commit.branch,
241 }
242
243 data['comment'] = {
244 'comment_id': self.comment.comment_id,
245 'comment_text': self.comment.text,
246 'comment_type': self.comment.comment_type,
247 'comment_f_path': self.comment.f_path,
248 'comment_line_no': self.comment.line_no,
249 'comment_version': self.comment.last_version,
214 }
250 }
215 return data
251 return data
216
252
@@ -331,6 +331,26 b' class WebhookDataHandler(CommitParsingDa'
331
331
332 return [(url, self.headers, data)]
332 return [(url, self.headers, data)]
333
333
334 def repo_commit_comment_edit_handler(self, event, data):
335 url = self.get_base_parsed_template(data)
336 log.debug('register %s call(%s) to url %s', self.name, event, url)
337 comment_vars = [
338 ('commit_comment_id', data['comment']['comment_id']),
339 ('commit_comment_text', data['comment']['comment_text']),
340 ('commit_comment_type', data['comment']['comment_type']),
341
342 ('commit_comment_f_path', data['comment']['comment_f_path']),
343 ('commit_comment_line_no', data['comment']['comment_line_no']),
344
345 ('commit_comment_commit_id', data['commit']['commit_id']),
346 ('commit_comment_commit_branch', data['commit']['commit_branch']),
347 ('commit_comment_commit_message', data['commit']['commit_message']),
348 ]
349 for k, v in comment_vars:
350 url = UrlTmpl(url).safe_substitute(**{k: v})
351
352 return [(url, self.headers, data)]
353
334 def repo_create_event_handler(self, event, data):
354 def repo_create_event_handler(self, event, data):
335 url = self.get_base_parsed_template(data)
355 url = self.get_base_parsed_template(data)
336 log.debug('register %s call(%s) to url %s', self.name, event, url)
356 log.debug('register %s call(%s) to url %s', self.name, event, url)
@@ -360,6 +380,8 b' class WebhookDataHandler(CommitParsingDa'
360 return self.repo_create_event_handler(event, data)
380 return self.repo_create_event_handler(event, data)
361 elif isinstance(event, events.RepoCommitCommentEvent):
381 elif isinstance(event, events.RepoCommitCommentEvent):
362 return self.repo_commit_comment_handler(event, data)
382 return self.repo_commit_comment_handler(event, data)
383 elif isinstance(event, events.RepoCommitCommentEditEvent):
384 return self.repo_commit_comment_edit_handler(event, data)
363 elif isinstance(event, events.PullRequestEvent):
385 elif isinstance(event, events.PullRequestEvent):
364 return self.pull_request_event_handler(event, data)
386 return self.pull_request_event_handler(event, data)
365 else:
387 else:
@@ -133,6 +133,8 b' class HipchatIntegrationType(Integration'
133
133
134 if isinstance(event, events.PullRequestCommentEvent):
134 if isinstance(event, events.PullRequestCommentEvent):
135 text = self.format_pull_request_comment_event(event, data)
135 text = self.format_pull_request_comment_event(event, data)
136 elif isinstance(event, events.PullRequestCommentEditEvent):
137 text = self.format_pull_request_comment_event(event, data)
136 elif isinstance(event, events.PullRequestReviewEvent):
138 elif isinstance(event, events.PullRequestReviewEvent):
137 text = self.format_pull_request_review_event(event, data)
139 text = self.format_pull_request_review_event(event, data)
138 elif isinstance(event, events.PullRequestEvent):
140 elif isinstance(event, events.PullRequestEvent):
@@ -157,6 +157,9 b' class SlackIntegrationType(IntegrationTy'
157 if isinstance(event, events.PullRequestCommentEvent):
157 if isinstance(event, events.PullRequestCommentEvent):
158 (title, text, fields, overrides) \
158 (title, text, fields, overrides) \
159 = self.format_pull_request_comment_event(event, data)
159 = self.format_pull_request_comment_event(event, data)
160 elif isinstance(event, events.PullRequestCommentEditEvent):
161 (title, text, fields, overrides) \
162 = self.format_pull_request_comment_event(event, data)
160 elif isinstance(event, events.PullRequestReviewEvent):
163 elif isinstance(event, events.PullRequestReviewEvent):
161 title, text = self.format_pull_request_review_event(event, data)
164 title, text = self.format_pull_request_review_event(event, data)
162 elif isinstance(event, events.PullRequestEvent):
165 elif isinstance(event, events.PullRequestEvent):
@@ -144,11 +144,13 b' class WebhookIntegrationType(Integration'
144 events.PullRequestMergeEvent,
144 events.PullRequestMergeEvent,
145 events.PullRequestUpdateEvent,
145 events.PullRequestUpdateEvent,
146 events.PullRequestCommentEvent,
146 events.PullRequestCommentEvent,
147 events.PullRequestCommentEditEvent,
147 events.PullRequestReviewEvent,
148 events.PullRequestReviewEvent,
148 events.PullRequestCreateEvent,
149 events.PullRequestCreateEvent,
149 events.RepoPushEvent,
150 events.RepoPushEvent,
150 events.RepoCreateEvent,
151 events.RepoCreateEvent,
151 events.RepoCommitCommentEvent,
152 events.RepoCommitCommentEvent,
153 events.RepoCommitCommentEditEvent,
152 ]
154 ]
153
155
154 def settings_schema(self):
156 def settings_schema(self):
@@ -97,6 +97,34 b' def trigger_comment_commit_hooks(usernam'
97 hooks_base.log_comment_commit_repository(**extras)
97 hooks_base.log_comment_commit_repository(**extras)
98
98
99
99
100 def trigger_comment_commit_edit_hooks(username, repo_name, repo_type, repo, data=None):
101 """
102 Triggers when a comment is edited on a commit
103
104 :param username: username who edits the comment
105 :param repo_name: name of target repo
106 :param repo_type: the type of SCM target repo
107 :param repo: the repo object we trigger the event for
108 :param data: extra data for specific events e.g {'comment': comment_obj, 'commit': commit_obj}
109 """
110 if not _supports_repo_type(repo_type):
111 return
112
113 extras = _get_vcs_operation_context(username, repo_name, repo_type, 'comment_commit')
114
115 comment = data['comment']
116 commit = data['commit']
117
118 events.trigger(events.RepoCommitCommentEditEvent(repo, commit, comment))
119 extras.update(repo.get_dict())
120
121 extras.commit = commit.serialize()
122 extras.comment = comment.get_api_data()
123 extras.created_by = username
124 # TODO(marcink): rcextensions handlers ??
125 hooks_base.log_comment_commit_repository(**extras)
126
127
100 def trigger_create_pull_request_hook(username, repo_name, repo_type, pull_request, data=None):
128 def trigger_create_pull_request_hook(username, repo_name, repo_type, pull_request, data=None):
101 """
129 """
102 Triggers create pull request action hooks
130 Triggers create pull request action hooks
@@ -196,6 +224,29 b' def trigger_comment_pull_request_hook(us'
196 hooks_base.log_comment_pull_request(**extras)
224 hooks_base.log_comment_pull_request(**extras)
197
225
198
226
227 def trigger_comment_pull_request_edit_hook(username, repo_name, repo_type, pull_request, data=None):
228 """
229 Triggers when a comment was edited on a pull request
230
231 :param username: username who made the edit
232 :param repo_name: name of target repo
233 :param repo_type: the type of SCM target repo
234 :param pull_request: the pull request that comment was made on
235 :param data: extra data for specific events e.g {'comment': comment_obj}
236 """
237 if not _supports_repo_type(repo_type):
238 return
239
240 extras = _get_vcs_operation_context(username, repo_name, repo_type, 'comment_pull_request')
241
242 comment = data['comment']
243 events.trigger(events.PullRequestCommentEditEvent(pull_request, comment))
244 extras.update(pull_request.get_api_data())
245 extras.comment = comment.get_api_data()
246 # TODO(marcink): handle rcextensions...
247 hooks_base.log_comment_pull_request(**extras)
248
249
199 def trigger_update_pull_request_hook(username, repo_name, repo_type, pull_request, data=None):
250 def trigger_update_pull_request_hook(username, repo_name, repo_type, pull_request, data=None):
200 """
251 """
201 Triggers update pull request action hooks
252 Triggers update pull request action hooks
@@ -789,8 +789,7 b' class CommentsModel(BaseModel):'
789 if action == 'create':
789 if action == 'create':
790 trigger_hook = hooks_utils.trigger_comment_commit_hooks
790 trigger_hook = hooks_utils.trigger_comment_commit_hooks
791 elif action == 'edit':
791 elif action == 'edit':
792 # TODO(dan): when this is supported we trigger edit hook too
792 trigger_hook = hooks_utils.trigger_comment_commit_edit_hooks
793 return
794 else:
793 else:
795 return
794 return
796
795
@@ -703,6 +703,8 b' class PullRequestModel(BaseModel):'
703 trigger_hook = hooks_utils.trigger_update_pull_request_hook
703 trigger_hook = hooks_utils.trigger_update_pull_request_hook
704 elif action == 'comment':
704 elif action == 'comment':
705 trigger_hook = hooks_utils.trigger_comment_pull_request_hook
705 trigger_hook = hooks_utils.trigger_comment_pull_request_hook
706 elif action == 'comment_edit':
707 trigger_hook = hooks_utils.trigger_comment_pull_request_edit_hook
706 else:
708 else:
707 return
709 return
708
710
@@ -28,6 +28,7 b' from rhodecode.events import ('
28 PullRequestCreateEvent,
28 PullRequestCreateEvent,
29 PullRequestUpdateEvent,
29 PullRequestUpdateEvent,
30 PullRequestCommentEvent,
30 PullRequestCommentEvent,
31 PullRequestCommentEditEvent,
31 PullRequestReviewEvent,
32 PullRequestReviewEvent,
32 PullRequestMergeEvent,
33 PullRequestMergeEvent,
33 PullRequestCloseEvent,
34 PullRequestCloseEvent,
@@ -80,6 +81,21 b' def test_pullrequest_comment_events_seri'
80
81
81
82
82 @pytest.mark.backends("git", "hg")
83 @pytest.mark.backends("git", "hg")
84 def test_pullrequest_comment_edit_events_serialized(pr_util, config_stub):
85 pr = pr_util.create_pull_request()
86 comment = CommentsModel().get_comments(
87 pr.target_repo.repo_id, pull_request=pr)[0]
88 event = PullRequestCommentEditEvent(pr, comment)
89 data = event.as_dict()
90 assert data['name'] == PullRequestCommentEditEvent.name
91 assert data['repo']['repo_name'] == pr.target_repo.repo_name
92 assert data['pullrequest']['pull_request_id'] == pr.pull_request_id
93 assert data['pullrequest']['url']
94 assert data['pullrequest']['permalink_url']
95 assert data['comment']['text'] == comment.text
96
97
98 @pytest.mark.backends("git", "hg")
83 def test_close_pull_request_events(pr_util, user_admin, config_stub):
99 def test_close_pull_request_events(pr_util, user_admin, config_stub):
84 pr = pr_util.create_pull_request()
100 pr = pr_util.create_pull_request()
85
101
@@ -29,7 +29,8 b' from rhodecode.events.repo import ('
29 RepoPrePullEvent, RepoPullEvent,
29 RepoPrePullEvent, RepoPullEvent,
30 RepoPrePushEvent, RepoPushEvent,
30 RepoPrePushEvent, RepoPushEvent,
31 RepoPreCreateEvent, RepoCreateEvent,
31 RepoPreCreateEvent, RepoCreateEvent,
32 RepoPreDeleteEvent, RepoDeleteEvent, RepoCommitCommentEvent,
32 RepoPreDeleteEvent, RepoDeleteEvent,
33 RepoCommitCommentEvent, RepoCommitCommentEditEvent
33 )
34 )
34
35
35
36
@@ -138,8 +139,32 b' def test_repo_commit_event(config_stub, '
138 'comment_type': 'comment_type',
139 'comment_type': 'comment_type',
139 'f_path': 'f_path',
140 'f_path': 'f_path',
140 'line_no': 'line_no',
141 'line_no': 'line_no',
142 'last_version': 0,
141 })
143 })
142 event = EventClass(repo=repo_stub, commit=commit, comment=comment)
144 event = EventClass(repo=repo_stub, commit=commit, comment=comment)
143 data = event.as_dict()
145 data = event.as_dict()
144 assert data['commit']['commit_id']
146 assert data['commit']['commit_id']
145 assert data['comment']['comment_id']
147 assert data['comment']['comment_id']
148
149
150 @pytest.mark.parametrize('EventClass', [RepoCommitCommentEditEvent])
151 def test_repo_commit_edit_event(config_stub, repo_stub, EventClass):
152
153 commit = StrictAttributeDict({
154 'raw_id': 'raw_id',
155 'message': 'message',
156 'branch': 'branch',
157 })
158
159 comment = StrictAttributeDict({
160 'comment_id': 'comment_id',
161 'text': 'text',
162 'comment_type': 'comment_type',
163 'f_path': 'f_path',
164 'line_no': 'line_no',
165 'last_version': 0,
166 })
167 event = EventClass(repo=repo_stub, commit=commit, comment=comment)
168 data = event.as_dict()
169 assert data['commit']['commit_id']
170 assert data['comment']['comment_id']
General Comments 0
You need to be logged in to leave comments. Login now