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>