Mercurial > kallithea
annotate rhodecode/model/comment.py @ 2364:9d61aad859bc codereview
code garden
author | Marcin Kuzminski <marcin@python-works.com> |
---|---|
date | Wed, 30 May 2012 23:12:24 +0200 |
parents | e5c0f201ca0b |
children | 91fae60bf2b6 |
rev | line source |
---|---|
1670 | 1 # -*- coding: utf-8 -*- |
2 """ | |
3 rhodecode.model.comment | |
4 ~~~~~~~~~~~~~~~~~~~~~~~ | |
5 | |
6 comments model for RhodeCode | |
1789
17caf4efe15c
implements #308 rewrote diffs to enable displaying full diff on each file
Marcin Kuzminski <marcin@python-works.com>
parents:
1734
diff
changeset
|
7 |
1670 | 8 :created_on: Nov 11, 2011 |
9 :author: marcink | |
1824
89efedac4e6c
2012 copyrights
Marcin Kuzminski <marcin@python-works.com>
parents:
1789
diff
changeset
|
10 :copyright: (C) 2011-2012 Marcin Kuzminski <marcin@python-works.com> |
1670 | 11 :license: GPLv3, see COPYING for more details. |
12 """ | |
13 # This program is free software: you can redistribute it and/or modify | |
14 # it under the terms of the GNU General Public License as published by | |
15 # the Free Software Foundation, either version 3 of the License, or | |
16 # (at your option) any later version. | |
17 # | |
18 # This program is distributed in the hope that it will be useful, | |
19 # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
20 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
21 # GNU General Public License for more details. | |
22 # | |
23 # You should have received a copy of the GNU General Public License | |
24 # along with this program. If not, see <http://www.gnu.org/licenses/>. | |
25 | |
26 import logging | |
27 import traceback | |
28 | |
1712
cac5109ac3b6
Notification system improvements
Marcin Kuzminski <marcin@python-works.com>
parents:
1703
diff
changeset
|
29 from pylons.i18n.translation import _ |
cac5109ac3b6
Notification system improvements
Marcin Kuzminski <marcin@python-works.com>
parents:
1703
diff
changeset
|
30 from sqlalchemy.util.compat import defaultdict |
cac5109ac3b6
Notification system improvements
Marcin Kuzminski <marcin@python-works.com>
parents:
1703
diff
changeset
|
31 |
2178
989c137f26eb
Notification fixes
Marcin Kuzminski <marcin@python-works.com>
parents:
2150
diff
changeset
|
32 from rhodecode.lib.utils2 import extract_mentioned_users, safe_unicode |
1712
cac5109ac3b6
Notification system improvements
Marcin Kuzminski <marcin@python-works.com>
parents:
1703
diff
changeset
|
33 from rhodecode.lib import helpers as h |
1670 | 34 from rhodecode.model import BaseModel |
1712
cac5109ac3b6
Notification system improvements
Marcin Kuzminski <marcin@python-works.com>
parents:
1703
diff
changeset
|
35 from rhodecode.model.db import ChangesetComment, User, Repository, Notification |
1703
f23828b00b21
notification fixes and improvements
Marcin Kuzminski <marcin@python-works.com>
parents:
1681
diff
changeset
|
36 from rhodecode.model.notification import NotificationModel |
1670 | 37 |
38 log = logging.getLogger(__name__) | |
39 | |
40 | |
41 class ChangesetCommentsModel(BaseModel): | |
42 | |
1713
54687aa00724
Tests updates, Session refactoring
Marcin Kuzminski <marcin@python-works.com>
parents:
1712
diff
changeset
|
43 def __get_changeset_comment(self, changeset_comment): |
1716
7d1fc253549e
notification to commit author + gardening
Marcin Kuzminski <marcin@python-works.com>
parents:
1713
diff
changeset
|
44 return self._get_instance(ChangesetComment, changeset_comment) |
1670 | 45 |
1712
cac5109ac3b6
Notification system improvements
Marcin Kuzminski <marcin@python-works.com>
parents:
1703
diff
changeset
|
46 def _extract_mentions(self, s): |
1713
54687aa00724
Tests updates, Session refactoring
Marcin Kuzminski <marcin@python-works.com>
parents:
1712
diff
changeset
|
47 user_objects = [] |
54687aa00724
Tests updates, Session refactoring
Marcin Kuzminski <marcin@python-works.com>
parents:
1712
diff
changeset
|
48 for username in extract_mentioned_users(s): |
1712
cac5109ac3b6
Notification system improvements
Marcin Kuzminski <marcin@python-works.com>
parents:
1703
diff
changeset
|
49 user_obj = User.get_by_username(username, case_insensitive=True) |
cac5109ac3b6
Notification system improvements
Marcin Kuzminski <marcin@python-works.com>
parents:
1703
diff
changeset
|
50 if user_obj: |
1713
54687aa00724
Tests updates, Session refactoring
Marcin Kuzminski <marcin@python-works.com>
parents:
1712
diff
changeset
|
51 user_objects.append(user_obj) |
54687aa00724
Tests updates, Session refactoring
Marcin Kuzminski <marcin@python-works.com>
parents:
1712
diff
changeset
|
52 return user_objects |
1712
cac5109ac3b6
Notification system improvements
Marcin Kuzminski <marcin@python-works.com>
parents:
1703
diff
changeset
|
53 |
1675
7c487d2678c7
code refactoring
Marcin Kuzminski <marcin@python-works.com>
parents:
1670
diff
changeset
|
54 def create(self, text, repo_id, user_id, revision, f_path=None, |
2296
e5c0f201ca0b
Add changeset status change into emails
Marcin Kuzminski <marcin@python-works.com>
parents:
2187
diff
changeset
|
55 line_no=None, status_change=None): |
1670 | 56 """ |
2296
e5c0f201ca0b
Add changeset status change into emails
Marcin Kuzminski <marcin@python-works.com>
parents:
2187
diff
changeset
|
57 Creates new comment for changeset. IF status_change is not none |
e5c0f201ca0b
Add changeset status change into emails
Marcin Kuzminski <marcin@python-works.com>
parents:
2187
diff
changeset
|
58 this comment is associated with a status change of changeset |
1789
17caf4efe15c
implements #308 rewrote diffs to enable displaying full diff on each file
Marcin Kuzminski <marcin@python-works.com>
parents:
1734
diff
changeset
|
59 |
1670 | 60 :param text: |
61 :param repo_id: | |
62 :param user_id: | |
1675
7c487d2678c7
code refactoring
Marcin Kuzminski <marcin@python-works.com>
parents:
1670
diff
changeset
|
63 :param revision: |
1670 | 64 :param f_path: |
65 :param line_no: | |
2296
e5c0f201ca0b
Add changeset status change into emails
Marcin Kuzminski <marcin@python-works.com>
parents:
2187
diff
changeset
|
66 :param status_change: |
1670 | 67 """ |
2150
a8c9c0094ddf
White space cleanup
Marcin Kuzminski <marcin@python-works.com>
parents:
2109
diff
changeset
|
68 |
1677
7276b170ce8b
#71 code-review
Marcin Kuzminski <marcin@python-works.com>
parents:
1675
diff
changeset
|
69 if text: |
1712
cac5109ac3b6
Notification system improvements
Marcin Kuzminski <marcin@python-works.com>
parents:
1703
diff
changeset
|
70 repo = Repository.get(repo_id) |
1716
7d1fc253549e
notification to commit author + gardening
Marcin Kuzminski <marcin@python-works.com>
parents:
1713
diff
changeset
|
71 cs = repo.scm_instance.get_changeset(revision) |
2178
989c137f26eb
Notification fixes
Marcin Kuzminski <marcin@python-works.com>
parents:
2150
diff
changeset
|
72 desc = "%s - %s" % (cs.short_id, h.shorter(cs.message, 256)) |
2082 | 73 author_email = cs.author_email |
1677
7276b170ce8b
#71 code-review
Marcin Kuzminski <marcin@python-works.com>
parents:
1675
diff
changeset
|
74 comment = ChangesetComment() |
1712
cac5109ac3b6
Notification system improvements
Marcin Kuzminski <marcin@python-works.com>
parents:
1703
diff
changeset
|
75 comment.repo = repo |
1677
7276b170ce8b
#71 code-review
Marcin Kuzminski <marcin@python-works.com>
parents:
1675
diff
changeset
|
76 comment.user_id = user_id |
7276b170ce8b
#71 code-review
Marcin Kuzminski <marcin@python-works.com>
parents:
1675
diff
changeset
|
77 comment.revision = revision |
7276b170ce8b
#71 code-review
Marcin Kuzminski <marcin@python-works.com>
parents:
1675
diff
changeset
|
78 comment.text = text |
7276b170ce8b
#71 code-review
Marcin Kuzminski <marcin@python-works.com>
parents:
1675
diff
changeset
|
79 comment.f_path = f_path |
7276b170ce8b
#71 code-review
Marcin Kuzminski <marcin@python-works.com>
parents:
1675
diff
changeset
|
80 comment.line_no = line_no |
1670 | 81 |
1677
7276b170ce8b
#71 code-review
Marcin Kuzminski <marcin@python-works.com>
parents:
1675
diff
changeset
|
82 self.sa.add(comment) |
1712
cac5109ac3b6
Notification system improvements
Marcin Kuzminski <marcin@python-works.com>
parents:
1703
diff
changeset
|
83 self.sa.flush() |
1703
f23828b00b21
notification fixes and improvements
Marcin Kuzminski <marcin@python-works.com>
parents:
1681
diff
changeset
|
84 # make notification |
1712
cac5109ac3b6
Notification system improvements
Marcin Kuzminski <marcin@python-works.com>
parents:
1703
diff
changeset
|
85 line = '' |
cac5109ac3b6
Notification system improvements
Marcin Kuzminski <marcin@python-works.com>
parents:
1703
diff
changeset
|
86 if line_no: |
cac5109ac3b6
Notification system improvements
Marcin Kuzminski <marcin@python-works.com>
parents:
1703
diff
changeset
|
87 line = _('on line %s') % line_no |
2178
989c137f26eb
Notification fixes
Marcin Kuzminski <marcin@python-works.com>
parents:
2150
diff
changeset
|
88 subj = safe_unicode( |
989c137f26eb
Notification fixes
Marcin Kuzminski <marcin@python-works.com>
parents:
2150
diff
changeset
|
89 h.link_to('Re commit: %(commit_desc)s %(line)s' % \ |
989c137f26eb
Notification fixes
Marcin Kuzminski <marcin@python-works.com>
parents:
2150
diff
changeset
|
90 {'commit_desc': desc, 'line': line}, |
989c137f26eb
Notification fixes
Marcin Kuzminski <marcin@python-works.com>
parents:
2150
diff
changeset
|
91 h.url('changeset_home', repo_name=repo.repo_name, |
989c137f26eb
Notification fixes
Marcin Kuzminski <marcin@python-works.com>
parents:
2150
diff
changeset
|
92 revision=revision, |
989c137f26eb
Notification fixes
Marcin Kuzminski <marcin@python-works.com>
parents:
2150
diff
changeset
|
93 anchor='comment-%s' % comment.comment_id, |
989c137f26eb
Notification fixes
Marcin Kuzminski <marcin@python-works.com>
parents:
2150
diff
changeset
|
94 qualified=True, |
989c137f26eb
Notification fixes
Marcin Kuzminski <marcin@python-works.com>
parents:
2150
diff
changeset
|
95 ) |
989c137f26eb
Notification fixes
Marcin Kuzminski <marcin@python-works.com>
parents:
2150
diff
changeset
|
96 ) |
989c137f26eb
Notification fixes
Marcin Kuzminski <marcin@python-works.com>
parents:
2150
diff
changeset
|
97 ) |
989c137f26eb
Notification fixes
Marcin Kuzminski <marcin@python-works.com>
parents:
2150
diff
changeset
|
98 |
1703
f23828b00b21
notification fixes and improvements
Marcin Kuzminski <marcin@python-works.com>
parents:
1681
diff
changeset
|
99 body = text |
2077 | 100 |
101 # get the current participants of this changeset | |
1703
f23828b00b21
notification fixes and improvements
Marcin Kuzminski <marcin@python-works.com>
parents:
1681
diff
changeset
|
102 recipients = ChangesetComment.get_users(revision=revision) |
2077 | 103 |
2082 | 104 # add changeset author if it's in rhodecode system |
105 recipients += [User.get_by_email(author_email)] | |
1716
7d1fc253549e
notification to commit author + gardening
Marcin Kuzminski <marcin@python-works.com>
parents:
1713
diff
changeset
|
106 |
2077 | 107 NotificationModel().create( |
108 created_by=user_id, subject=subj, body=body, | |
2296
e5c0f201ca0b
Add changeset status change into emails
Marcin Kuzminski <marcin@python-works.com>
parents:
2187
diff
changeset
|
109 recipients=recipients, type_=Notification.TYPE_CHANGESET_COMMENT, |
e5c0f201ca0b
Add changeset status change into emails
Marcin Kuzminski <marcin@python-works.com>
parents:
2187
diff
changeset
|
110 email_kwargs={'status_change': status_change} |
2077 | 111 ) |
1703
f23828b00b21
notification fixes and improvements
Marcin Kuzminski <marcin@python-works.com>
parents:
1681
diff
changeset
|
112 |
1717
7ff304d3028f
Notification fixes
Marcin Kuzminski <marcin@python-works.com>
parents:
1716
diff
changeset
|
113 mention_recipients = set(self._extract_mentions(body))\ |
7ff304d3028f
Notification fixes
Marcin Kuzminski <marcin@python-works.com>
parents:
1716
diff
changeset
|
114 .difference(recipients) |
1716
7d1fc253549e
notification to commit author + gardening
Marcin Kuzminski <marcin@python-works.com>
parents:
1713
diff
changeset
|
115 if mention_recipients: |
7d1fc253549e
notification to commit author + gardening
Marcin Kuzminski <marcin@python-works.com>
parents:
1713
diff
changeset
|
116 subj = _('[Mention]') + ' ' + subj |
2077 | 117 NotificationModel().create( |
118 created_by=user_id, subject=subj, body=body, | |
119 recipients=mention_recipients, | |
120 type_=Notification.TYPE_CHANGESET_COMMENT | |
121 ) | |
1716
7d1fc253549e
notification to commit author + gardening
Marcin Kuzminski <marcin@python-works.com>
parents:
1713
diff
changeset
|
122 |
1677
7276b170ce8b
#71 code-review
Marcin Kuzminski <marcin@python-works.com>
parents:
1675
diff
changeset
|
123 return comment |
1670 | 124 |
1713
54687aa00724
Tests updates, Session refactoring
Marcin Kuzminski <marcin@python-works.com>
parents:
1712
diff
changeset
|
125 def delete(self, comment): |
1670 | 126 """ |
127 Deletes given comment | |
1789
17caf4efe15c
implements #308 rewrote diffs to enable displaying full diff on each file
Marcin Kuzminski <marcin@python-works.com>
parents:
1734
diff
changeset
|
128 |
1670 | 129 :param comment_id: |
130 """ | |
1713
54687aa00724
Tests updates, Session refactoring
Marcin Kuzminski <marcin@python-works.com>
parents:
1712
diff
changeset
|
131 comment = self.__get_changeset_comment(comment) |
1670 | 132 self.sa.delete(comment) |
1713
54687aa00724
Tests updates, Session refactoring
Marcin Kuzminski <marcin@python-works.com>
parents:
1712
diff
changeset
|
133 |
1670 | 134 return comment |
1675
7c487d2678c7
code refactoring
Marcin Kuzminski <marcin@python-works.com>
parents:
1670
diff
changeset
|
135 |
7c487d2678c7
code refactoring
Marcin Kuzminski <marcin@python-works.com>
parents:
1670
diff
changeset
|
136 def get_comments(self, repo_id, revision): |
7c487d2678c7
code refactoring
Marcin Kuzminski <marcin@python-works.com>
parents:
1670
diff
changeset
|
137 return ChangesetComment.query()\ |
7c487d2678c7
code refactoring
Marcin Kuzminski <marcin@python-works.com>
parents:
1670
diff
changeset
|
138 .filter(ChangesetComment.repo_id == repo_id)\ |
7c487d2678c7
code refactoring
Marcin Kuzminski <marcin@python-works.com>
parents:
1670
diff
changeset
|
139 .filter(ChangesetComment.revision == revision)\ |
7c487d2678c7
code refactoring
Marcin Kuzminski <marcin@python-works.com>
parents:
1670
diff
changeset
|
140 .filter(ChangesetComment.line_no == None)\ |
7c487d2678c7
code refactoring
Marcin Kuzminski <marcin@python-works.com>
parents:
1670
diff
changeset
|
141 .filter(ChangesetComment.f_path == None).all() |
7c487d2678c7
code refactoring
Marcin Kuzminski <marcin@python-works.com>
parents:
1670
diff
changeset
|
142 |
1677
7276b170ce8b
#71 code-review
Marcin Kuzminski <marcin@python-works.com>
parents:
1675
diff
changeset
|
143 def get_inline_comments(self, repo_id, revision): |
1675
7c487d2678c7
code refactoring
Marcin Kuzminski <marcin@python-works.com>
parents:
1670
diff
changeset
|
144 comments = self.sa.query(ChangesetComment)\ |
7c487d2678c7
code refactoring
Marcin Kuzminski <marcin@python-works.com>
parents:
1670
diff
changeset
|
145 .filter(ChangesetComment.repo_id == repo_id)\ |
1681
1bf03daafaf0
fixes inline comments double entries
Marcin Kuzminski <marcin@python-works.com>
parents:
1677
diff
changeset
|
146 .filter(ChangesetComment.revision == revision)\ |
1bf03daafaf0
fixes inline comments double entries
Marcin Kuzminski <marcin@python-works.com>
parents:
1677
diff
changeset
|
147 .filter(ChangesetComment.line_no != None)\ |
2187
b61e540122f2
#415: Adding comment to changeset causes reload
Marcin Kuzminski <marcin@python-works.com>
parents:
2178
diff
changeset
|
148 .filter(ChangesetComment.f_path != None)\ |
b61e540122f2
#415: Adding comment to changeset causes reload
Marcin Kuzminski <marcin@python-works.com>
parents:
2178
diff
changeset
|
149 .order_by(ChangesetComment.comment_id.asc())\ |
b61e540122f2
#415: Adding comment to changeset causes reload
Marcin Kuzminski <marcin@python-works.com>
parents:
2178
diff
changeset
|
150 .all() |
1677
7276b170ce8b
#71 code-review
Marcin Kuzminski <marcin@python-works.com>
parents:
1675
diff
changeset
|
151 |
1789
17caf4efe15c
implements #308 rewrote diffs to enable displaying full diff on each file
Marcin Kuzminski <marcin@python-works.com>
parents:
1734
diff
changeset
|
152 paths = defaultdict(lambda: defaultdict(list)) |
1675
7c487d2678c7
code refactoring
Marcin Kuzminski <marcin@python-works.com>
parents:
1670
diff
changeset
|
153 |
7c487d2678c7
code refactoring
Marcin Kuzminski <marcin@python-works.com>
parents:
1670
diff
changeset
|
154 for co in comments: |
1677
7276b170ce8b
#71 code-review
Marcin Kuzminski <marcin@python-works.com>
parents:
1675
diff
changeset
|
155 paths[co.f_path][co.line_no].append(co) |
7276b170ce8b
#71 code-review
Marcin Kuzminski <marcin@python-works.com>
parents:
1675
diff
changeset
|
156 return paths.items() |