Mercurial > kallithea
changeset 2614:3f50a5e8fc4d beta
Added editing of pull-request reviewers.
author | Marcin Kuzminski <marcin@python-works.com> |
---|---|
date | Sun, 15 Jul 2012 21:16:14 +0200 |
parents | ad3573d744ef |
children | 6f44b6d5aa60 |
files | rhodecode/config/routing.py rhodecode/controllers/pullrequests.py rhodecode/model/pull_request.py rhodecode/public/js/rhodecode.js rhodecode/templates/pullrequests/pullrequest_show.html |
diffstat | 5 files changed, 109 insertions(+), 26 deletions(-) [+] |
line wrap: on
line diff
--- a/rhodecode/config/routing.py Sun Jul 15 19:17:00 2012 +0200 +++ b/rhodecode/config/routing.py Sun Jul 15 21:16:14 2012 +0200 @@ -450,6 +450,11 @@ controller='pullrequests', action='show', conditions=dict(function=check_repo, method=["GET"])) + rmap.connect('pullrequest_update', + '/{repo_name:.*}/pull-request/{pull_request_id}', + controller='pullrequests', + action='update', conditions=dict(function=check_repo, + method=["PUT"])) rmap.connect('pullrequest_show_all', '/{repo_name:.*}/pull-request',
--- a/rhodecode/controllers/pullrequests.py Sun Jul 15 19:17:00 2012 +0200 +++ b/rhodecode/controllers/pullrequests.py Sun Jul 15 21:16:14 2012 +0200 @@ -167,6 +167,19 @@ return redirect(url('pullrequest_show', repo_name=other_repo, pull_request_id=pull_request.pull_request_id)) + @NotAnonymous() + @jsonify + def update(self, repo_name, pull_request_id): + pull_request = PullRequest.get_or_404(pull_request_id) + if pull_request.is_closed(): + raise HTTPForbidden() + + reviewers_ids = map(int, filter(lambda v: v not in [None, ''], + request.POST.get('reviewers_ids', '').split(','))) + PullRequestModel().update_reviewers(pull_request_id, reviewers_ids) + Session.commit() + return True + def _load_compare_data(self, pull_request, enable_comments=True): """ Load context data needed for generating compare diff @@ -337,4 +350,4 @@ Session().commit() return True else: - raise HTTPForbidden() \ No newline at end of file + raise HTTPForbidden()
--- a/rhodecode/model/pull_request.py Sun Jul 15 19:17:00 2012 +0200 +++ b/rhodecode/model/pull_request.py Sun Jul 15 21:16:14 2012 +0200 @@ -97,6 +97,34 @@ return new + 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) + self.sa.add(reviewer) + + for uid in to_remove: + reviewer = PullRequestReviewers.query()\ + .filter(PullRequestReviewers.user_id==uid, + PullRequestReviewers.pull_request==pull_request)\ + .scalar() + if reviewer: + self.sa.delete(reviewer) + def close_pull_request(self, pull_request): pull_request = self.__get_pull_request(pull_request) pull_request.status = PullRequest.STATUS_CLOSED
--- a/rhodecode/public/js/rhodecode.js Sun Jul 15 19:17:00 2012 +0200 +++ b/rhodecode/public/js/rhodecode.js Sun Jul 15 21:16:14 2012 +0200 @@ -501,6 +501,15 @@ ajaxPOST(url,postData,success); } +var updateReviewers = function(reviewers_ids){ + var url = AJAX_UPDATE_PULLREQUEST; + var postData = {'_method':'put', + 'reviewers_ids': reviewers_ids}; + var success = function(o){ + window.location.reload(); + } + ajaxPOST(url,postData,success); +} var createInlineAddButton = function(tr){
--- a/rhodecode/templates/pullrequests/pullrequest_show.html Sun Jul 15 19:17:00 2012 +0200 +++ b/rhodecode/templates/pullrequests/pullrequest_show.html Sun Jul 15 21:16:14 2012 +0200 @@ -35,32 +35,9 @@ <div>${_('Created on')}: ${h.fmt_date(c.pull_request.created_on)}</div> </div> - ## REVIEWERS <div> - <div class="table" style="float:right;width:46%;clear:none"> - <div id="body" class="diffblock"> - <div style="white-space:pre-wrap;padding:5px">${_('Pull request reviewers')}</div> - </div> - <div style="border: 1px solid #CCC"> - <div class="group_members_wrap"> - <ul class="group_members"> - %for user,status in c.pull_request_reviewers: - <li> - <div class="group_member"> - <div style="float:left;padding:3px" class="tooltip" title="${h.tooltip(h.changeset_status_lbl(status[0][1].status if status else 'not_reviewed'))}"> - <img src="${h.url(str('/images/icons/flag_status_%s.png' % (status[0][1].status if status else 'not_reviewed')))}"/> - </div> - <div class="gravatar"><img alt="gravatar" src="${h.gravatar_url(user.email,20)}"/> </div> - <div style="float:left">${user.username}</div> - </div> - </li> - %endfor - </ul> - </div> - </div> - </div> ##DIFF - <div class="table" style="float:left;width:46%;clear:none"> + <div class="table" style="float:left;clear:none"> <div id="body" class="diffblock"> <div style="white-space:pre-wrap;padding:5px">${_('Compare view')}</div> </div> @@ -81,12 +58,51 @@ </div> </div> </div> + ## REVIEWERS + <div style="float:left; border-left:1px dashed #eee"> + <h4>${_('Pull request reviewers')}</h4> + <div id="reviewers" style="padding:0px 0px 0px 15px"> + ## members goes here ! + <div class="group_members_wrap"> + <ul id="review_members" class="group_members"> + %for member,status in c.pull_request_reviewers: + <li id="reviewer_${member.user_id}"> + <div class="reviewers_member"> + <div style="float:left;padding:0px 3px 0px 0px" class="tooltip" title="${h.tooltip(h.changeset_status_lbl(status[0][1].status if status else 'not_reviewed'))}"> + <img src="${h.url(str('/images/icons/flag_status_%s.png' % (status[0][1].status if status else 'not_reviewed')))}"/> + </div> + <div class="gravatar"><img alt="gravatar" src="${h.gravatar_url(member.email,14)}"/> </div> + <div style="float:left">${member.full_name} (${_('owner')})</div> + <input type="hidden" value="${member.user_id}" name="review_members" /> + %if not c.pull_request.is_closed(): + <span class="delete_icon action_button" onclick="removeReviewer(${member.user_id})"></span> + %endif + </div> + </li> + %endfor + </ul> + </div> + %if not c.pull_request.is_closed(): + <div class='ac'> + <div class="reviewer_ac"> + ${h.text('user', class_='yui-ac-input')} + <span class="help-block">${_('Add reviewer to this pull request.')}</span> + <div id="reviewers_container"></div> + </div> + <div style="padding:0px 10px"> + <span id="update_pull_request" class="ui-btn xsmall">${_('save')}</span> + </div> + </div> + %endif + </div> + </div> </div> <script> var _USERS_AC_DATA = ${c.users_array|n}; var _GROUPS_AC_DATA = ${c.users_groups_array|n}; AJAX_COMMENT_URL = "${url('pullrequest_comment',repo_name=c.repo_name,pull_request_id=c.pull_request.pull_request_id)}"; - AJAX_COMMENT_DELETE_URL = "${url('pullrequest_comment_delete',repo_name=c.repo_name,comment_id='__COMMENT_ID__')}"; + AJAX_COMMENT_DELETE_URL = "${url('pullrequest_comment_delete',repo_name=c.repo_name,comment_id='__COMMENT_ID__')}"; + AJAX_UPDATE_PULLREQUEST = "${url('pullrequest_update',repo_name=c.repo_name,pull_request_id=c.pull_request.pull_request_id)}" </script> ## diff block @@ -112,6 +128,7 @@ <script type="text/javascript"> YUE.onDOMReady(function(){ + PullRequestAutoComplete('user', 'reviewers_container', _USERS_AC_DATA, _GROUPS_AC_DATA); YUE.on(YUQ('.show-inline-comments'),'change',function(e){ var show = 'none'; @@ -138,6 +155,17 @@ // inject comments into they proper positions var file_comments = YUQ('.inline-comment-placeholder'); renderInlineComments(file_comments); + + YUE.on(YUD.get('update_pull_request'),'click',function(e){ + + var reviewers_ids = []; + var ids = YUQ('#review_members input'); + for(var i=0; i<ids.length;i++){ + var id = ids[i].value + reviewers_ids.push(id); + } + updateReviewers(reviewers_ids); + }) }) </script>