@@ -221,12 +221,13 @@ class PullrequestsController(BaseRepoCon
other_ref, revisions, reviewers, title, description
)
Session().commit()
h.flash(_('Successfully opened new pull request'),
category='success')
except Exception:
raise
h.flash(_('Error occurred during sending pull request'),
category='error')
log.error(traceback.format_exc())
return redirect(url('pullrequest_home', repo_name=repo_name))
return redirect(url('pullrequest_show', repo_name=other_repo,
@@ -108,54 +108,57 @@ class ChangesetStatusModel(BaseModel):
# returned from pull_request
status = q.first()
status = status.status if status else status
st = status or ChangesetStatus.DEFAULT
return str(st)
def set_status(self, repo, status, user, comment, revision=None,
def set_status(self, repo, status, user, comment=None, revision=None,
pull_request=None, dont_allow_on_closed_pull_request=False):
"""
Creates new status for changeset or updates the old ones bumping their
version, leaving the current status at
:param repo:
:type repo:
:param revision:
:type revision:
:param status:
:type status:
:param user:
:type user:
:param comment:
:type comment:
:param dont_allow_on_closed_pull_request: don't allow a status change
if last status was for pull request and it's closed. We shouldn't
mess around this manually
repo = self._get_repo(repo)
q = ChangesetStatus.query()
if not comment:
from rhodecode.model.comment import ChangesetCommentsModel
comment = ChangesetCommentsModel().create(
text='Auto status change',
repo=repo,
user=user,
pull_request=pull_request,
if revision:
q = q.filter(ChangesetStatus.repo == repo)
q = q.filter(ChangesetStatus.revision == revision)
elif pull_request:
pull_request = self.__get_pull_request(pull_request)
q = q.filter(ChangesetStatus.repo == pull_request.org_repo)
q = q.filter(ChangesetStatus.pull_request == pull_request)
q = q.filter(ChangesetStatus.revision.in_(pull_request.revisions))
cur_statuses = q.all()
#if statuses exists and last is associated with a closed pull request
# we need to check if we can allow this status change
if (dont_allow_on_closed_pull_request and cur_statuses
and getattr(cur_statuses[0].pull_request, 'status', '')
== PullRequest.STATUS_CLOSED):
raise StatusChangeOnClosedPullRequestError(
'Changing status on closed pull request is not allowed'
#update all current statuses with older version
if cur_statuses:
for st in cur_statuses:
st.version += 1
self.sa.add(st)
def _create_status(user, repo, status, comment, revision, pull_request):
@@ -362,13 +362,14 @@ def PullRequestForm(repo_id):
user = v.UnicodeString(strip=True, required=True)
org_repo = v.UnicodeString(strip=True, required=True)
org_ref = v.UnicodeString(strip=True, required=True)
other_repo = v.UnicodeString(strip=True, required=True)
other_ref = v.UnicodeString(strip=True, required=True)
revisions = All(v.NotReviewedRevisions(repo_id)(), v.UniqueList(not_empty=True))
revisions = All(#v.NotReviewedRevisions(repo_id)(),
v.UniqueList(not_empty=True))
review_members = v.UniqueList(not_empty=True)
pullrequest_title = v.UnicodeString(strip=True, required=True, min=3)
pullrequest_desc = v.UnicodeString(strip=True, required=False)
return _PullRequestForm
@@ -30,13 +30,14 @@ import re
from pylons.i18n.translation import _
from rhodecode.model.meta import Session
from rhodecode.lib import helpers as h
from rhodecode.model import BaseModel
from rhodecode.model.db import PullRequest, PullRequestReviewers, Notification
from rhodecode.model.db import PullRequest, PullRequestReviewers, Notification,\
ChangesetStatus
from rhodecode.model.notification import NotificationModel
from rhodecode.lib.utils2 import safe_unicode
from rhodecode.lib.vcs.utils.hgcompat import discovery, localrepo, scmutil, \
findcommonoutgoing
@@ -51,14 +52,15 @@ class PullRequestModel(BaseModel):
return self._get_instance(PullRequest, pull_request)
def get_all(self, repo):
return PullRequest.query().filter(PullRequest.other_repo == repo).all()
def create(self, created_by, org_repo, org_ref, other_repo,
other_ref, revisions, reviewers, title, description=None):
def create(self, created_by, org_repo, org_ref, other_repo, other_ref,
revisions, reviewers, title, description=None):
from rhodecode.model.changeset_status import ChangesetStatusModel
created_by_user = self._get_user(created_by)
org_repo = self._get_repo(org_repo)
other_repo = self._get_repo(other_repo)
new = PullRequest()
@@ -75,12 +77,20 @@ class PullRequestModel(BaseModel):
#members
for member in reviewers:
_usr = self._get_user(member)
reviewer = PullRequestReviewers(_usr, new)
self.sa.add(reviewer)
#reset state to under-review
ChangesetStatusModel().set_status(
repo=org_repo,
status=ChangesetStatus.STATUS_UNDER_REVIEW,
user=created_by_user,
pull_request=new
#notification to reviewers
notif = NotificationModel()
pr_url = h.url('pullrequest_show', repo_name=other_repo.repo_name,
pull_request_id=new.pull_request_id,
qualified=True,
@@ -62,13 +62,13 @@
##%elif h.is_git(c.pull_request.org_repo):
## <img class="icon" title="${_('Git repository')}" alt="${_('Git repository')}" src="${h.url('/images/icons/giticon.png')}"/>
##%endif
<span class="spantag">${c.pull_request.org_ref_parts[0]}</span>
:
<span class="spantag">${c.pull_request.org_ref_parts[1]}</span>
<span>${c.pull_request.org_repo.clone_url()}</span>
<span><a href="${h.url('summary_home', repo_name=c.pull_request.org_repo.repo_name)}">${c.pull_request.org_repo.clone_url()}</a></span>
</div>
<div style="white-space:pre-wrap;padding:3px 3px 5px 20px">${h.literal(c.pull_request.description)}</div>
Status change: