##// END OF EJS Templates
fixes stupid git ci call that can break on systems that don't have this alias
fixes stupid git ci call that can break on systems that don't have this alias

File last commit:

r3185:a665d8cd beta
r3199:9f57b562 beta
Show More
comment.py
244 lines | 8.7 KiB | text/x-python | PythonLexer
#77 code review...
r1670 # -*- coding: utf-8 -*-
"""
rhodecode.model.comment
~~~~~~~~~~~~~~~~~~~~~~~
comments model for RhodeCode
implements #308 rewrote diffs to enable displaying full diff on each file...
r1789
#77 code review...
r1670 :created_on: Nov 11, 2011
:author: marcink
2012 copyrights
r1824 :copyright: (C) 2011-2012 Marcin Kuzminski <marcin@python-works.com>
#77 code review...
r1670 :license: GPLv3, see COPYING for more details.
"""
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import logging
import traceback
Notification system improvements...
r1712 from pylons.i18n.translation import _
from sqlalchemy.util.compat import defaultdict
Notification fixes...
r2178 from rhodecode.lib.utils2 import extract_mentioned_users, safe_unicode
Notification system improvements...
r1712 from rhodecode.lib import helpers as h
#77 code review...
r1670 from rhodecode.model import BaseModel
- pull request generates overview based on it's params...
r2440 from rhodecode.model.db import ChangesetComment, User, Repository, \
Notification, PullRequest
notification fixes and improvements
r1703 from rhodecode.model.notification import NotificationModel
#77 code review...
r1670
log = logging.getLogger(__name__)
class ChangesetCommentsModel(BaseModel):
Added associated classes into child models
r2522 cls = ChangesetComment
Tests updates, Session refactoring
r1713 def __get_changeset_comment(self, changeset_comment):
notification to commit author + gardening
r1716 return self._get_instance(ChangesetComment, changeset_comment)
#77 code review...
r1670
- pull request generates overview based on it's params...
r2440 def __get_pull_request(self, pull_request):
return self._get_instance(PullRequest, pull_request)
Notification system improvements...
r1712 def _extract_mentions(self, s):
Tests updates, Session refactoring
r1713 user_objects = []
for username in extract_mentioned_users(s):
Notification system improvements...
r1712 user_obj = User.get_by_username(username, case_insensitive=True)
if user_obj:
Tests updates, Session refactoring
r1713 user_objects.append(user_obj)
return user_objects
Notification system improvements...
r1712
Added dynamic data loading for other repo we open pull request against...
r2541 def create(self, text, repo, user, revision=None, pull_request=None,
- added commenting to pull requests...
r2443 f_path=None, line_no=None, status_change=None):
#77 code review...
r1670 """
- added commenting to pull requests...
r2443 Creates new comment for changeset or pull request.
white space cleanup
r2478 IF status_change is not none this comment is associated with a
- added commenting to pull requests...
r2443 status change of changeset or changesets associated with pull request
implements #308 rewrote diffs to enable displaying full diff on each file...
r1789
#77 code review...
r1670 :param text:
Added dynamic data loading for other repo we open pull request against...
r2541 :param repo:
:param user:
code refactoring
r1675 :param revision:
- added commenting to pull requests...
r2443 :param pull_request:
#77 code review...
r1670 :param f_path:
:param line_no:
Add changeset status change into emails
r2296 :param status_change:
#77 code review...
r1670 """
- added commenting to pull requests...
r2443 if not text:
return
White space cleanup
r2150
Added dynamic data loading for other repo we open pull request against...
r2541 repo = self._get_repo(repo)
user = self._get_user(user)
- added commenting to pull requests...
r2443 comment = ChangesetComment()
comment.repo = repo
Added dynamic data loading for other repo we open pull request against...
r2541 comment.author = user
- added commenting to pull requests...
r2443 comment.text = text
comment.f_path = f_path
comment.line_no = line_no
if revision:
notification to commit author + gardening
r1716 cs = repo.scm_instance.get_changeset(revision)
Notification fixes...
r2178 desc = "%s - %s" % (cs.short_id, h.shorter(cs.message, 256))
#71 code-review...
r1677 comment.revision = revision
- added commenting to pull requests...
r2443 elif pull_request:
pull_request = self.__get_pull_request(pull_request)
comment.pull_request = pull_request
Added dynamic data loading for other repo we open pull request against...
r2541 desc = pull_request.pull_request_id
- added commenting to pull requests...
r2443 else:
raise Exception('Please specify revision or pull_request_id')
#77 code review...
r1670
- added commenting to pull requests...
r2443 self.sa.add(comment)
self.sa.flush()
# make notification
line = ''
body = text
#changeset
if revision:
Notification system improvements...
r1712 if line_no:
line = _('on line %s') % line_no
Notification fixes...
r2178 subj = safe_unicode(
Added dynamic data loading for other repo we open pull request against...
r2541 h.link_to('Re commit: %(desc)s %(line)s' % \
{'desc': desc, 'line': line},
Notification fixes...
r2178 h.url('changeset_home', repo_name=repo.repo_name,
revision=revision,
anchor='comment-%s' % comment.comment_id,
qualified=True,
)
)
)
- added commenting to pull requests...
r2443 notification_type = Notification.TYPE_CHANGESET_COMMENT
code garden
r2077 # get the current participants of this changeset
notification fixes and improvements
r1703 recipients = ChangesetComment.get_users(revision=revision)
code garden
r2082 # add changeset author if it's in rhodecode system
improved extraction of user from changeset when sending notification....
r3185 cs_author = User.get_from_cs_author(cs.author)
if not cs_author:
#use repo owner if we cannot extract the author correctly
cs_author = repo.user
recipients += [cs_author]
fix missing email_kwargs
r2805 email_kwargs = {
'status_change': status_change,
}
- added commenting to pull requests...
r2443 #pull request
elif pull_request:
part2 of pull-request notification improvements
r2802 _url = h.url('pullrequest_show',
repo_name=pull_request.other_repo.repo_name,
pull_request_id=pull_request.pull_request_id,
anchor='comment-%s' % comment.comment_id,
qualified=True,
)
Added dynamic data loading for other repo we open pull request against...
r2541 subj = safe_unicode(
h.link_to('Re pull request: %(desc)s %(line)s' % \
part2 of pull-request notification improvements
r2802 {'desc': desc, 'line': line}, _url)
Added dynamic data loading for other repo we open pull request against...
r2541 )
- added commenting to pull requests...
r2443 notification_type = Notification.TYPE_PULL_REQUEST_COMMENT
# get the current participants of this pull request
recipients = ChangesetComment.get_users(pull_request_id=
pull_request.pull_request_id)
# add pull request author
recipients += [pull_request.author]
notification to commit author + gardening
r1716
part2 of pull-request notification improvements
r2802 # add the reviewers to notification
recipients += [x.user for x in pull_request.reviewers]
#set some variables for email notification
fix missing email_kwargs
r2805 email_kwargs = {
part2 of pull-request notification improvements
r2802 'pr_id': pull_request.pull_request_id,
'status_change': status_change,
'pr_comment_url': _url,
'pr_comment_user': h.person(user.email),
'pr_target_repo': h.url('summary_home',
repo_name=pull_request.other_repo.repo_name,
qualified=True)
}
- added commenting to pull requests...
r2443 # create notification objects, and emails
NotificationModel().create(
part2 of pull-request notification improvements
r2802 created_by=user, subject=subj, body=body,
recipients=recipients, type_=notification_type,
fix missing email_kwargs
r2805 email_kwargs=email_kwargs
- added commenting to pull requests...
r2443 )
mention_recipients = set(self._extract_mentions(body))\
.difference(recipients)
if mention_recipients:
fixed kwargs ->email_kwargs
r2814 email_kwargs.update({'pr_mention': True})
- added commenting to pull requests...
r2443 subj = _('[Mention]') + ' ' + subj
code garden
r2077 NotificationModel().create(
Added dynamic data loading for other repo we open pull request against...
r2541 created_by=user, subject=subj, body=body,
- added commenting to pull requests...
r2443 recipients=mention_recipients,
type_=notification_type,
fixed kwargs ->email_kwargs
r2814 email_kwargs=email_kwargs
code garden
r2077 )
notification fixes and improvements
r1703
- added commenting to pull requests...
r2443 return comment
#77 code review...
r1670
Tests updates, Session refactoring
r1713 def delete(self, comment):
#77 code review...
r1670 """
Deletes given comment
implements #308 rewrote diffs to enable displaying full diff on each file...
r1789
#77 code review...
r1670 :param comment_id:
"""
Tests updates, Session refactoring
r1713 comment = self.__get_changeset_comment(comment)
#77 code review...
r1670 self.sa.delete(comment)
Tests updates, Session refactoring
r1713
#77 code review...
r1670 return comment
code refactoring
r1675
- pull request generates overview based on it's params...
r2440 def get_comments(self, repo_id, revision=None, pull_request=None):
Refactoring of changeset_file_comments for more generic usage. In both It enables sharing code between changeset, and pull requests discussions
r2439 """
Get's main comments based on revision or pull_request_id
:param repo_id:
:type repo_id:
:param revision:
:type revision:
- pull request generates overview based on it's params...
r2440 :param pull_request:
:type pull_request:
Refactoring of changeset_file_comments for more generic usage. In both It enables sharing code between changeset, and pull requests discussions
r2439 """
- pull request generates overview based on it's params...
r2440
Refactoring of changeset_file_comments for more generic usage. In both It enables sharing code between changeset, and pull requests discussions
r2439 q = ChangesetComment.query()\
code refactoring
r1675 .filter(ChangesetComment.repo_id == repo_id)\
.filter(ChangesetComment.line_no == None)\
Refactoring of changeset_file_comments for more generic usage. In both It enables sharing code between changeset, and pull requests discussions
r2439 .filter(ChangesetComment.f_path == None)
if revision:
q = q.filter(ChangesetComment.revision == revision)
- pull request generates overview based on it's params...
r2440 elif pull_request:
pull_request = self.__get_pull_request(pull_request)
q = q.filter(ChangesetComment.pull_request == pull_request)
Refactoring of changeset_file_comments for more generic usage. In both It enables sharing code between changeset, and pull requests discussions
r2439 else:
- pull request generates overview based on it's params...
r2440 raise Exception('Please specify revision or pull_request')
Added created_on column to changeset comments for proper ordering.
r2639 q = q.order_by(ChangesetComment.created_on)
Refactoring of changeset_file_comments for more generic usage. In both It enables sharing code between changeset, and pull requests discussions
r2439 return q.all()
code refactoring
r1675
- pull request generates overview based on it's params...
r2440 def get_inline_comments(self, repo_id, revision=None, pull_request=None):
Refactoring of changeset_file_comments for more generic usage. In both It enables sharing code between changeset, and pull requests discussions
r2439 q = self.sa.query(ChangesetComment)\
code refactoring
r1675 .filter(ChangesetComment.repo_id == repo_id)\
fixes inline comments double entries
r1681 .filter(ChangesetComment.line_no != None)\
#415: Adding comment to changeset causes reload...
r2187 .filter(ChangesetComment.f_path != None)\
.order_by(ChangesetComment.comment_id.asc())\
Refactoring of changeset_file_comments for more generic usage. In both It enables sharing code between changeset, and pull requests discussions
r2439
if revision:
q = q.filter(ChangesetComment.revision == revision)
- pull request generates overview based on it's params...
r2440 elif pull_request:
pull_request = self.__get_pull_request(pull_request)
q = q.filter(ChangesetComment.pull_request == pull_request)
Refactoring of changeset_file_comments for more generic usage. In both It enables sharing code between changeset, and pull requests discussions
r2439 else:
raise Exception('Please specify revision or pull_request_id')
comments = q.all()
#71 code-review...
r1677
implements #308 rewrote diffs to enable displaying full diff on each file...
r1789 paths = defaultdict(lambda: defaultdict(list))
code refactoring
r1675
for co in comments:
#71 code-review...
r1677 paths[co.f_path][co.line_no].append(co)
return paths.items()