##// END OF EJS Templates
Refactoring of changeset_file_comments for more generic usage. In both It enables sharing code between changeset, and pull requests discussions
Refactoring of changeset_file_comments for more generic usage. In both It enables sharing code between changeset, and pull requests discussions

File last commit:

r2439:ad19dfcd codereview
r2439:ad19dfcd codereview
Show More
comment.py
181 lines | 6.3 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
Notification system improvements...
r1712 from rhodecode.model.db import ChangesetComment, User, Repository, Notification
notification fixes and improvements
r1703 from rhodecode.model.notification import NotificationModel
#77 code review...
r1670
log = logging.getLogger(__name__)
class ChangesetCommentsModel(BaseModel):
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
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
code refactoring
r1675 def create(self, text, repo_id, user_id, revision, f_path=None,
Add changeset status change into emails
r2296 line_no=None, status_change=None):
#77 code review...
r1670 """
Add changeset status change into emails
r2296 Creates new comment for changeset. IF status_change is not none
this comment is associated with a status change of changeset
implements #308 rewrote diffs to enable displaying full diff on each file...
r1789
#77 code review...
r1670 :param text:
:param repo_id:
:param user_id:
code refactoring
r1675 :param revision:
#77 code review...
r1670 :param f_path:
:param line_no:
Add changeset status change into emails
r2296 :param status_change:
#77 code review...
r1670 """
White space cleanup
r2150
#71 code-review...
r1677 if text:
Notification system improvements...
r1712 repo = Repository.get(repo_id)
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))
code garden
r2082 author_email = cs.author_email
#71 code-review...
r1677 comment = ChangesetComment()
Notification system improvements...
r1712 comment.repo = repo
#71 code-review...
r1677 comment.user_id = user_id
comment.revision = revision
comment.text = text
comment.f_path = f_path
comment.line_no = line_no
#77 code review...
r1670
#71 code-review...
r1677 self.sa.add(comment)
Notification system improvements...
r1712 self.sa.flush()
notification fixes and improvements
r1703 # make notification
Notification system improvements...
r1712 line = ''
if line_no:
line = _('on line %s') % line_no
Notification fixes...
r2178 subj = safe_unicode(
h.link_to('Re commit: %(commit_desc)s %(line)s' % \
{'commit_desc': desc, 'line': line},
h.url('changeset_home', repo_name=repo.repo_name,
revision=revision,
anchor='comment-%s' % comment.comment_id,
qualified=True,
)
)
)
notification fixes and improvements
r1703 body = text
code garden
r2077
# get the current participants of this changeset
notification fixes and improvements
r1703 recipients = ChangesetComment.get_users(revision=revision)
code garden
r2077
code garden
r2082 # add changeset author if it's in rhodecode system
recipients += [User.get_by_email(author_email)]
notification to commit author + gardening
r1716
Don't send emails to person who comment on changeset
r2387 # create notification objects, and emails
code garden
r2077 NotificationModel().create(
created_by=user_id, subject=subj, body=body,
Add changeset status change into emails
r2296 recipients=recipients, type_=Notification.TYPE_CHANGESET_COMMENT,
email_kwargs={'status_change': status_change}
code garden
r2077 )
notification fixes and improvements
r1703
Notification fixes...
r1717 mention_recipients = set(self._extract_mentions(body))\
.difference(recipients)
notification to commit author + gardening
r1716 if mention_recipients:
subj = _('[Mention]') + ' ' + subj
code garden
r2077 NotificationModel().create(
created_by=user_id, subject=subj, body=body,
recipients=mention_recipients,
Added basic models for saving open pull requests...
r2434 type_=Notification.TYPE_CHANGESET_COMMENT,
email_kwargs={'status_change': status_change}
code garden
r2077 )
notification to commit author + gardening
r1716
#71 code-review...
r1677 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
Refactoring of changeset_file_comments for more generic usage. In both It enables sharing code between changeset, and pull requests discussions
r2439 def get_comments(self, repo_id, revision=None, pull_request_id=None):
"""
Get's main comments based on revision or pull_request_id
:param repo_id:
:type repo_id:
:param revision:
:type revision:
:param pull_request_id:
:type pull_request_id:
"""
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)
elif pull_request_id:
q = q.filter(ChangesetComment.pull_request_id == pull_request_id)
else:
raise Exception('Please specify revision or pull_request_id')
return q.all()
code refactoring
r1675
Refactoring of changeset_file_comments for more generic usage. In both It enables sharing code between changeset, and pull requests discussions
r2439 def get_inline_comments(self, repo_id, revision=None, pull_request_id=None):
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)
elif pull_request_id:
q = q.filter(ChangesetComment.pull_request_id == pull_request_id)
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()