##// END OF EJS Templates
It's better to use Exception here than assertion. It plays better with the exception handling software like sentry or errormator
It's better to use Exception here than assertion. It plays better with the exception handling software like sentry or errormator

File last commit:

r3781:40d50bb7 beta
r3783:f533c054 beta
Show More
pull_request.py
156 lines | 5.7 KiB | text/x-python | PythonLexer
Added basic models for saving open pull requests...
r2434 # -*- coding: utf-8 -*-
"""
Added option to close pull requests, in future that will be close & merge
r2608 rhodecode.model.pull_request
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Added basic models for saving open pull requests...
r2434
pull request model for RhodeCode
:created_on: Jun 6, 2012
:author: marcink
:copyright: (C) 2012-2012 Marcin Kuzminski <marcin@python-works.com>
:license: GPLv3, see COPYING for more details.
"""
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import logging
Added option to close pull requests, in future that will be close & merge
r2608 import datetime
Switch to waitress wsgi server by default in rhodecode....
r2597
Added basic models for saving open pull requests...
r2434 from pylons.i18n.translation import _
Switch to waitress wsgi server by default in rhodecode....
r2597 from rhodecode.model.meta import Session
Mads Kiilerich
compare: move get_changesets to compare controller where it is used - 2nd half that was lost in 6c79bfcd3b54...
r3754 from rhodecode.lib import helpers as h
Added basic models for saving open pull requests...
r2434 from rhodecode.model import BaseModel
set the status of changesets initially on pull request, and make sure we care of version collisions....
r3175 from rhodecode.model.db import PullRequest, PullRequestReviewers, Notification,\
ChangesetStatus
Added basic models for saving open pull requests...
r2434 from rhodecode.model.notification import NotificationModel
from rhodecode.lib.utils2 import safe_unicode
small refactoring, moved shared for diff generation of code into pull-request model
r2442
Added basic models for saving open pull requests...
r2434 log = logging.getLogger(__name__)
class PullRequestModel(BaseModel):
Added associated classes into child models
r2522 cls = PullRequest
Added option to close pull requests, in future that will be close & merge
r2608 def __get_pull_request(self, pull_request):
return self._get_instance(PullRequest, pull_request)
- pull request generates overview based on it's params...
r2440 def get_all(self, repo):
repo = self._get_repo(repo)
fix order of pull-requests in show all page
r3262 return PullRequest.query()\
.filter(PullRequest.other_repo == repo)\
show flags, and desc sort pull request based on created_date ref #765
r3389 .order_by(PullRequest.created_on.desc())\
fix order of pull-requests in show all page
r3262 .all()
- pull request generates overview based on it's params...
r2440
set the status of changesets initially on pull request, and make sure we care of version collisions....
r3175 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
Added dynamic data loading for other repo we open pull request against...
r2541
- pull request generates overview based on it's params...
r2440 created_by_user = self._get_user(created_by)
Added dynamic data loading for other repo we open pull request against...
r2541 org_repo = self._get_repo(org_repo)
other_repo = self._get_repo(other_repo)
Added basic models for saving open pull requests...
r2434
new = PullRequest()
Added dynamic data loading for other repo we open pull request against...
r2541 new.org_repo = org_repo
Added basic models for saving open pull requests...
r2434 new.org_ref = org_ref
Added dynamic data loading for other repo we open pull request against...
r2541 new.other_repo = other_repo
Added basic models for saving open pull requests...
r2434 new.other_ref = other_ref
new.revisions = revisions
new.title = title
new.description = description
- pull request generates overview based on it's params...
r2440 new.author = created_by_user
notifications changes...
r3430 Session().add(new)
Added dynamic data loading for other repo we open pull request against...
r2541 Session().flush()
Added basic models for saving open pull requests...
r2434 #members
show flags, and desc sort pull request based on created_date ref #765
r3389 for member in set(reviewers):
Added basic models for saving open pull requests...
r2434 _usr = self._get_user(member)
reviewer = PullRequestReviewers(_usr, new)
notifications changes...
r3430 Session().add(reviewer)
Added basic models for saving open pull requests...
r2434
set the status of changesets initially on pull request, and make sure we care of version collisions....
r3175 #reset state to under-review
ChangesetStatusModel().set_status(
repo=org_repo,
status=ChangesetStatus.STATUS_UNDER_REVIEW,
user=created_by_user,
pull_request=new
)
notifications changes...
r3430 revision_data = [(x.raw_id, x.message)
for x in map(org_repo.get_changeset, revisions)]
Added basic models for saving open pull requests...
r2434 #notification to reviewers
Nicer email notifications about pull-request
r2799 pr_url = h.url('pullrequest_show', repo_name=other_repo.repo_name,
pull_request_id=new.pull_request_id,
qualified=True,
)
Added basic models for saving open pull requests...
r2434 subject = safe_unicode(
h.link_to(
Mads Kiilerich
pull request: mention title of pull request in notifications
r3251 _('%(user)s wants you to review pull request #%(pr_id)s: %(pr_title)s') % \
Added basic models for saving open pull requests...
r2434 {'user': created_by_user.username,
Mads Kiilerich
pull request: mention title of pull request in notifications
r3251 'pr_title': new.title,
Added basic models for saving open pull requests...
r2434 'pr_id': new.pull_request_id},
Nicer email notifications about pull-request
r2799 pr_url
Added basic models for saving open pull requests...
r2434 )
)
body = description
Nicer email notifications about pull-request
r2799 kwargs = {
'pr_title': title,
'pr_user_created': h.person(created_by_user.email),
'pr_repo_url': h.url('summary_home', repo_name=other_repo.repo_name,
qualified=True,),
'pr_url': pr_url,
notifications changes...
r3430 'pr_revisions': revision_data
Nicer email notifications about pull-request
r2799 }
show flags, and desc sort pull request based on created_date ref #765
r3389
Mads Kiilerich
emailing: log failing emailing as an error...
r3781 NotificationModel().create(created_by=created_by_user, subject=subject, body=body,
recipients=reviewers,
type_=Notification.TYPE_PULL_REQUEST, email_kwargs=kwargs)
Added basic models for saving open pull requests...
r2434 return new
small refactoring, moved shared for diff generation of code into pull-request model
r2442
Added editing of pull-request reviewers.
r2614 def update_reviewers(self, pull_request, reviewers_ids):
reviewers_ids = set(reviewers_ids)
pull_request = self.__get_pull_request(pull_request)
current_reviewers = PullRequestReviewers.query()\
.filter(PullRequestReviewers.pull_request==
pull_request)\
.all()
current_reviewers_ids = set([x.user.user_id for x in current_reviewers])
to_add = reviewers_ids.difference(current_reviewers_ids)
to_remove = current_reviewers_ids.difference(reviewers_ids)
log.debug("Adding %s reviewers" % to_add)
log.debug("Removing %s reviewers" % to_remove)
for uid in to_add:
_usr = self._get_user(uid)
reviewer = PullRequestReviewers(_usr, pull_request)
notifications changes...
r3430 Session().add(reviewer)
Added editing of pull-request reviewers.
r2614
for uid in to_remove:
reviewer = PullRequestReviewers.query()\
.filter(PullRequestReviewers.user_id==uid,
PullRequestReviewers.pull_request==pull_request)\
.scalar()
if reviewer:
notifications changes...
r3430 Session().delete(reviewer)
Added editing of pull-request reviewers.
r2614
Authors of pull-requests can now delete them
r2746 def delete(self, pull_request):
pull_request = self.__get_pull_request(pull_request)
Session().delete(pull_request)
Added option to close pull requests, in future that will be close & merge
r2608 def close_pull_request(self, pull_request):
pull_request = self.__get_pull_request(pull_request)
pull_request.status = PullRequest.STATUS_CLOSED
pull_request.updated_on = datetime.datetime.now()
notifications changes...
r3430 Session().add(pull_request)