annotate rhodecode/controllers/pullrequests.py @ 3705:f37d7514e7ab beta

always use json from compat module
author Marcin Kuzminski <marcin@python-works.com>
date Sun, 07 Apr 2013 19:55:30 +0200
parents 9d2db665ef31
children b2575bdb847c 7efc8dcc0dc4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2244
77e376fdc4c6 pull requests draft UI
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
1 # -*- coding: utf-8 -*-
77e376fdc4c6 pull requests draft UI
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
2 """
77e376fdc4c6 pull requests draft UI
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
3 rhodecode.controllers.pullrequests
77e376fdc4c6 pull requests draft UI
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
77e376fdc4c6 pull requests draft UI
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
5
77e376fdc4c6 pull requests draft UI
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
6 pull requests controller for rhodecode for initializing pull requests
77e376fdc4c6 pull requests draft UI
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
7
77e376fdc4c6 pull requests draft UI
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
8 :created_on: May 7, 2012
77e376fdc4c6 pull requests draft UI
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
9 :author: marcink
77e376fdc4c6 pull requests draft UI
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
10 :copyright: (C) 2010-2012 Marcin Kuzminski <marcin@python-works.com>
77e376fdc4c6 pull requests draft UI
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
11 :license: GPLv3, see COPYING for more details.
77e376fdc4c6 pull requests draft UI
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
12 """
77e376fdc4c6 pull requests draft UI
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
13 # This program is free software: you can redistribute it and/or modify
77e376fdc4c6 pull requests draft UI
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
14 # it under the terms of the GNU General Public License as published by
77e376fdc4c6 pull requests draft UI
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
15 # the Free Software Foundation, either version 3 of the License, or
77e376fdc4c6 pull requests draft UI
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
16 # (at your option) any later version.
77e376fdc4c6 pull requests draft UI
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
17 #
77e376fdc4c6 pull requests draft UI
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
18 # This program is distributed in the hope that it will be useful,
77e376fdc4c6 pull requests draft UI
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
19 # but WITHOUT ANY WARRANTY; without even the implied warranty of
77e376fdc4c6 pull requests draft UI
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
20 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
77e376fdc4c6 pull requests draft UI
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
21 # GNU General Public License for more details.
77e376fdc4c6 pull requests draft UI
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
22 #
77e376fdc4c6 pull requests draft UI
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
23 # You should have received a copy of the GNU General Public License
77e376fdc4c6 pull requests draft UI
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
24 # along with this program. If not, see <http://www.gnu.org/licenses/>.
77e376fdc4c6 pull requests draft UI
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
25 import logging
77e376fdc4c6 pull requests draft UI
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
26 import traceback
2711
1de45f582f9d added more validations when opening pull request
Marcin Kuzminski <marcin@python-works.com>
parents: 2627
diff changeset
27 import formencode
2440
1bc579bcd67a - pull request generates overview based on it's params
Marcin Kuzminski <marcin@python-works.com>
parents: 2434
diff changeset
28
2489
a0adf8db1416 Enabled inline comments in pull-requests
Marcin Kuzminski <marcin@python-works.com>
parents: 2487
diff changeset
29 from webob.exc import HTTPNotFound, HTTPForbidden
2481
4d3032431d4f Adde pull request voting recalculation
Marcin Kuzminski <marcin@python-works.com>
parents: 2478
diff changeset
30 from collections import defaultdict
4d3032431d4f Adde pull request voting recalculation
Marcin Kuzminski <marcin@python-works.com>
parents: 2478
diff changeset
31 from itertools import groupby
2244
77e376fdc4c6 pull requests draft UI
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
32
77e376fdc4c6 pull requests draft UI
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
33 from pylons import request, response, session, tmpl_context as c, url
77e376fdc4c6 pull requests draft UI
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
34 from pylons.controllers.util import abort, redirect
77e376fdc4c6 pull requests draft UI
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
35 from pylons.i18n.translation import _
77e376fdc4c6 pull requests draft UI
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
36
2541
1c2ba03c42b4 Added dynamic data loading for other repo we open pull request against
Marcin Kuzminski <marcin@python-works.com>
parents: 2533
diff changeset
37 from rhodecode.lib.compat import json
2244
77e376fdc4c6 pull requests draft UI
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
38 from rhodecode.lib.base import BaseRepoController, render
2612
9364776d1331 Added autocomplete widget for pull request reviewers, in exchange of 90s style
Marcin Kuzminski <marcin@python-works.com>
parents: 2608
diff changeset
39 from rhodecode.lib.auth import LoginRequired, HasRepoPermissionAnyDecorator,\
9364776d1331 Added autocomplete widget for pull request reviewers, in exchange of 90s style
Marcin Kuzminski <marcin@python-works.com>
parents: 2608
diff changeset
40 NotAnonymous
3676
9d2db665ef31 pagination in pull-requests page + UI
Marcin Kuzminski <marcin@python-works.com>
parents: 3654
diff changeset
41 from rhodecode.lib.helpers import Page
2434
f29469677319 Added basic models for saving open pull requests
Marcin Kuzminski <marcin@python-works.com>
parents: 2395
diff changeset
42 from rhodecode.lib import helpers as h
2440
1bc579bcd67a - pull request generates overview based on it's params
Marcin Kuzminski <marcin@python-works.com>
parents: 2434
diff changeset
43 from rhodecode.lib import diffs
3061
7727faad5baf fixed issue #671 commenting on pull requests sometimes used old JSON encoder and broke. This changeset replaces it's with RhodeCode json encoder to ensure all data is properly serializable
Marcin Kuzminski <marcin@python-works.com>
parents: 3023
diff changeset
44 from rhodecode.lib.utils import action_logger, jsonify
7727faad5baf fixed issue #671 commenting on pull requests sometimes used old JSON encoder and broke. This changeset replaces it's with RhodeCode json encoder to ensure all data is properly serializable
Marcin Kuzminski <marcin@python-works.com>
parents: 3023
diff changeset
45 from rhodecode.lib.vcs.exceptions import EmptyRepositoryError
7727faad5baf fixed issue #671 commenting on pull requests sometimes used old JSON encoder and broke. This changeset replaces it's with RhodeCode json encoder to ensure all data is properly serializable
Marcin Kuzminski <marcin@python-works.com>
parents: 3023
diff changeset
46 from rhodecode.lib.vcs.backends.base import EmptyChangeset
7727faad5baf fixed issue #671 commenting on pull requests sometimes used old JSON encoder and broke. This changeset replaces it's with RhodeCode json encoder to ensure all data is properly serializable
Marcin Kuzminski <marcin@python-works.com>
parents: 3023
diff changeset
47 from rhodecode.lib.diffs import LimitedDiffContainer
2489
a0adf8db1416 Enabled inline comments in pull-requests
Marcin Kuzminski <marcin@python-works.com>
parents: 2487
diff changeset
48 from rhodecode.model.db import User, PullRequest, ChangesetStatus,\
a0adf8db1416 Enabled inline comments in pull-requests
Marcin Kuzminski <marcin@python-works.com>
parents: 2487
diff changeset
49 ChangesetComment
2434
f29469677319 Added basic models for saving open pull requests
Marcin Kuzminski <marcin@python-works.com>
parents: 2395
diff changeset
50 from rhodecode.model.pull_request import PullRequestModel
f29469677319 Added basic models for saving open pull requests
Marcin Kuzminski <marcin@python-works.com>
parents: 2395
diff changeset
51 from rhodecode.model.meta import Session
2440
1bc579bcd67a - pull request generates overview based on it's params
Marcin Kuzminski <marcin@python-works.com>
parents: 2434
diff changeset
52 from rhodecode.model.repo import RepoModel
1bc579bcd67a - pull request generates overview based on it's params
Marcin Kuzminski <marcin@python-works.com>
parents: 2434
diff changeset
53 from rhodecode.model.comment import ChangesetCommentsModel
1bc579bcd67a - pull request generates overview based on it's params
Marcin Kuzminski <marcin@python-works.com>
parents: 2434
diff changeset
54 from rhodecode.model.changeset_status import ChangesetStatusModel
2711
1de45f582f9d added more validations when opening pull request
Marcin Kuzminski <marcin@python-works.com>
parents: 2627
diff changeset
55 from rhodecode.model.forms import PullRequestForm
3515
5b3313a5c6fc pullrequest selection list: emphasize named branches that are neighbours
Mads Kiilerich <madski@unity3d.com>
parents: 3486
diff changeset
56 from mercurial import scmutil
3676
9d2db665ef31 pagination in pull-requests page + UI
Marcin Kuzminski <marcin@python-works.com>
parents: 3654
diff changeset
57 from rhodecode.lib.utils2 import safe_int
2244
77e376fdc4c6 pull requests draft UI
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
58
77e376fdc4c6 pull requests draft UI
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
59 log = logging.getLogger(__name__)
77e376fdc4c6 pull requests draft UI
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
60
77e376fdc4c6 pull requests draft UI
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
61
77e376fdc4c6 pull requests draft UI
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
62 class PullrequestsController(BaseRepoController):
77e376fdc4c6 pull requests draft UI
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
63
77e376fdc4c6 pull requests draft UI
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
64 @LoginRequired()
77e376fdc4c6 pull requests draft UI
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
65 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
77e376fdc4c6 pull requests draft UI
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
66 'repository.admin')
77e376fdc4c6 pull requests draft UI
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
67 def __before__(self):
77e376fdc4c6 pull requests draft UI
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
68 super(PullrequestsController, self).__before__()
2612
9364776d1331 Added autocomplete widget for pull request reviewers, in exchange of 90s style
Marcin Kuzminski <marcin@python-works.com>
parents: 2608
diff changeset
69 repo_model = RepoModel()
9364776d1331 Added autocomplete widget for pull request reviewers, in exchange of 90s style
Marcin Kuzminski <marcin@python-works.com>
parents: 2608
diff changeset
70 c.users_array = repo_model.get_users_js()
9364776d1331 Added autocomplete widget for pull request reviewers, in exchange of 90s style
Marcin Kuzminski <marcin@python-works.com>
parents: 2608
diff changeset
71 c.users_groups_array = repo_model.get_users_groups_js()
2244
77e376fdc4c6 pull requests draft UI
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
72
3515
5b3313a5c6fc pullrequest selection list: emphasize named branches that are neighbours
Mads Kiilerich <madski@unity3d.com>
parents: 3486
diff changeset
73 def _get_repo_refs(self, repo, rev=None, branch_rev=None):
3444
c12603d5ee13 pullrequests: refactor changeset selectors, tip is special and not a real tag
Mads Kiilerich <madski@unity3d.com>
parents: 3442
diff changeset
74 """return a structure with repo's interesting changesets, suitable for
c12603d5ee13 pullrequests: refactor changeset selectors, tip is special and not a real tag
Mads Kiilerich <madski@unity3d.com>
parents: 3442
diff changeset
75 the selectors in pullrequest.html"""
3515
5b3313a5c6fc pullrequest selection list: emphasize named branches that are neighbours
Mads Kiilerich <madski@unity3d.com>
parents: 3486
diff changeset
76
5b3313a5c6fc pullrequest selection list: emphasize named branches that are neighbours
Mads Kiilerich <madski@unity3d.com>
parents: 3486
diff changeset
77 # list named branches that has been merged to this named branch - it should probably merge back
3598
7d774f09dba5 pullrequests: only create special select entry for a changeset if it has no symbolic name
Mads Kiilerich <madski@unity3d.com>
parents: 3597
diff changeset
78 peers = []
3515
5b3313a5c6fc pullrequest selection list: emphasize named branches that are neighbours
Mads Kiilerich <madski@unity3d.com>
parents: 3486
diff changeset
79 if branch_rev:
5b3313a5c6fc pullrequest selection list: emphasize named branches that are neighbours
Mads Kiilerich <madski@unity3d.com>
parents: 3486
diff changeset
80 # not restricting to merge() would also get branch point and be better
5b3313a5c6fc pullrequest selection list: emphasize named branches that are neighbours
Mads Kiilerich <madski@unity3d.com>
parents: 3486
diff changeset
81 # (especially because it would get the branch point) ... but is currently too expensive
5b3313a5c6fc pullrequest selection list: emphasize named branches that are neighbours
Mads Kiilerich <madski@unity3d.com>
parents: 3486
diff changeset
82 revs = ["sort(parents(branch(id('%s')) and merge()) - branch(id('%s')))" %
5b3313a5c6fc pullrequest selection list: emphasize named branches that are neighbours
Mads Kiilerich <madski@unity3d.com>
parents: 3486
diff changeset
83 (branch_rev, branch_rev)]
5b3313a5c6fc pullrequest selection list: emphasize named branches that are neighbours
Mads Kiilerich <madski@unity3d.com>
parents: 3486
diff changeset
84 otherbranches = {}
5b3313a5c6fc pullrequest selection list: emphasize named branches that are neighbours
Mads Kiilerich <madski@unity3d.com>
parents: 3486
diff changeset
85 for i in scmutil.revrange(repo._repo, revs):
5b3313a5c6fc pullrequest selection list: emphasize named branches that are neighbours
Mads Kiilerich <madski@unity3d.com>
parents: 3486
diff changeset
86 cs = repo.get_changeset(i)
5b3313a5c6fc pullrequest selection list: emphasize named branches that are neighbours
Mads Kiilerich <madski@unity3d.com>
parents: 3486
diff changeset
87 otherbranches[cs.branch] = cs.raw_id
5b3313a5c6fc pullrequest selection list: emphasize named branches that are neighbours
Mads Kiilerich <madski@unity3d.com>
parents: 3486
diff changeset
88 for branch, node in otherbranches.iteritems():
5b3313a5c6fc pullrequest selection list: emphasize named branches that are neighbours
Mads Kiilerich <madski@unity3d.com>
parents: 3486
diff changeset
89 selected = 'branch:%s:%s' % (branch, node)
3598
7d774f09dba5 pullrequests: only create special select entry for a changeset if it has no symbolic name
Mads Kiilerich <madski@unity3d.com>
parents: 3597
diff changeset
90 peers.append((selected, branch))
7d774f09dba5 pullrequests: only create special select entry for a changeset if it has no symbolic name
Mads Kiilerich <madski@unity3d.com>
parents: 3597
diff changeset
91
7d774f09dba5 pullrequests: only create special select entry for a changeset if it has no symbolic name
Mads Kiilerich <madski@unity3d.com>
parents: 3597
diff changeset
92 selected = None
7d774f09dba5 pullrequests: only create special select entry for a changeset if it has no symbolic name
Mads Kiilerich <madski@unity3d.com>
parents: 3597
diff changeset
93 branches = []
7d774f09dba5 pullrequests: only create special select entry for a changeset if it has no symbolic name
Mads Kiilerich <madski@unity3d.com>
parents: 3597
diff changeset
94 for branch, branchrev in repo.branches.iteritems():
7d774f09dba5 pullrequests: only create special select entry for a changeset if it has no symbolic name
Mads Kiilerich <madski@unity3d.com>
parents: 3597
diff changeset
95 n = 'branch:%s:%s' % (branch, branchrev)
7d774f09dba5 pullrequests: only create special select entry for a changeset if it has no symbolic name
Mads Kiilerich <madski@unity3d.com>
parents: 3597
diff changeset
96 branches.append((n, branch))
7d774f09dba5 pullrequests: only create special select entry for a changeset if it has no symbolic name
Mads Kiilerich <madski@unity3d.com>
parents: 3597
diff changeset
97 if rev == branchrev:
7d774f09dba5 pullrequests: only create special select entry for a changeset if it has no symbolic name
Mads Kiilerich <madski@unity3d.com>
parents: 3597
diff changeset
98 selected = n
7d774f09dba5 pullrequests: only create special select entry for a changeset if it has no symbolic name
Mads Kiilerich <madski@unity3d.com>
parents: 3597
diff changeset
99 bookmarks = []
7d774f09dba5 pullrequests: only create special select entry for a changeset if it has no symbolic name
Mads Kiilerich <madski@unity3d.com>
parents: 3597
diff changeset
100 for bookmark, bookmarkrev in repo.bookmarks.iteritems():
7d774f09dba5 pullrequests: only create special select entry for a changeset if it has no symbolic name
Mads Kiilerich <madski@unity3d.com>
parents: 3597
diff changeset
101 n = 'book:%s:%s' % (bookmark, bookmarkrev)
7d774f09dba5 pullrequests: only create special select entry for a changeset if it has no symbolic name
Mads Kiilerich <madski@unity3d.com>
parents: 3597
diff changeset
102 bookmarks.append((n, bookmark))
7d774f09dba5 pullrequests: only create special select entry for a changeset if it has no symbolic name
Mads Kiilerich <madski@unity3d.com>
parents: 3597
diff changeset
103 if rev == bookmarkrev:
7d774f09dba5 pullrequests: only create special select entry for a changeset if it has no symbolic name
Mads Kiilerich <madski@unity3d.com>
parents: 3597
diff changeset
104 selected = n
7d774f09dba5 pullrequests: only create special select entry for a changeset if it has no symbolic name
Mads Kiilerich <madski@unity3d.com>
parents: 3597
diff changeset
105 tags = []
7d774f09dba5 pullrequests: only create special select entry for a changeset if it has no symbolic name
Mads Kiilerich <madski@unity3d.com>
parents: 3597
diff changeset
106 for tag, tagrev in repo.tags.iteritems():
7d774f09dba5 pullrequests: only create special select entry for a changeset if it has no symbolic name
Mads Kiilerich <madski@unity3d.com>
parents: 3597
diff changeset
107 n = 'tag:%s:%s' % (tag, tagrev)
7d774f09dba5 pullrequests: only create special select entry for a changeset if it has no symbolic name
Mads Kiilerich <madski@unity3d.com>
parents: 3597
diff changeset
108 tags.append((n, tag))
7d774f09dba5 pullrequests: only create special select entry for a changeset if it has no symbolic name
Mads Kiilerich <madski@unity3d.com>
parents: 3597
diff changeset
109 if rev == tagrev and tag != 'tip': # tip is not a real tag - and its branch is better
7d774f09dba5 pullrequests: only create special select entry for a changeset if it has no symbolic name
Mads Kiilerich <madski@unity3d.com>
parents: 3597
diff changeset
110 selected = n
2244
77e376fdc4c6 pull requests draft UI
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
111
3598
7d774f09dba5 pullrequests: only create special select entry for a changeset if it has no symbolic name
Mads Kiilerich <madski@unity3d.com>
parents: 3597
diff changeset
112 # prio 1: rev was selected as existing entry above
7d774f09dba5 pullrequests: only create special select entry for a changeset if it has no symbolic name
Mads Kiilerich <madski@unity3d.com>
parents: 3597
diff changeset
113
7d774f09dba5 pullrequests: only create special select entry for a changeset if it has no symbolic name
Mads Kiilerich <madski@unity3d.com>
parents: 3597
diff changeset
114 # prio 2: create special entry for rev; rev _must_ be used
7d774f09dba5 pullrequests: only create special select entry for a changeset if it has no symbolic name
Mads Kiilerich <madski@unity3d.com>
parents: 3597
diff changeset
115 specials = []
7d774f09dba5 pullrequests: only create special select entry for a changeset if it has no symbolic name
Mads Kiilerich <madski@unity3d.com>
parents: 3597
diff changeset
116 if rev and selected is None:
7d774f09dba5 pullrequests: only create special select entry for a changeset if it has no symbolic name
Mads Kiilerich <madski@unity3d.com>
parents: 3597
diff changeset
117 selected = 'rev:%s:%s' % (rev, rev)
7d774f09dba5 pullrequests: only create special select entry for a changeset if it has no symbolic name
Mads Kiilerich <madski@unity3d.com>
parents: 3597
diff changeset
118 specials = [(selected, '%s: %s' % (_("Changeset"), rev[:12]))]
7d774f09dba5 pullrequests: only create special select entry for a changeset if it has no symbolic name
Mads Kiilerich <madski@unity3d.com>
parents: 3597
diff changeset
119
7d774f09dba5 pullrequests: only create special select entry for a changeset if it has no symbolic name
Mads Kiilerich <madski@unity3d.com>
parents: 3597
diff changeset
120 # prio 3: most recent peer branch
7d774f09dba5 pullrequests: only create special select entry for a changeset if it has no symbolic name
Mads Kiilerich <madski@unity3d.com>
parents: 3597
diff changeset
121 if peers and not selected:
7d774f09dba5 pullrequests: only create special select entry for a changeset if it has no symbolic name
Mads Kiilerich <madski@unity3d.com>
parents: 3597
diff changeset
122 selected = peers[0][0][0]
7d774f09dba5 pullrequests: only create special select entry for a changeset if it has no symbolic name
Mads Kiilerich <madski@unity3d.com>
parents: 3597
diff changeset
123
7d774f09dba5 pullrequests: only create special select entry for a changeset if it has no symbolic name
Mads Kiilerich <madski@unity3d.com>
parents: 3597
diff changeset
124 # prio 4: tip revision
7d774f09dba5 pullrequests: only create special select entry for a changeset if it has no symbolic name
Mads Kiilerich <madski@unity3d.com>
parents: 3597
diff changeset
125 if not selected:
7d774f09dba5 pullrequests: only create special select entry for a changeset if it has no symbolic name
Mads Kiilerich <madski@unity3d.com>
parents: 3597
diff changeset
126 selected = 'tag:tip:%s' % repo.tags['tip']
7d774f09dba5 pullrequests: only create special select entry for a changeset if it has no symbolic name
Mads Kiilerich <madski@unity3d.com>
parents: 3597
diff changeset
127
7d774f09dba5 pullrequests: only create special select entry for a changeset if it has no symbolic name
Mads Kiilerich <madski@unity3d.com>
parents: 3597
diff changeset
128 groups = [(specials, _("Special")),
7d774f09dba5 pullrequests: only create special select entry for a changeset if it has no symbolic name
Mads Kiilerich <madski@unity3d.com>
parents: 3597
diff changeset
129 (peers, _("Peer branches")),
7d774f09dba5 pullrequests: only create special select entry for a changeset if it has no symbolic name
Mads Kiilerich <madski@unity3d.com>
parents: 3597
diff changeset
130 (bookmarks, _("Bookmarks")),
7d774f09dba5 pullrequests: only create special select entry for a changeset if it has no symbolic name
Mads Kiilerich <madski@unity3d.com>
parents: 3597
diff changeset
131 (branches, _("Branches")),
7d774f09dba5 pullrequests: only create special select entry for a changeset if it has no symbolic name
Mads Kiilerich <madski@unity3d.com>
parents: 3597
diff changeset
132 (tags, _("Tags")),
7d774f09dba5 pullrequests: only create special select entry for a changeset if it has no symbolic name
Mads Kiilerich <madski@unity3d.com>
parents: 3597
diff changeset
133 ]
7d774f09dba5 pullrequests: only create special select entry for a changeset if it has no symbolic name
Mads Kiilerich <madski@unity3d.com>
parents: 3597
diff changeset
134 return [g for g in groups if g[0]], selected
2849
2b672f04bfd9 fixed few issues with autoselection of revisions on pull requests
Marcin Kuzminski <marcin@python-works.com>
parents: 2803
diff changeset
135
3104
c77d5c6358eb Implemented #670 Implementation of Roles in Pull Request
Marcin Kuzminski <marcin@python-works.com>
parents: 3103
diff changeset
136 def _get_is_allowed_change_status(self, pull_request):
3149
68f9c216377d white space cleanup
Marcin Kuzminski <marcin@python-works.com>
parents: 3141
diff changeset
137 owner = self.rhodecode_user.user_id == pull_request.user_id
3104
c77d5c6358eb Implemented #670 Implementation of Roles in Pull Request
Marcin Kuzminski <marcin@python-works.com>
parents: 3103
diff changeset
138 reviewer = self.rhodecode_user.user_id in [x.user_id for x in
c77d5c6358eb Implemented #670 Implementation of Roles in Pull Request
Marcin Kuzminski <marcin@python-works.com>
parents: 3103
diff changeset
139 pull_request.reviewers]
c77d5c6358eb Implemented #670 Implementation of Roles in Pull Request
Marcin Kuzminski <marcin@python-works.com>
parents: 3103
diff changeset
140 return (self.rhodecode_user.admin or owner or reviewer)
c77d5c6358eb Implemented #670 Implementation of Roles in Pull Request
Marcin Kuzminski <marcin@python-works.com>
parents: 3103
diff changeset
141
2440
1bc579bcd67a - pull request generates overview based on it's params
Marcin Kuzminski <marcin@python-works.com>
parents: 2434
diff changeset
142 def show_all(self, repo_name):
1bc579bcd67a - pull request generates overview based on it's params
Marcin Kuzminski <marcin@python-works.com>
parents: 2434
diff changeset
143 c.pull_requests = PullRequestModel().get_all(repo_name)
1bc579bcd67a - pull request generates overview based on it's params
Marcin Kuzminski <marcin@python-works.com>
parents: 2434
diff changeset
144 c.repo_name = repo_name
3676
9d2db665ef31 pagination in pull-requests page + UI
Marcin Kuzminski <marcin@python-works.com>
parents: 3654
diff changeset
145 p = safe_int(request.params.get('page', 1), 1)
9d2db665ef31 pagination in pull-requests page + UI
Marcin Kuzminski <marcin@python-works.com>
parents: 3654
diff changeset
146
9d2db665ef31 pagination in pull-requests page + UI
Marcin Kuzminski <marcin@python-works.com>
parents: 3654
diff changeset
147 c.pullrequests_pager = Page(c.pull_requests, page=p, items_per_page=10)
9d2db665ef31 pagination in pull-requests page + UI
Marcin Kuzminski <marcin@python-works.com>
parents: 3654
diff changeset
148
9d2db665ef31 pagination in pull-requests page + UI
Marcin Kuzminski <marcin@python-works.com>
parents: 3654
diff changeset
149 c.pullrequest_data = render('/pullrequests/pullrequest_data.html')
9d2db665ef31 pagination in pull-requests page + UI
Marcin Kuzminski <marcin@python-works.com>
parents: 3654
diff changeset
150
9d2db665ef31 pagination in pull-requests page + UI
Marcin Kuzminski <marcin@python-works.com>
parents: 3654
diff changeset
151 if request.environ.get('HTTP_X_PARTIAL_XHR'):
9d2db665ef31 pagination in pull-requests page + UI
Marcin Kuzminski <marcin@python-works.com>
parents: 3654
diff changeset
152 return c.pullrequest_data
9d2db665ef31 pagination in pull-requests page + UI
Marcin Kuzminski <marcin@python-works.com>
parents: 3654
diff changeset
153
2440
1bc579bcd67a - pull request generates overview based on it's params
Marcin Kuzminski <marcin@python-works.com>
parents: 2434
diff changeset
154 return render('/pullrequests/pullrequest_show_all.html')
1bc579bcd67a - pull request generates overview based on it's params
Marcin Kuzminski <marcin@python-works.com>
parents: 2434
diff changeset
155
2627
6bd62617b99f Opening pull request shouldn't be accessible by anonymous users
Marcin Kuzminski <marcin@python-works.com>
parents: 2614
diff changeset
156 @NotAnonymous()
2244
77e376fdc4c6 pull requests draft UI
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
157 def index(self):
2395
b262e349a7a5 created pull-request overview
Marcin Kuzminski <marcin@python-works.com>
parents: 2244
diff changeset
158 org_repo = c.rhodecode_db_repo
2444
b45e9fd75ac0 data checks
Marcin Kuzminski <marcin@python-works.com>
parents: 2443
diff changeset
159
b45e9fd75ac0 data checks
Marcin Kuzminski <marcin@python-works.com>
parents: 2443
diff changeset
160 if org_repo.scm_instance.alias != 'hg':
b45e9fd75ac0 data checks
Marcin Kuzminski <marcin@python-works.com>
parents: 2443
diff changeset
161 log.error('Review not available for GIT REPOS')
b45e9fd75ac0 data checks
Marcin Kuzminski <marcin@python-works.com>
parents: 2443
diff changeset
162 raise HTTPNotFound
b45e9fd75ac0 data checks
Marcin Kuzminski <marcin@python-works.com>
parents: 2443
diff changeset
163
2874
95923493de9a protect agains pull requests on empty repositories
Marcin Kuzminski <marcin@python-works.com>
parents: 2849
diff changeset
164 try:
95923493de9a protect agains pull requests on empty repositories
Marcin Kuzminski <marcin@python-works.com>
parents: 2849
diff changeset
165 org_repo.scm_instance.get_changeset()
95923493de9a protect agains pull requests on empty repositories
Marcin Kuzminski <marcin@python-works.com>
parents: 2849
diff changeset
166 except EmptyRepositoryError, e:
95923493de9a protect agains pull requests on empty repositories
Marcin Kuzminski <marcin@python-works.com>
parents: 2849
diff changeset
167 h.flash(h.literal(_('There are no changesets yet')),
95923493de9a protect agains pull requests on empty repositories
Marcin Kuzminski <marcin@python-works.com>
parents: 2849
diff changeset
168 category='warning')
95923493de9a protect agains pull requests on empty repositories
Marcin Kuzminski <marcin@python-works.com>
parents: 2849
diff changeset
169 redirect(url('summary_home', repo_name=org_repo.repo_name))
95923493de9a protect agains pull requests on empty repositories
Marcin Kuzminski <marcin@python-works.com>
parents: 2849
diff changeset
170
3485
b19b1723ff10 pullrequest: pullrequest from changelog view
Mads Kiilerich <madski@unity3d.com>
parents: 3484
diff changeset
171 org_rev = request.GET.get('rev_end')
b19b1723ff10 pullrequest: pullrequest from changelog view
Mads Kiilerich <madski@unity3d.com>
parents: 3484
diff changeset
172 # rev_start is not directly useful - its parent could however be used
b19b1723ff10 pullrequest: pullrequest from changelog view
Mads Kiilerich <madski@unity3d.com>
parents: 3484
diff changeset
173 # as default for other and thus give a simple compare view
b19b1723ff10 pullrequest: pullrequest from changelog view
Mads Kiilerich <madski@unity3d.com>
parents: 3484
diff changeset
174 #other_rev = request.POST.get('rev_start')
b19b1723ff10 pullrequest: pullrequest from changelog view
Mads Kiilerich <madski@unity3d.com>
parents: 3484
diff changeset
175
2395
b262e349a7a5 created pull-request overview
Marcin Kuzminski <marcin@python-works.com>
parents: 2244
diff changeset
176 c.org_repos = []
3330
dcd1c159a132 pull request: don't show fake path with owner names - and owner avatars is also not relevant
Mads Kiilerich <madski@unity3d.com>
parents: 3329
diff changeset
177 c.org_repos.append((org_repo.repo_name, org_repo.repo_name))
3329
f8c55b487c9a pull request: select 'tip' by default ... and show what it means right now
Mads Kiilerich <madski@unity3d.com>
parents: 3328
diff changeset
178 c.default_org_repo = org_repo.repo_name
3485
b19b1723ff10 pullrequest: pullrequest from changelog view
Mads Kiilerich <madski@unity3d.com>
parents: 3484
diff changeset
179 c.org_refs, c.default_org_ref = self._get_repo_refs(org_repo.scm_instance, org_rev)
2541
1c2ba03c42b4 Added dynamic data loading for other repo we open pull request against
Marcin Kuzminski <marcin@python-works.com>
parents: 2533
diff changeset
180
3327
f285faa3a602 pull request: move code around and rename default variables
Mads Kiilerich <madski@unity3d.com>
parents: 3324
diff changeset
181 c.other_repos = []
3597
54e011cb21fd pullrequests: cleanup of other_repo initialization code
Mads Kiilerich <madski@unity3d.com>
parents: 3596
diff changeset
182 other_repos_info = {}
54e011cb21fd pullrequests: cleanup of other_repo initialization code
Mads Kiilerich <madski@unity3d.com>
parents: 3596
diff changeset
183
54e011cb21fd pullrequests: cleanup of other_repo initialization code
Mads Kiilerich <madski@unity3d.com>
parents: 3596
diff changeset
184 def add_other_repo(repo, branch_rev=None):
54e011cb21fd pullrequests: cleanup of other_repo initialization code
Mads Kiilerich <madski@unity3d.com>
parents: 3596
diff changeset
185 if repo.repo_name in other_repos_info: # shouldn't happen
54e011cb21fd pullrequests: cleanup of other_repo initialization code
Mads Kiilerich <madski@unity3d.com>
parents: 3596
diff changeset
186 return
54e011cb21fd pullrequests: cleanup of other_repo initialization code
Mads Kiilerich <madski@unity3d.com>
parents: 3596
diff changeset
187 c.other_repos.append((repo.repo_name, repo.repo_name))
54e011cb21fd pullrequests: cleanup of other_repo initialization code
Mads Kiilerich <madski@unity3d.com>
parents: 3596
diff changeset
188 other_refs, selected_other_ref = self._get_repo_refs(repo.scm_instance, branch_rev=branch_rev)
54e011cb21fd pullrequests: cleanup of other_repo initialization code
Mads Kiilerich <madski@unity3d.com>
parents: 3596
diff changeset
189 other_repos_info[repo.repo_name] = {
54e011cb21fd pullrequests: cleanup of other_repo initialization code
Mads Kiilerich <madski@unity3d.com>
parents: 3596
diff changeset
190 'user': dict(user_id=repo.user.user_id,
54e011cb21fd pullrequests: cleanup of other_repo initialization code
Mads Kiilerich <madski@unity3d.com>
parents: 3596
diff changeset
191 username=repo.user.username,
54e011cb21fd pullrequests: cleanup of other_repo initialization code
Mads Kiilerich <madski@unity3d.com>
parents: 3596
diff changeset
192 firstname=repo.user.firstname,
54e011cb21fd pullrequests: cleanup of other_repo initialization code
Mads Kiilerich <madski@unity3d.com>
parents: 3596
diff changeset
193 lastname=repo.user.lastname,
54e011cb21fd pullrequests: cleanup of other_repo initialization code
Mads Kiilerich <madski@unity3d.com>
parents: 3596
diff changeset
194 gravatar_link=h.gravatar_url(repo.user.email, 14)),
3604
ceb6d57d1998 pullrequests: just show first line of description as hint
Mads Kiilerich <madski@unity3d.com>
parents: 3598
diff changeset
195 'description': repo.description.split('\n', 1)[0],
3597
54e011cb21fd pullrequests: cleanup of other_repo initialization code
Mads Kiilerich <madski@unity3d.com>
parents: 3596
diff changeset
196 'revs': h.select('other_ref', selected_other_ref, other_refs, class_='refs')
54e011cb21fd pullrequests: cleanup of other_repo initialization code
Mads Kiilerich <madski@unity3d.com>
parents: 3596
diff changeset
197 }
54e011cb21fd pullrequests: cleanup of other_repo initialization code
Mads Kiilerich <madski@unity3d.com>
parents: 3596
diff changeset
198
54e011cb21fd pullrequests: cleanup of other_repo initialization code
Mads Kiilerich <madski@unity3d.com>
parents: 3596
diff changeset
199 # add org repo to other so we can open pull request against peer branches on itself
54e011cb21fd pullrequests: cleanup of other_repo initialization code
Mads Kiilerich <madski@unity3d.com>
parents: 3596
diff changeset
200 add_other_repo(org_repo, branch_rev=org_rev)
3327
f285faa3a602 pull request: move code around and rename default variables
Mads Kiilerich <madski@unity3d.com>
parents: 3324
diff changeset
201 c.default_other_repo = org_repo.repo_name
2541
1c2ba03c42b4 Added dynamic data loading for other repo we open pull request against
Marcin Kuzminski <marcin@python-works.com>
parents: 2533
diff changeset
202
3394
fe2bb88bf7ac whitespace cleanup
Marcin Kuzminski <marcin@python-works.com>
parents: 3388
diff changeset
203 # gather forks and add to this list ... even though it is rare to
3595
9bc052942640 pullrequests: fix non-js defaults for repo owner
Mads Kiilerich <madski@unity3d.com>
parents: 3515
diff changeset
204 # request forks to pull from their parent
2395
b262e349a7a5 created pull-request overview
Marcin Kuzminski <marcin@python-works.com>
parents: 2244
diff changeset
205 for fork in org_repo.forks:
3597
54e011cb21fd pullrequests: cleanup of other_repo initialization code
Mads Kiilerich <madski@unity3d.com>
parents: 3596
diff changeset
206 add_other_repo(fork)
3327
f285faa3a602 pull request: move code around and rename default variables
Mads Kiilerich <madski@unity3d.com>
parents: 3324
diff changeset
207
f285faa3a602 pull request: move code around and rename default variables
Mads Kiilerich <madski@unity3d.com>
parents: 3324
diff changeset
208 # add parents of this fork also, but only if it's not empty
2933
07d620f6db2e pull requests throw an error if parent of fork didn't have any changesets yet. Now it's filter out from list of available sources
Marcin Kuzminski <marcin@python-works.com>
parents: 2893
diff changeset
209 if org_repo.parent and org_repo.parent.scm_instance.revisions:
3597
54e011cb21fd pullrequests: cleanup of other_repo initialization code
Mads Kiilerich <madski@unity3d.com>
parents: 3596
diff changeset
210 add_other_repo(org_repo.parent)
3327
f285faa3a602 pull request: move code around and rename default variables
Mads Kiilerich <madski@unity3d.com>
parents: 3324
diff changeset
211 c.default_other_repo = org_repo.parent.repo_name
2395
b262e349a7a5 created pull-request overview
Marcin Kuzminski <marcin@python-works.com>
parents: 2244
diff changeset
212
3595
9bc052942640 pullrequests: fix non-js defaults for repo owner
Mads Kiilerich <madski@unity3d.com>
parents: 3515
diff changeset
213 c.default_other_repo_info = other_repos_info[c.default_other_repo]
2541
1c2ba03c42b4 Added dynamic data loading for other repo we open pull request against
Marcin Kuzminski <marcin@python-works.com>
parents: 2533
diff changeset
214 c.other_repos_info = json.dumps(other_repos_info)
3676
9d2db665ef31 pagination in pull-requests page + UI
Marcin Kuzminski <marcin@python-works.com>
parents: 3654
diff changeset
215
2244
77e376fdc4c6 pull requests draft UI
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
216 return render('/pullrequests/pullrequest.html')
2434
f29469677319 Added basic models for saving open pull requests
Marcin Kuzminski <marcin@python-works.com>
parents: 2395
diff changeset
217
2612
9364776d1331 Added autocomplete widget for pull request reviewers, in exchange of 90s style
Marcin Kuzminski <marcin@python-works.com>
parents: 2608
diff changeset
218 @NotAnonymous()
2434
f29469677319 Added basic models for saving open pull requests
Marcin Kuzminski <marcin@python-works.com>
parents: 2395
diff changeset
219 def create(self, repo_name):
2893
eb180eb16c18 Fixed #585, checks for status of revision where to strict, and made opening pull request with those revision impossible due to previosly set status.
Marcin Kuzminski <marcin@python-works.com>
parents: 2892
diff changeset
220 repo = RepoModel()._get_repo(repo_name)
2711
1de45f582f9d added more validations when opening pull request
Marcin Kuzminski <marcin@python-works.com>
parents: 2627
diff changeset
221 try:
2893
eb180eb16c18 Fixed #585, checks for status of revision where to strict, and made opening pull request with those revision impossible due to previosly set status.
Marcin Kuzminski <marcin@python-works.com>
parents: 2892
diff changeset
222 _form = PullRequestForm(repo.repo_id)().to_python(request.POST)
2711
1de45f582f9d added more validations when opening pull request
Marcin Kuzminski <marcin@python-works.com>
parents: 2627
diff changeset
223 except formencode.Invalid, errors:
1de45f582f9d added more validations when opening pull request
Marcin Kuzminski <marcin@python-works.com>
parents: 2627
diff changeset
224 log.error(traceback.format_exc())
1de45f582f9d added more validations when opening pull request
Marcin Kuzminski <marcin@python-works.com>
parents: 2627
diff changeset
225 if errors.error_dict.get('revisions'):
2720
0f7355d3c196 Load generated revs while switching to other sources of pull-requests.
Marcin Kuzminski <marcin@python-works.com>
parents: 2712
diff changeset
226 msg = 'Revisions: %s' % errors.error_dict['revisions']
2711
1de45f582f9d added more validations when opening pull request
Marcin Kuzminski <marcin@python-works.com>
parents: 2627
diff changeset
227 elif errors.error_dict.get('pullrequest_title'):
1de45f582f9d added more validations when opening pull request
Marcin Kuzminski <marcin@python-works.com>
parents: 2627
diff changeset
228 msg = _('Pull request requires a title with min. 3 chars')
1de45f582f9d added more validations when opening pull request
Marcin Kuzminski <marcin@python-works.com>
parents: 2627
diff changeset
229 else:
3654
ec6354949623 Fix a lot of casings - use standard casing in most places
Mads Kiilerich <madski@unity3d.com>
parents: 3631
diff changeset
230 msg = _('Error creating pull request')
2612
9364776d1331 Added autocomplete widget for pull request reviewers, in exchange of 90s style
Marcin Kuzminski <marcin@python-works.com>
parents: 2608
diff changeset
231
2711
1de45f582f9d added more validations when opening pull request
Marcin Kuzminski <marcin@python-works.com>
parents: 2627
diff changeset
232 h.flash(msg, 'error')
1de45f582f9d added more validations when opening pull request
Marcin Kuzminski <marcin@python-works.com>
parents: 2627
diff changeset
233 return redirect(url('pullrequest_home', repo_name=repo_name))
2434
f29469677319 Added basic models for saving open pull requests
Marcin Kuzminski <marcin@python-works.com>
parents: 2395
diff changeset
234
2711
1de45f582f9d added more validations when opening pull request
Marcin Kuzminski <marcin@python-works.com>
parents: 2627
diff changeset
235 org_repo = _form['org_repo']
3486
2053053e0882 compare/pullrequest: introduce merge parameter
Mads Kiilerich <madski@unity3d.com>
parents: 3485
diff changeset
236 org_ref = 'rev:merge:%s' % _form['merge_rev']
2711
1de45f582f9d added more validations when opening pull request
Marcin Kuzminski <marcin@python-works.com>
parents: 2627
diff changeset
237 other_repo = _form['other_repo']
3486
2053053e0882 compare/pullrequest: introduce merge parameter
Mads Kiilerich <madski@unity3d.com>
parents: 3485
diff changeset
238 other_ref = 'rev:ancestor:%s' % _form['ancestor_rev']
2711
1de45f582f9d added more validations when opening pull request
Marcin Kuzminski <marcin@python-works.com>
parents: 2627
diff changeset
239 revisions = _form['revisions']
1de45f582f9d added more validations when opening pull request
Marcin Kuzminski <marcin@python-works.com>
parents: 2627
diff changeset
240 reviewers = _form['review_members']
1de45f582f9d added more validations when opening pull request
Marcin Kuzminski <marcin@python-works.com>
parents: 2627
diff changeset
241
1de45f582f9d added more validations when opening pull request
Marcin Kuzminski <marcin@python-works.com>
parents: 2627
diff changeset
242 title = _form['pullrequest_title']
1de45f582f9d added more validations when opening pull request
Marcin Kuzminski <marcin@python-works.com>
parents: 2627
diff changeset
243 description = _form['pullrequest_desc']
2434
f29469677319 Added basic models for saving open pull requests
Marcin Kuzminski <marcin@python-works.com>
parents: 2395
diff changeset
244
f29469677319 Added basic models for saving open pull requests
Marcin Kuzminski <marcin@python-works.com>
parents: 2395
diff changeset
245 try:
2541
1c2ba03c42b4 Added dynamic data loading for other repo we open pull request against
Marcin Kuzminski <marcin@python-works.com>
parents: 2533
diff changeset
246 pull_request = PullRequestModel().create(
1c2ba03c42b4 Added dynamic data loading for other repo we open pull request against
Marcin Kuzminski <marcin@python-works.com>
parents: 2533
diff changeset
247 self.rhodecode_user.user_id, org_repo, org_ref, other_repo,
1c2ba03c42b4 Added dynamic data loading for other repo we open pull request against
Marcin Kuzminski <marcin@python-works.com>
parents: 2533
diff changeset
248 other_ref, revisions, reviewers, title, description
1c2ba03c42b4 Added dynamic data loading for other repo we open pull request against
Marcin Kuzminski <marcin@python-works.com>
parents: 2533
diff changeset
249 )
1c2ba03c42b4 Added dynamic data loading for other repo we open pull request against
Marcin Kuzminski <marcin@python-works.com>
parents: 2533
diff changeset
250 Session().commit()
2533
5a826060251f redirect to pull-request overview after creation
Marcin Kuzminski <marcin@python-works.com>
parents: 2496
diff changeset
251 h.flash(_('Successfully opened new pull request'),
5a826060251f redirect to pull-request overview after creation
Marcin Kuzminski <marcin@python-works.com>
parents: 2496
diff changeset
252 category='success')
2434
f29469677319 Added basic models for saving open pull requests
Marcin Kuzminski <marcin@python-works.com>
parents: 2395
diff changeset
253 except Exception:
2533
5a826060251f redirect to pull-request overview after creation
Marcin Kuzminski <marcin@python-works.com>
parents: 2496
diff changeset
254 h.flash(_('Error occurred during sending pull request'),
2434
f29469677319 Added basic models for saving open pull requests
Marcin Kuzminski <marcin@python-works.com>
parents: 2395
diff changeset
255 category='error')
f29469677319 Added basic models for saving open pull requests
Marcin Kuzminski <marcin@python-works.com>
parents: 2395
diff changeset
256 log.error(traceback.format_exc())
2711
1de45f582f9d added more validations when opening pull request
Marcin Kuzminski <marcin@python-works.com>
parents: 2627
diff changeset
257 return redirect(url('pullrequest_home', repo_name=repo_name))
2434
f29469677319 Added basic models for saving open pull requests
Marcin Kuzminski <marcin@python-works.com>
parents: 2395
diff changeset
258
2533
5a826060251f redirect to pull-request overview after creation
Marcin Kuzminski <marcin@python-works.com>
parents: 2496
diff changeset
259 return redirect(url('pullrequest_show', repo_name=other_repo,
5a826060251f redirect to pull-request overview after creation
Marcin Kuzminski <marcin@python-works.com>
parents: 2496
diff changeset
260 pull_request_id=pull_request.pull_request_id))
2434
f29469677319 Added basic models for saving open pull requests
Marcin Kuzminski <marcin@python-works.com>
parents: 2395
diff changeset
261
2614
3f50a5e8fc4d Added editing of pull-request reviewers.
Marcin Kuzminski <marcin@python-works.com>
parents: 2612
diff changeset
262 @NotAnonymous()
3f50a5e8fc4d Added editing of pull-request reviewers.
Marcin Kuzminski <marcin@python-works.com>
parents: 2612
diff changeset
263 @jsonify
3f50a5e8fc4d Added editing of pull-request reviewers.
Marcin Kuzminski <marcin@python-works.com>
parents: 2612
diff changeset
264 def update(self, repo_name, pull_request_id):
3f50a5e8fc4d Added editing of pull-request reviewers.
Marcin Kuzminski <marcin@python-works.com>
parents: 2612
diff changeset
265 pull_request = PullRequest.get_or_404(pull_request_id)
3f50a5e8fc4d Added editing of pull-request reviewers.
Marcin Kuzminski <marcin@python-works.com>
parents: 2612
diff changeset
266 if pull_request.is_closed():
3f50a5e8fc4d Added editing of pull-request reviewers.
Marcin Kuzminski <marcin@python-works.com>
parents: 2612
diff changeset
267 raise HTTPForbidden()
2769
52617fb79010 typos+docs.
Marcin Kuzminski <marcin@python-works.com>
parents: 2746
diff changeset
268 #only owner or admin can update it
52617fb79010 typos+docs.
Marcin Kuzminski <marcin@python-works.com>
parents: 2746
diff changeset
269 owner = pull_request.author.user_id == c.rhodecode_user.user_id
52617fb79010 typos+docs.
Marcin Kuzminski <marcin@python-works.com>
parents: 2746
diff changeset
270 if h.HasPermissionAny('hg.admin', 'repository.admin')() or owner:
52617fb79010 typos+docs.
Marcin Kuzminski <marcin@python-works.com>
parents: 2746
diff changeset
271 reviewers_ids = map(int, filter(lambda v: v not in [None, ''],
52617fb79010 typos+docs.
Marcin Kuzminski <marcin@python-works.com>
parents: 2746
diff changeset
272 request.POST.get('reviewers_ids', '').split(',')))
2712
7224882c4059 new summary for opened pull requests
Marcin Kuzminski <marcin@python-works.com>
parents: 2711
diff changeset
273
2769
52617fb79010 typos+docs.
Marcin Kuzminski <marcin@python-works.com>
parents: 2746
diff changeset
274 PullRequestModel().update_reviewers(pull_request_id, reviewers_ids)
3023
c2a206162062 Basic implementation of cherry picking changesets
Marcin Kuzminski <marcin@python-works.com>
parents: 3015
diff changeset
275 Session().commit()
2769
52617fb79010 typos+docs.
Marcin Kuzminski <marcin@python-works.com>
parents: 2746
diff changeset
276 return True
52617fb79010 typos+docs.
Marcin Kuzminski <marcin@python-works.com>
parents: 2746
diff changeset
277 raise HTTPForbidden()
2614
3f50a5e8fc4d Added editing of pull-request reviewers.
Marcin Kuzminski <marcin@python-works.com>
parents: 2612
diff changeset
278
2746
49a4864b11c1 Authors of pull-requests can now delete them
Marcin Kuzminski <marcin@python-works.com>
parents: 2720
diff changeset
279 @NotAnonymous()
49a4864b11c1 Authors of pull-requests can now delete them
Marcin Kuzminski <marcin@python-works.com>
parents: 2720
diff changeset
280 @jsonify
49a4864b11c1 Authors of pull-requests can now delete them
Marcin Kuzminski <marcin@python-works.com>
parents: 2720
diff changeset
281 def delete(self, repo_name, pull_request_id):
49a4864b11c1 Authors of pull-requests can now delete them
Marcin Kuzminski <marcin@python-works.com>
parents: 2720
diff changeset
282 pull_request = PullRequest.get_or_404(pull_request_id)
49a4864b11c1 Authors of pull-requests can now delete them
Marcin Kuzminski <marcin@python-works.com>
parents: 2720
diff changeset
283 #only owner can delete it !
49a4864b11c1 Authors of pull-requests can now delete them
Marcin Kuzminski <marcin@python-works.com>
parents: 2720
diff changeset
284 if pull_request.author.user_id == c.rhodecode_user.user_id:
49a4864b11c1 Authors of pull-requests can now delete them
Marcin Kuzminski <marcin@python-works.com>
parents: 2720
diff changeset
285 PullRequestModel().delete(pull_request)
49a4864b11c1 Authors of pull-requests can now delete them
Marcin Kuzminski <marcin@python-works.com>
parents: 2720
diff changeset
286 Session().commit()
49a4864b11c1 Authors of pull-requests can now delete them
Marcin Kuzminski <marcin@python-works.com>
parents: 2720
diff changeset
287 h.flash(_('Successfully deleted pull request'),
49a4864b11c1 Authors of pull-requests can now delete them
Marcin Kuzminski <marcin@python-works.com>
parents: 2720
diff changeset
288 category='success')
3023
c2a206162062 Basic implementation of cherry picking changesets
Marcin Kuzminski <marcin@python-works.com>
parents: 3015
diff changeset
289 return redirect(url('admin_settings_my_account', anchor='pullrequests'))
2769
52617fb79010 typos+docs.
Marcin Kuzminski <marcin@python-works.com>
parents: 2746
diff changeset
290 raise HTTPForbidden()
2746
49a4864b11c1 Authors of pull-requests can now delete them
Marcin Kuzminski <marcin@python-works.com>
parents: 2720
diff changeset
291
2608
58c529332e7e Added option to close pull requests, in future that will be close & merge
Marcin Kuzminski <marcin@python-works.com>
parents: 2570
diff changeset
292 def _load_compare_data(self, pull_request, enable_comments=True):
2442
3bf057a7f7e8 small refactoring, moved shared for diff generation of code into pull-request model
Marcin Kuzminski <marcin@python-works.com>
parents: 2440
diff changeset
293 """
3bf057a7f7e8 small refactoring, moved shared for diff generation of code into pull-request model
Marcin Kuzminski <marcin@python-works.com>
parents: 2440
diff changeset
294 Load context data needed for generating compare diff
2440
1bc579bcd67a - pull request generates overview based on it's params
Marcin Kuzminski <marcin@python-works.com>
parents: 2434
diff changeset
295
2442
3bf057a7f7e8 small refactoring, moved shared for diff generation of code into pull-request model
Marcin Kuzminski <marcin@python-works.com>
parents: 2440
diff changeset
296 :param pull_request:
3bf057a7f7e8 small refactoring, moved shared for diff generation of code into pull-request model
Marcin Kuzminski <marcin@python-works.com>
parents: 2440
diff changeset
297 :type pull_request:
3bf057a7f7e8 small refactoring, moved shared for diff generation of code into pull-request model
Marcin Kuzminski <marcin@python-works.com>
parents: 2440
diff changeset
298 """
2440
1bc579bcd67a - pull request generates overview based on it's params
Marcin Kuzminski <marcin@python-works.com>
parents: 2434
diff changeset
299 org_repo = pull_request.org_repo
2711
1de45f582f9d added more validations when opening pull request
Marcin Kuzminski <marcin@python-works.com>
parents: 2627
diff changeset
300 (org_ref_type,
1de45f582f9d added more validations when opening pull request
Marcin Kuzminski <marcin@python-works.com>
parents: 2627
diff changeset
301 org_ref_name,
1de45f582f9d added more validations when opening pull request
Marcin Kuzminski <marcin@python-works.com>
parents: 2627
diff changeset
302 org_ref_rev) = pull_request.org_ref.split(':')
1de45f582f9d added more validations when opening pull request
Marcin Kuzminski <marcin@python-works.com>
parents: 2627
diff changeset
303
3023
c2a206162062 Basic implementation of cherry picking changesets
Marcin Kuzminski <marcin@python-works.com>
parents: 3015
diff changeset
304 other_repo = org_repo
2711
1de45f582f9d added more validations when opening pull request
Marcin Kuzminski <marcin@python-works.com>
parents: 2627
diff changeset
305 (other_ref_type,
1de45f582f9d added more validations when opening pull request
Marcin Kuzminski <marcin@python-works.com>
parents: 2627
diff changeset
306 other_ref_name,
1de45f582f9d added more validations when opening pull request
Marcin Kuzminski <marcin@python-works.com>
parents: 2627
diff changeset
307 other_ref_rev) = pull_request.other_ref.split(':')
2440
1bc579bcd67a - pull request generates overview based on it's params
Marcin Kuzminski <marcin@python-works.com>
parents: 2434
diff changeset
308
2720
0f7355d3c196 Load generated revs while switching to other sources of pull-requests.
Marcin Kuzminski <marcin@python-works.com>
parents: 2712
diff changeset
309 # despite opening revisions for bookmarks/branches/tags, we always
3484
75e563531350 compare: drop unused rev_start and rev_end
Mads Kiilerich <madski@unity3d.com>
parents: 3447
diff changeset
310 # convert this to rev to prevent changes after bookmark or branch change
2711
1de45f582f9d added more validations when opening pull request
Marcin Kuzminski <marcin@python-works.com>
parents: 2627
diff changeset
311 org_ref = ('rev', org_ref_rev)
1de45f582f9d added more validations when opening pull request
Marcin Kuzminski <marcin@python-works.com>
parents: 2627
diff changeset
312 other_ref = ('rev', other_ref_rev)
2440
1bc579bcd67a - pull request generates overview based on it's params
Marcin Kuzminski <marcin@python-works.com>
parents: 2434
diff changeset
313
1bc579bcd67a - pull request generates overview based on it's params
Marcin Kuzminski <marcin@python-works.com>
parents: 2434
diff changeset
314 c.org_repo = org_repo
1bc579bcd67a - pull request generates overview based on it's params
Marcin Kuzminski <marcin@python-works.com>
parents: 2434
diff changeset
315 c.other_repo = other_repo
1bc579bcd67a - pull request generates overview based on it's params
Marcin Kuzminski <marcin@python-works.com>
parents: 2434
diff changeset
316
3023
c2a206162062 Basic implementation of cherry picking changesets
Marcin Kuzminski <marcin@python-works.com>
parents: 3015
diff changeset
317 c.fulldiff = fulldiff = request.GET.get('fulldiff')
c2a206162062 Basic implementation of cherry picking changesets
Marcin Kuzminski <marcin@python-works.com>
parents: 3015
diff changeset
318
c2a206162062 Basic implementation of cherry picking changesets
Marcin Kuzminski <marcin@python-works.com>
parents: 3015
diff changeset
319 c.cs_ranges = [org_repo.get_changeset(x) for x in pull_request.revisions]
c2a206162062 Basic implementation of cherry picking changesets
Marcin Kuzminski <marcin@python-works.com>
parents: 3015
diff changeset
320
2803
0b2214604c74 Fixed status of changesets in preview windows
Marcin Kuzminski <marcin@python-works.com>
parents: 2796
diff changeset
321 c.statuses = org_repo.statuses([x.raw_id for x in c.cs_ranges])
2440
1bc579bcd67a - pull request generates overview based on it's params
Marcin Kuzminski <marcin@python-works.com>
parents: 2434
diff changeset
322
1bc579bcd67a - pull request generates overview based on it's params
Marcin Kuzminski <marcin@python-works.com>
parents: 2434
diff changeset
323 c.org_ref = org_ref[1]
3357
674a8fad3abc show links to files on compare data at other and org refs
Marcin Kuzminski <marcin@python-works.com>
parents: 3330
diff changeset
324 c.org_ref_type = org_ref[0]
2440
1bc579bcd67a - pull request generates overview based on it's params
Marcin Kuzminski <marcin@python-works.com>
parents: 2434
diff changeset
325 c.other_ref = other_ref[1]
3357
674a8fad3abc show links to files on compare data at other and org refs
Marcin Kuzminski <marcin@python-works.com>
parents: 3330
diff changeset
326 c.other_ref_type = other_ref[0]
3023
c2a206162062 Basic implementation of cherry picking changesets
Marcin Kuzminski <marcin@python-works.com>
parents: 3015
diff changeset
327
c2a206162062 Basic implementation of cherry picking changesets
Marcin Kuzminski <marcin@python-works.com>
parents: 3015
diff changeset
328 diff_limit = self.cut_off_limit if not fulldiff else None
c2a206162062 Basic implementation of cherry picking changesets
Marcin Kuzminski <marcin@python-works.com>
parents: 3015
diff changeset
329
c2a206162062 Basic implementation of cherry picking changesets
Marcin Kuzminski <marcin@python-works.com>
parents: 3015
diff changeset
330 #we swap org/other ref since we run a simple diff on one repo
c2a206162062 Basic implementation of cherry picking changesets
Marcin Kuzminski <marcin@python-works.com>
parents: 3015
diff changeset
331 _diff = diffs.differ(org_repo, other_ref, other_repo, org_ref)
3015
16af24982e30 Multiple changes for compare system
Marcin Kuzminski <marcin@python-works.com>
parents: 2995
diff changeset
332
3023
c2a206162062 Basic implementation of cherry picking changesets
Marcin Kuzminski <marcin@python-works.com>
parents: 3015
diff changeset
333 diff_processor = diffs.DiffProcessor(_diff or '', format='gitdiff',
c2a206162062 Basic implementation of cherry picking changesets
Marcin Kuzminski <marcin@python-works.com>
parents: 3015
diff changeset
334 diff_limit=diff_limit)
2440
1bc579bcd67a - pull request generates overview based on it's params
Marcin Kuzminski <marcin@python-works.com>
parents: 2434
diff changeset
335 _parsed = diff_processor.prepare()
1bc579bcd67a - pull request generates overview based on it's params
Marcin Kuzminski <marcin@python-works.com>
parents: 2434
diff changeset
336
3023
c2a206162062 Basic implementation of cherry picking changesets
Marcin Kuzminski <marcin@python-works.com>
parents: 3015
diff changeset
337 c.limited_diff = False
c2a206162062 Basic implementation of cherry picking changesets
Marcin Kuzminski <marcin@python-works.com>
parents: 3015
diff changeset
338 if isinstance(_parsed, LimitedDiffContainer):
c2a206162062 Basic implementation of cherry picking changesets
Marcin Kuzminski <marcin@python-works.com>
parents: 3015
diff changeset
339 c.limited_diff = True
c2a206162062 Basic implementation of cherry picking changesets
Marcin Kuzminski <marcin@python-works.com>
parents: 3015
diff changeset
340
2440
1bc579bcd67a - pull request generates overview based on it's params
Marcin Kuzminski <marcin@python-works.com>
parents: 2434
diff changeset
341 c.files = []
1bc579bcd67a - pull request generates overview based on it's params
Marcin Kuzminski <marcin@python-works.com>
parents: 2434
diff changeset
342 c.changes = {}
3023
c2a206162062 Basic implementation of cherry picking changesets
Marcin Kuzminski <marcin@python-works.com>
parents: 3015
diff changeset
343 c.lines_added = 0
c2a206162062 Basic implementation of cherry picking changesets
Marcin Kuzminski <marcin@python-works.com>
parents: 3015
diff changeset
344 c.lines_deleted = 0
2440
1bc579bcd67a - pull request generates overview based on it's params
Marcin Kuzminski <marcin@python-works.com>
parents: 2434
diff changeset
345 for f in _parsed:
3023
c2a206162062 Basic implementation of cherry picking changesets
Marcin Kuzminski <marcin@python-works.com>
parents: 3015
diff changeset
346 st = f['stats']
c2a206162062 Basic implementation of cherry picking changesets
Marcin Kuzminski <marcin@python-works.com>
parents: 3015
diff changeset
347 if st[0] != 'b':
c2a206162062 Basic implementation of cherry picking changesets
Marcin Kuzminski <marcin@python-works.com>
parents: 3015
diff changeset
348 c.lines_added += st[0]
c2a206162062 Basic implementation of cherry picking changesets
Marcin Kuzminski <marcin@python-works.com>
parents: 3015
diff changeset
349 c.lines_deleted += st[1]
2440
1bc579bcd67a - pull request generates overview based on it's params
Marcin Kuzminski <marcin@python-works.com>
parents: 2434
diff changeset
350 fid = h.FID('', f['filename'])
1bc579bcd67a - pull request generates overview based on it's params
Marcin Kuzminski <marcin@python-works.com>
parents: 2434
diff changeset
351 c.files.append([fid, f['operation'], f['filename'], f['stats']])
2608
58c529332e7e Added option to close pull requests, in future that will be close & merge
Marcin Kuzminski <marcin@python-works.com>
parents: 2570
diff changeset
352 diff = diff_processor.as_html(enable_comments=enable_comments,
2995
32471bd1f4ee Implemented generation of changesets based
Marcin Kuzminski <marcin@python-works.com>
parents: 2933
diff changeset
353 parsed_lines=[f])
2440
1bc579bcd67a - pull request generates overview based on it's params
Marcin Kuzminski <marcin@python-works.com>
parents: 2434
diff changeset
354 c.changes[fid] = [f['operation'], f['filename'], diff]
1bc579bcd67a - pull request generates overview based on it's params
Marcin Kuzminski <marcin@python-works.com>
parents: 2434
diff changeset
355
2434
f29469677319 Added basic models for saving open pull requests
Marcin Kuzminski <marcin@python-works.com>
parents: 2395
diff changeset
356 def show(self, repo_name, pull_request_id):
2440
1bc579bcd67a - pull request generates overview based on it's params
Marcin Kuzminski <marcin@python-works.com>
parents: 2434
diff changeset
357 repo_model = RepoModel()
1bc579bcd67a - pull request generates overview based on it's params
Marcin Kuzminski <marcin@python-works.com>
parents: 2434
diff changeset
358 c.users_array = repo_model.get_users_js()
1bc579bcd67a - pull request generates overview based on it's params
Marcin Kuzminski <marcin@python-works.com>
parents: 2434
diff changeset
359 c.users_groups_array = repo_model.get_users_groups_js()
2496
fddd8e3fc157 use get_or_404 where possible
Marcin Kuzminski <marcin@python-works.com>
parents: 2489
diff changeset
360 c.pull_request = PullRequest.get_or_404(pull_request_id)
3104
c77d5c6358eb Implemented #670 Implementation of Roles in Pull Request
Marcin Kuzminski <marcin@python-works.com>
parents: 3103
diff changeset
361 c.allowed_to_change_status = self._get_is_allowed_change_status(c.pull_request)
2481
4d3032431d4f Adde pull request voting recalculation
Marcin Kuzminski <marcin@python-works.com>
parents: 2478
diff changeset
362 cc_model = ChangesetCommentsModel()
4d3032431d4f Adde pull request voting recalculation
Marcin Kuzminski <marcin@python-works.com>
parents: 2478
diff changeset
363 cs_model = ChangesetStatusModel()
4d3032431d4f Adde pull request voting recalculation
Marcin Kuzminski <marcin@python-works.com>
parents: 2478
diff changeset
364 _cs_statuses = cs_model.get_statuses(c.pull_request.org_repo,
4d3032431d4f Adde pull request voting recalculation
Marcin Kuzminski <marcin@python-works.com>
parents: 2478
diff changeset
365 pull_request=c.pull_request,
4d3032431d4f Adde pull request voting recalculation
Marcin Kuzminski <marcin@python-works.com>
parents: 2478
diff changeset
366 with_revisions=True)
4d3032431d4f Adde pull request voting recalculation
Marcin Kuzminski <marcin@python-works.com>
parents: 2478
diff changeset
367
4d3032431d4f Adde pull request voting recalculation
Marcin Kuzminski <marcin@python-works.com>
parents: 2478
diff changeset
368 cs_statuses = defaultdict(list)
4d3032431d4f Adde pull request voting recalculation
Marcin Kuzminski <marcin@python-works.com>
parents: 2478
diff changeset
369 for st in _cs_statuses:
4d3032431d4f Adde pull request voting recalculation
Marcin Kuzminski <marcin@python-works.com>
parents: 2478
diff changeset
370 cs_statuses[st.author.username] += [st]
4d3032431d4f Adde pull request voting recalculation
Marcin Kuzminski <marcin@python-works.com>
parents: 2478
diff changeset
371
4d3032431d4f Adde pull request voting recalculation
Marcin Kuzminski <marcin@python-works.com>
parents: 2478
diff changeset
372 c.pull_request_reviewers = []
2712
7224882c4059 new summary for opened pull requests
Marcin Kuzminski <marcin@python-works.com>
parents: 2711
diff changeset
373 c.pull_request_pending_reviewers = []
2481
4d3032431d4f Adde pull request voting recalculation
Marcin Kuzminski <marcin@python-works.com>
parents: 2478
diff changeset
374 for o in c.pull_request.reviewers:
4d3032431d4f Adde pull request voting recalculation
Marcin Kuzminski <marcin@python-works.com>
parents: 2478
diff changeset
375 st = cs_statuses.get(o.user.username, None)
4d3032431d4f Adde pull request voting recalculation
Marcin Kuzminski <marcin@python-works.com>
parents: 2478
diff changeset
376 if st:
4d3032431d4f Adde pull request voting recalculation
Marcin Kuzminski <marcin@python-works.com>
parents: 2478
diff changeset
377 sorter = lambda k: k.version
4d3032431d4f Adde pull request voting recalculation
Marcin Kuzminski <marcin@python-works.com>
parents: 2478
diff changeset
378 st = [(x, list(y)[0])
4d3032431d4f Adde pull request voting recalculation
Marcin Kuzminski <marcin@python-works.com>
parents: 2478
diff changeset
379 for x, y in (groupby(sorted(st, key=sorter), sorter))]
2712
7224882c4059 new summary for opened pull requests
Marcin Kuzminski <marcin@python-works.com>
parents: 2711
diff changeset
380 else:
7224882c4059 new summary for opened pull requests
Marcin Kuzminski <marcin@python-works.com>
parents: 2711
diff changeset
381 c.pull_request_pending_reviewers.append(o.user)
2481
4d3032431d4f Adde pull request voting recalculation
Marcin Kuzminski <marcin@python-works.com>
parents: 2478
diff changeset
382 c.pull_request_reviewers.append([o.user, st])
2444
b45e9fd75ac0 data checks
Marcin Kuzminski <marcin@python-works.com>
parents: 2443
diff changeset
383
b45e9fd75ac0 data checks
Marcin Kuzminski <marcin@python-works.com>
parents: 2443
diff changeset
384 # pull_requests repo_name we opened it against
b45e9fd75ac0 data checks
Marcin Kuzminski <marcin@python-works.com>
parents: 2443
diff changeset
385 # ie. other_repo must match
b45e9fd75ac0 data checks
Marcin Kuzminski <marcin@python-works.com>
parents: 2443
diff changeset
386 if repo_name != c.pull_request.other_repo.repo_name:
b45e9fd75ac0 data checks
Marcin Kuzminski <marcin@python-works.com>
parents: 2443
diff changeset
387 raise HTTPNotFound
b45e9fd75ac0 data checks
Marcin Kuzminski <marcin@python-works.com>
parents: 2443
diff changeset
388
2442
3bf057a7f7e8 small refactoring, moved shared for diff generation of code into pull-request model
Marcin Kuzminski <marcin@python-works.com>
parents: 2440
diff changeset
389 # load compare data into template context
2608
58c529332e7e Added option to close pull requests, in future that will be close & merge
Marcin Kuzminski <marcin@python-works.com>
parents: 2570
diff changeset
390 enable_comments = not c.pull_request.is_closed()
58c529332e7e Added option to close pull requests, in future that will be close & merge
Marcin Kuzminski <marcin@python-works.com>
parents: 2570
diff changeset
391 self._load_compare_data(c.pull_request, enable_comments=enable_comments)
2440
1bc579bcd67a - pull request generates overview based on it's params
Marcin Kuzminski <marcin@python-works.com>
parents: 2434
diff changeset
392
1bc579bcd67a - pull request generates overview based on it's params
Marcin Kuzminski <marcin@python-works.com>
parents: 2434
diff changeset
393 # inline comments
1bc579bcd67a - pull request generates overview based on it's params
Marcin Kuzminski <marcin@python-works.com>
parents: 2434
diff changeset
394 c.inline_cnt = 0
2481
4d3032431d4f Adde pull request voting recalculation
Marcin Kuzminski <marcin@python-works.com>
parents: 2478
diff changeset
395 c.inline_comments = cc_model.get_inline_comments(
4d3032431d4f Adde pull request voting recalculation
Marcin Kuzminski <marcin@python-works.com>
parents: 2478
diff changeset
396 c.rhodecode_db_repo.repo_id,
4d3032431d4f Adde pull request voting recalculation
Marcin Kuzminski <marcin@python-works.com>
parents: 2478
diff changeset
397 pull_request=pull_request_id)
2440
1bc579bcd67a - pull request generates overview based on it's params
Marcin Kuzminski <marcin@python-works.com>
parents: 2434
diff changeset
398 # count inline comments
1bc579bcd67a - pull request generates overview based on it's params
Marcin Kuzminski <marcin@python-works.com>
parents: 2434
diff changeset
399 for __, lines in c.inline_comments:
1bc579bcd67a - pull request generates overview based on it's params
Marcin Kuzminski <marcin@python-works.com>
parents: 2434
diff changeset
400 for comments in lines.values():
1bc579bcd67a - pull request generates overview based on it's params
Marcin Kuzminski <marcin@python-works.com>
parents: 2434
diff changeset
401 c.inline_cnt += len(comments)
1bc579bcd67a - pull request generates overview based on it's params
Marcin Kuzminski <marcin@python-works.com>
parents: 2434
diff changeset
402 # comments
2481
4d3032431d4f Adde pull request voting recalculation
Marcin Kuzminski <marcin@python-works.com>
parents: 2478
diff changeset
403 c.comments = cc_model.get_comments(c.rhodecode_db_repo.repo_id,
4d3032431d4f Adde pull request voting recalculation
Marcin Kuzminski <marcin@python-works.com>
parents: 2478
diff changeset
404 pull_request=pull_request_id)
2440
1bc579bcd67a - pull request generates overview based on it's params
Marcin Kuzminski <marcin@python-works.com>
parents: 2434
diff changeset
405
2803
0b2214604c74 Fixed status of changesets in preview windows
Marcin Kuzminski <marcin@python-works.com>
parents: 2796
diff changeset
406 try:
0b2214604c74 Fixed status of changesets in preview windows
Marcin Kuzminski <marcin@python-works.com>
parents: 2796
diff changeset
407 cur_status = c.statuses[c.pull_request.revisions[0]][0]
3631
10b4e34841a4 Don't catch all exceptions
Marcin Kuzminski <marcin@python-works.com>
parents: 3604
diff changeset
408 except Exception:
2803
0b2214604c74 Fixed status of changesets in preview windows
Marcin Kuzminski <marcin@python-works.com>
parents: 2796
diff changeset
409 log.error(traceback.format_exc())
0b2214604c74 Fixed status of changesets in preview windows
Marcin Kuzminski <marcin@python-works.com>
parents: 2796
diff changeset
410 cur_status = 'undefined'
0b2214604c74 Fixed status of changesets in preview windows
Marcin Kuzminski <marcin@python-works.com>
parents: 2796
diff changeset
411 if c.pull_request.is_closed() and 0:
0b2214604c74 Fixed status of changesets in preview windows
Marcin Kuzminski <marcin@python-works.com>
parents: 2796
diff changeset
412 c.current_changeset_status = cur_status
0b2214604c74 Fixed status of changesets in preview windows
Marcin Kuzminski <marcin@python-works.com>
parents: 2796
diff changeset
413 else:
0b2214604c74 Fixed status of changesets in preview windows
Marcin Kuzminski <marcin@python-works.com>
parents: 2796
diff changeset
414 # changeset(pull-request) status calulation based on reviewers
0b2214604c74 Fixed status of changesets in preview windows
Marcin Kuzminski <marcin@python-works.com>
parents: 2796
diff changeset
415 c.current_changeset_status = cs_model.calculate_status(
0b2214604c74 Fixed status of changesets in preview windows
Marcin Kuzminski <marcin@python-works.com>
parents: 2796
diff changeset
416 c.pull_request_reviewers,
0b2214604c74 Fixed status of changesets in preview windows
Marcin Kuzminski <marcin@python-works.com>
parents: 2796
diff changeset
417 )
2440
1bc579bcd67a - pull request generates overview based on it's params
Marcin Kuzminski <marcin@python-works.com>
parents: 2434
diff changeset
418 c.changeset_statuses = ChangesetStatus.STATUSES
2803
0b2214604c74 Fixed status of changesets in preview windows
Marcin Kuzminski <marcin@python-works.com>
parents: 2796
diff changeset
419
3442
b3680a200f75 compare: cleanup of as_form handling
Mads Kiilerich <madski@unity3d.com>
parents: 3430
diff changeset
420 c.as_form = False
3486
2053053e0882 compare/pullrequest: introduce merge parameter
Mads Kiilerich <madski@unity3d.com>
parents: 3485
diff changeset
421 c.ancestor = None # there is one - but right here we don't know which
2434
f29469677319 Added basic models for saving open pull requests
Marcin Kuzminski <marcin@python-works.com>
parents: 2395
diff changeset
422 return render('/pullrequests/pullrequest_show.html')
2443
fd0a822481ec - added commenting to pull requests
Marcin Kuzminski <marcin@python-works.com>
parents: 2442
diff changeset
423
2627
6bd62617b99f Opening pull request shouldn't be accessible by anonymous users
Marcin Kuzminski <marcin@python-works.com>
parents: 2614
diff changeset
424 @NotAnonymous()
2443
fd0a822481ec - added commenting to pull requests
Marcin Kuzminski <marcin@python-works.com>
parents: 2442
diff changeset
425 @jsonify
fd0a822481ec - added commenting to pull requests
Marcin Kuzminski <marcin@python-works.com>
parents: 2442
diff changeset
426 def comment(self, repo_name, pull_request_id):
2608
58c529332e7e Added option to close pull requests, in future that will be close & merge
Marcin Kuzminski <marcin@python-works.com>
parents: 2570
diff changeset
427 pull_request = PullRequest.get_or_404(pull_request_id)
58c529332e7e Added option to close pull requests, in future that will be close & merge
Marcin Kuzminski <marcin@python-works.com>
parents: 2570
diff changeset
428 if pull_request.is_closed():
58c529332e7e Added option to close pull requests, in future that will be close & merge
Marcin Kuzminski <marcin@python-works.com>
parents: 2570
diff changeset
429 raise HTTPForbidden()
2443
fd0a822481ec - added commenting to pull requests
Marcin Kuzminski <marcin@python-works.com>
parents: 2442
diff changeset
430
fd0a822481ec - added commenting to pull requests
Marcin Kuzminski <marcin@python-works.com>
parents: 2442
diff changeset
431 status = request.POST.get('changeset_status')
fd0a822481ec - added commenting to pull requests
Marcin Kuzminski <marcin@python-works.com>
parents: 2442
diff changeset
432 change_status = request.POST.get('change_changeset_status')
2796
bf3c976d02ec always post text about status changes of code-review
Marcin Kuzminski <marcin@python-works.com>
parents: 2769
diff changeset
433 text = request.POST.get('text')
3430
bbe21df7ad48 notifications changes
Marcin Kuzminski <marcin@python-works.com>
parents: 3394
diff changeset
434 close_pr = request.POST.get('save_close')
3104
c77d5c6358eb Implemented #670 Implementation of Roles in Pull Request
Marcin Kuzminski <marcin@python-works.com>
parents: 3103
diff changeset
435
c77d5c6358eb Implemented #670 Implementation of Roles in Pull Request
Marcin Kuzminski <marcin@python-works.com>
parents: 3103
diff changeset
436 allowed_to_change_status = self._get_is_allowed_change_status(pull_request)
c77d5c6358eb Implemented #670 Implementation of Roles in Pull Request
Marcin Kuzminski <marcin@python-works.com>
parents: 3103
diff changeset
437 if status and change_status and allowed_to_change_status:
3654
ec6354949623 Fix a lot of casings - use standard casing in most places
Mads Kiilerich <madski@unity3d.com>
parents: 3631
diff changeset
438 _def = (_('Status change -> %s')
2796
bf3c976d02ec always post text about status changes of code-review
Marcin Kuzminski <marcin@python-works.com>
parents: 2769
diff changeset
439 % ChangesetStatus.get_status_lbl(status))
3430
bbe21df7ad48 notifications changes
Marcin Kuzminski <marcin@python-works.com>
parents: 3394
diff changeset
440 if close_pr:
bbe21df7ad48 notifications changes
Marcin Kuzminski <marcin@python-works.com>
parents: 3394
diff changeset
441 _def = _('Closing with') + ' ' + _def
bbe21df7ad48 notifications changes
Marcin Kuzminski <marcin@python-works.com>
parents: 3394
diff changeset
442 text = text or _def
2443
fd0a822481ec - added commenting to pull requests
Marcin Kuzminski <marcin@python-works.com>
parents: 2442
diff changeset
443 comm = ChangesetCommentsModel().create(
2796
bf3c976d02ec always post text about status changes of code-review
Marcin Kuzminski <marcin@python-works.com>
parents: 2769
diff changeset
444 text=text,
2541
1c2ba03c42b4 Added dynamic data loading for other repo we open pull request against
Marcin Kuzminski <marcin@python-works.com>
parents: 2533
diff changeset
445 repo=c.rhodecode_db_repo.repo_id,
1c2ba03c42b4 Added dynamic data loading for other repo we open pull request against
Marcin Kuzminski <marcin@python-works.com>
parents: 2533
diff changeset
446 user=c.rhodecode_user.user_id,
2443
fd0a822481ec - added commenting to pull requests
Marcin Kuzminski <marcin@python-works.com>
parents: 2442
diff changeset
447 pull_request=pull_request_id,
fd0a822481ec - added commenting to pull requests
Marcin Kuzminski <marcin@python-works.com>
parents: 2442
diff changeset
448 f_path=request.POST.get('f_path'),
fd0a822481ec - added commenting to pull requests
Marcin Kuzminski <marcin@python-works.com>
parents: 2442
diff changeset
449 line_no=request.POST.get('line'),
2478
8eab81115660 white space cleanup
Marcin Kuzminski <marcin@python-works.com>
parents: 2444
diff changeset
450 status_change=(ChangesetStatus.get_status_lbl(status)
3430
bbe21df7ad48 notifications changes
Marcin Kuzminski <marcin@python-works.com>
parents: 3394
diff changeset
451 if status and change_status
bbe21df7ad48 notifications changes
Marcin Kuzminski <marcin@python-works.com>
parents: 3394
diff changeset
452 and allowed_to_change_status else None),
bbe21df7ad48 notifications changes
Marcin Kuzminski <marcin@python-works.com>
parents: 3394
diff changeset
453 closing_pr=close_pr
2443
fd0a822481ec - added commenting to pull requests
Marcin Kuzminski <marcin@python-works.com>
parents: 2442
diff changeset
454 )
fd0a822481ec - added commenting to pull requests
Marcin Kuzminski <marcin@python-works.com>
parents: 2442
diff changeset
455
fd0a822481ec - added commenting to pull requests
Marcin Kuzminski <marcin@python-works.com>
parents: 2442
diff changeset
456 action_logger(self.rhodecode_user,
fd0a822481ec - added commenting to pull requests
Marcin Kuzminski <marcin@python-works.com>
parents: 2442
diff changeset
457 'user_commented_pull_request:%s' % pull_request_id,
fd0a822481ec - added commenting to pull requests
Marcin Kuzminski <marcin@python-works.com>
parents: 2442
diff changeset
458 c.rhodecode_db_repo, self.ip_addr, self.sa)
fd0a822481ec - added commenting to pull requests
Marcin Kuzminski <marcin@python-works.com>
parents: 2442
diff changeset
459
3104
c77d5c6358eb Implemented #670 Implementation of Roles in Pull Request
Marcin Kuzminski <marcin@python-works.com>
parents: 3103
diff changeset
460 if allowed_to_change_status:
c77d5c6358eb Implemented #670 Implementation of Roles in Pull Request
Marcin Kuzminski <marcin@python-works.com>
parents: 3103
diff changeset
461 # get status if set !
c77d5c6358eb Implemented #670 Implementation of Roles in Pull Request
Marcin Kuzminski <marcin@python-works.com>
parents: 3103
diff changeset
462 if status and change_status:
c77d5c6358eb Implemented #670 Implementation of Roles in Pull Request
Marcin Kuzminski <marcin@python-works.com>
parents: 3103
diff changeset
463 ChangesetStatusModel().set_status(
c77d5c6358eb Implemented #670 Implementation of Roles in Pull Request
Marcin Kuzminski <marcin@python-works.com>
parents: 3103
diff changeset
464 c.rhodecode_db_repo.repo_id,
c77d5c6358eb Implemented #670 Implementation of Roles in Pull Request
Marcin Kuzminski <marcin@python-works.com>
parents: 3103
diff changeset
465 status,
c77d5c6358eb Implemented #670 Implementation of Roles in Pull Request
Marcin Kuzminski <marcin@python-works.com>
parents: 3103
diff changeset
466 c.rhodecode_user.user_id,
c77d5c6358eb Implemented #670 Implementation of Roles in Pull Request
Marcin Kuzminski <marcin@python-works.com>
parents: 3103
diff changeset
467 comm,
c77d5c6358eb Implemented #670 Implementation of Roles in Pull Request
Marcin Kuzminski <marcin@python-works.com>
parents: 3103
diff changeset
468 pull_request=pull_request_id
c77d5c6358eb Implemented #670 Implementation of Roles in Pull Request
Marcin Kuzminski <marcin@python-works.com>
parents: 3103
diff changeset
469 )
c77d5c6358eb Implemented #670 Implementation of Roles in Pull Request
Marcin Kuzminski <marcin@python-works.com>
parents: 3103
diff changeset
470
3430
bbe21df7ad48 notifications changes
Marcin Kuzminski <marcin@python-works.com>
parents: 3394
diff changeset
471 if close_pr:
3104
c77d5c6358eb Implemented #670 Implementation of Roles in Pull Request
Marcin Kuzminski <marcin@python-works.com>
parents: 3103
diff changeset
472 if status in ['rejected', 'approved']:
c77d5c6358eb Implemented #670 Implementation of Roles in Pull Request
Marcin Kuzminski <marcin@python-works.com>
parents: 3103
diff changeset
473 PullRequestModel().close_pull_request(pull_request_id)
c77d5c6358eb Implemented #670 Implementation of Roles in Pull Request
Marcin Kuzminski <marcin@python-works.com>
parents: 3103
diff changeset
474 action_logger(self.rhodecode_user,
c77d5c6358eb Implemented #670 Implementation of Roles in Pull Request
Marcin Kuzminski <marcin@python-works.com>
parents: 3103
diff changeset
475 'user_closed_pull_request:%s' % pull_request_id,
c77d5c6358eb Implemented #670 Implementation of Roles in Pull Request
Marcin Kuzminski <marcin@python-works.com>
parents: 3103
diff changeset
476 c.rhodecode_db_repo, self.ip_addr, self.sa)
c77d5c6358eb Implemented #670 Implementation of Roles in Pull Request
Marcin Kuzminski <marcin@python-works.com>
parents: 3103
diff changeset
477 else:
c77d5c6358eb Implemented #670 Implementation of Roles in Pull Request
Marcin Kuzminski <marcin@python-works.com>
parents: 3103
diff changeset
478 h.flash(_('Closing pull request on other statuses than '
c77d5c6358eb Implemented #670 Implementation of Roles in Pull Request
Marcin Kuzminski <marcin@python-works.com>
parents: 3103
diff changeset
479 'rejected or approved forbidden'),
c77d5c6358eb Implemented #670 Implementation of Roles in Pull Request
Marcin Kuzminski <marcin@python-works.com>
parents: 3103
diff changeset
480 category='warning')
2608
58c529332e7e Added option to close pull requests, in future that will be close & merge
Marcin Kuzminski <marcin@python-works.com>
parents: 2570
diff changeset
481
2541
1c2ba03c42b4 Added dynamic data loading for other repo we open pull request against
Marcin Kuzminski <marcin@python-works.com>
parents: 2533
diff changeset
482 Session().commit()
2443
fd0a822481ec - added commenting to pull requests
Marcin Kuzminski <marcin@python-works.com>
parents: 2442
diff changeset
483
fd0a822481ec - added commenting to pull requests
Marcin Kuzminski <marcin@python-works.com>
parents: 2442
diff changeset
484 if not request.environ.get('HTTP_X_PARTIAL_XHR'):
fd0a822481ec - added commenting to pull requests
Marcin Kuzminski <marcin@python-works.com>
parents: 2442
diff changeset
485 return redirect(h.url('pullrequest_show', repo_name=repo_name,
fd0a822481ec - added commenting to pull requests
Marcin Kuzminski <marcin@python-works.com>
parents: 2442
diff changeset
486 pull_request_id=pull_request_id))
fd0a822481ec - added commenting to pull requests
Marcin Kuzminski <marcin@python-works.com>
parents: 2442
diff changeset
487
fd0a822481ec - added commenting to pull requests
Marcin Kuzminski <marcin@python-works.com>
parents: 2442
diff changeset
488 data = {
fd0a822481ec - added commenting to pull requests
Marcin Kuzminski <marcin@python-works.com>
parents: 2442
diff changeset
489 'target_id': h.safeid(h.safe_unicode(request.POST.get('f_path'))),
fd0a822481ec - added commenting to pull requests
Marcin Kuzminski <marcin@python-works.com>
parents: 2442
diff changeset
490 }
fd0a822481ec - added commenting to pull requests
Marcin Kuzminski <marcin@python-works.com>
parents: 2442
diff changeset
491 if comm:
fd0a822481ec - added commenting to pull requests
Marcin Kuzminski <marcin@python-works.com>
parents: 2442
diff changeset
492 c.co = comm
fd0a822481ec - added commenting to pull requests
Marcin Kuzminski <marcin@python-works.com>
parents: 2442
diff changeset
493 data.update(comm.get_dict())
fd0a822481ec - added commenting to pull requests
Marcin Kuzminski <marcin@python-works.com>
parents: 2442
diff changeset
494 data.update({'rendered_text':
fd0a822481ec - added commenting to pull requests
Marcin Kuzminski <marcin@python-works.com>
parents: 2442
diff changeset
495 render('changeset/changeset_comment_block.html')})
fd0a822481ec - added commenting to pull requests
Marcin Kuzminski <marcin@python-works.com>
parents: 2442
diff changeset
496
2444
b45e9fd75ac0 data checks
Marcin Kuzminski <marcin@python-works.com>
parents: 2443
diff changeset
497 return data
2489
a0adf8db1416 Enabled inline comments in pull-requests
Marcin Kuzminski <marcin@python-works.com>
parents: 2487
diff changeset
498
2627
6bd62617b99f Opening pull request shouldn't be accessible by anonymous users
Marcin Kuzminski <marcin@python-works.com>
parents: 2614
diff changeset
499 @NotAnonymous()
2489
a0adf8db1416 Enabled inline comments in pull-requests
Marcin Kuzminski <marcin@python-works.com>
parents: 2487
diff changeset
500 @jsonify
a0adf8db1416 Enabled inline comments in pull-requests
Marcin Kuzminski <marcin@python-works.com>
parents: 2487
diff changeset
501 def delete_comment(self, repo_name, comment_id):
a0adf8db1416 Enabled inline comments in pull-requests
Marcin Kuzminski <marcin@python-works.com>
parents: 2487
diff changeset
502 co = ChangesetComment.get(comment_id)
2608
58c529332e7e Added option to close pull requests, in future that will be close & merge
Marcin Kuzminski <marcin@python-works.com>
parents: 2570
diff changeset
503 if co.pull_request.is_closed():
58c529332e7e Added option to close pull requests, in future that will be close & merge
Marcin Kuzminski <marcin@python-works.com>
parents: 2570
diff changeset
504 #don't allow deleting comments on closed pull request
58c529332e7e Added option to close pull requests, in future that will be close & merge
Marcin Kuzminski <marcin@python-works.com>
parents: 2570
diff changeset
505 raise HTTPForbidden()
58c529332e7e Added option to close pull requests, in future that will be close & merge
Marcin Kuzminski <marcin@python-works.com>
parents: 2570
diff changeset
506
3141
a45191e7c7bb access control: fix owner checks - they were always true
Mads Kiilerich <madski@unity3d.com>
parents: 3123
diff changeset
507 owner = co.author.user_id == c.rhodecode_user.user_id
2489
a0adf8db1416 Enabled inline comments in pull-requests
Marcin Kuzminski <marcin@python-works.com>
parents: 2487
diff changeset
508 if h.HasPermissionAny('hg.admin', 'repository.admin')() or owner:
a0adf8db1416 Enabled inline comments in pull-requests
Marcin Kuzminski <marcin@python-works.com>
parents: 2487
diff changeset
509 ChangesetCommentsModel().delete(comment=co)
2541
1c2ba03c42b4 Added dynamic data loading for other repo we open pull request against
Marcin Kuzminski <marcin@python-works.com>
parents: 2533
diff changeset
510 Session().commit()
2489
a0adf8db1416 Enabled inline comments in pull-requests
Marcin Kuzminski <marcin@python-works.com>
parents: 2487
diff changeset
511 return True
a0adf8db1416 Enabled inline comments in pull-requests
Marcin Kuzminski <marcin@python-works.com>
parents: 2487
diff changeset
512 else:
2614
3f50a5e8fc4d Added editing of pull-request reviewers.
Marcin Kuzminski <marcin@python-works.com>
parents: 2612
diff changeset
513 raise HTTPForbidden()