changeset 2395:b262e349a7a5 codereview

created pull-request overview
author Marcin Kuzminski <marcin@python-works.com>
date Wed, 06 Jun 2012 01:07:48 +0200
parents 6776f4e569d7
children 51e3d60fed2f
files rhodecode/controllers/compare.py rhodecode/controllers/pullrequests.py rhodecode/model/db.py rhodecode/templates/compare/compare_cs.html rhodecode/templates/compare/compare_diff.html rhodecode/templates/pullrequests/pullrequest.html
diffstat 6 files changed, 179 insertions(+), 35 deletions(-) [+]
line wrap: on
line diff
--- a/rhodecode/controllers/compare.py	Wed Jun 06 01:01:33 2012 +0200
+++ b/rhodecode/controllers/compare.py	Wed Jun 06 01:07:48 2012 +0200
@@ -120,7 +120,8 @@
 
         c.statuses = c.rhodecode_db_repo.statuses([x.raw_id for x in
                                                    c.cs_ranges])
-
+        if request.environ.get('HTTP_X_PARTIAL_XHR'):
+            return render('compare/compare_cs.html')
 
         c.org_ref = org_ref[1]
         c.other_ref = other_ref[1]
--- a/rhodecode/controllers/pullrequests.py	Wed Jun 06 01:01:33 2012 +0200
+++ b/rhodecode/controllers/pullrequests.py	Wed Jun 06 01:07:48 2012 +0200
@@ -31,7 +31,7 @@
 
 from rhodecode.lib.base import BaseRepoController, render
 from rhodecode.lib.auth import LoginRequired, HasRepoPermissionAnyDecorator
-from webob.exc import HTTPNotFound
+from rhodecode.model.db import User
 
 log = logging.getLogger(__name__)
 
@@ -44,12 +44,15 @@
     def __before__(self):
         super(PullrequestsController, self).__before__()
 
-    def _get_repo_refs(self,repo):
+    def _get_repo_refs(self, repo):
         hist_l = []
 
-        branches_group = ([(k, k) for k in repo.branches.keys()], _("Branches"))
-        bookmarks_group = ([(k, k) for k in repo.bookmarks.keys()], _("Bookmarks"))
-        tags_group = ([(k, k) for k in repo.tags.keys()], _("Tags"))
+        branches_group = ([('branch:' + k, k) for k in repo.branches.keys()],
+                          _("Branches"))
+        bookmarks_group = ([('book:' + k, k) for k in repo.bookmarks.keys()],
+                           _("Bookmarks"))
+        tags_group = ([('tag:' + k, k) for k in repo.tags.keys()],
+                      _("Tags"))
 
         hist_l.append(bookmarks_group)
         hist_l.append(branches_group)
@@ -58,8 +61,30 @@
         return hist_l
 
     def index(self):
+        org_repo = c.rhodecode_db_repo
         c.org_refs = self._get_repo_refs(c.rhodecode_repo)
-        c.sources = []
-        c.sources.append('%s/%s' % (c.rhodecode_db_repo.user.username,
-                                    c.repo_name))
+        c.org_repos = []
+        c.other_repos = []
+        c.org_repos.append((org_repo.repo_name, '%s/%s' % (
+                                org_repo.user.username, c.repo_name))
+                           )
+
+        c.other_refs = c.org_refs
+        c.other_repos.extend(c.org_repos)
+
+        #gather forks and add to this list
+        for fork in org_repo.forks:
+            c.other_repos.append((fork.repo_name, '%s/%s' % (
+                                    fork.user.username, fork.repo_name))
+                                 )
+        #add parents of this fork also
+        c.other_repos.append((org_repo.parent.repo_name, '%s/%s' % (
+                                    org_repo.parent.user.username, 
+                                    org_repo.parent.repo_name))
+                                 )
+
+        #TODO: maybe the owner should be default ?
+        c.review_members = []
+        c.available_members = [(x.user_id, x.username) for x in
+                        User.query().filter(User.username != 'default').all()]
         return render('/pullrequests/pullrequest.html')
--- a/rhodecode/model/db.py	Wed Jun 06 01:01:33 2012 +0200
+++ b/rhodecode/model/db.py	Wed Jun 06 01:07:48 2012 +0200
@@ -603,6 +603,20 @@
         return q.one().ui_value
 
     @property
+    def forks(self):
+        """
+        Return forks of this repo
+        """
+        return Repository.get_repo_forks(self.repo_id)
+
+    @property
+    def parent(self):
+        """
+        Returns fork parent
+        """
+        return self.fork
+
+    @property
     def just_name(self):
         return self.repo_name.split(Repository.url_sep())[-1]
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rhodecode/templates/compare/compare_cs.html	Wed Jun 06 01:07:48 2012 +0200
@@ -0,0 +1,23 @@
+## Changesets table !
+<div class="container">
+  <table class="compare_view_commits noborder">
+  %if not c.cs_ranges:
+    <tr><td>${_('No changesets')}</td></tr>
+  %else:
+    %for cnt, cs in enumerate(c.cs_ranges):
+        <tr>
+        <td><div class="gravatar"><img alt="gravatar" src="${h.gravatar_url(h.email(cs.author),14)}"/></div></td>
+        <td>
+          %if cs.raw_id in c.statuses:
+            <div title="${c.statuses[cs.raw_id][1]}" class="changeset-status-ico"><img src="${h.url('/images/icons/flag_status_%s.png' % c.statuses[cs.raw_id][0])}" /></div>
+          %endif
+        </td>                
+        <td>${h.link_to('r%s:%s' % (cs.revision,h.short_id(cs.raw_id)),h.url('changeset_home',repo_name=c.repo_name,revision=cs.raw_id))}</td>
+        <td><div class="author">${h.person(cs.author)}</div></td>
+        <td><span class="tooltip" title="${h.age(cs.date)}">${cs.date}</span></td>
+        <td><div class="message">${h.urlify_commit(h.wrap_paragraphs(cs.message),c.repo_name)}</div></td>
+        </tr>
+    %endfor
+  %endif
+  </table>
+</div>
\ No newline at end of file
--- a/rhodecode/templates/compare/compare_diff.html	Wed Jun 06 01:01:33 2012 +0200
+++ b/rhodecode/templates/compare/compare_diff.html	Wed Jun 06 01:07:48 2012 +0200
@@ -33,24 +33,11 @@
             </div>
         </div>
         <div id="changeset_compare_view_content">
-            <div class="container">
-            <table class="compare_view_commits noborder">
-            %for cnt, cs in enumerate(c.cs_ranges):
-                <tr>
-                <td><div class="gravatar"><img alt="gravatar" src="${h.gravatar_url(h.email(cs.author),14)}"/></div></td>
-                <td>
-                  %if cs.raw_id in c.statuses:
-                    <div title="${c.statuses[cs.raw_id][1]}" class="changeset-status-ico"><img src="${h.url('/images/icons/flag_status_%s.png' % c.statuses[cs.raw_id][0])}" /></div>
-                  %endif
-                </td>                
-                <td>${h.link_to('r%s:%s' % (cs.revision,h.short_id(cs.raw_id)),h.url('changeset_home',repo_name=c.repo_name,revision=cs.raw_id))}</td>
-                <td><div class="author">${h.person(cs.author)}</div></td>
-                <td><span class="tooltip" title="${h.age(cs.date)}">${cs.date}</span></td>
-                <td><div class="message">${h.urlify_commit(h.wrap_paragraphs(cs.message),c.repo_name)}</div></td>
-                </tr>
-            %endfor
-            </table>
-            </div>
+            ##CS
+            <div style="font-size:1.1em;font-weight: bold;clear:both;padding-top:10px">${_('Changesets')}</div>
+            <%include file="compare_cs.html" />
+
+            ## FILES
             <div style="font-size:1.1em;font-weight: bold;clear:both;padding-top:10px">${_('Files affected')}</div>
             <div class="cs_files">
               %for fid, change, f, stat in c.files:              
--- a/rhodecode/templates/pullrequests/pullrequest.html	Wed Jun 06 01:01:33 2012 +0200
+++ b/rhodecode/templates/pullrequests/pullrequest.html	Wed Jun 06 01:07:48 2012 +0200
@@ -19,7 +19,8 @@
     <div class="title">
         ${self.breadcrumbs()}
     </div>
-    <div style="padding:30px">
+    ${h.form(url('#'),method='put', id='pull_request_form')}
+    <div style="float:left;padding:30px">
         ##ORG
         <div style="float:left">
             <div class="fork_user">
@@ -27,14 +28,14 @@
                     <img alt="gravatar" src="${h.gravatar_url(c.rhodecode_db_repo.user.email,24)}"/>
                 </div>
                 <span style="font-size: 20px">
-                ${h.select('other','',['%s/%s' % (c.rhodecode_db_repo.user.username,c.repo_name)])}:${h.select('other_ref','',c.org_refs)}
+                ${h.select('org_repo','',c.org_repos,class_='refs')}:${h.select('org_ref','',c.org_refs,class_='refs')}
                 </span>
                  <div style="padding:5px 3px 3px 42px;">${c.rhodecode_db_repo.description}</div>
             </div>
             <div style="clear:both;padding-top: 10px"></div>
         </div>
           <div style="float:left;font-size:24px;padding:0px 20px">
-          <img src="${h.url('/images/arrow_right_64.png')}"/>
+          <img height=32 width=32 src="${h.url('/images/arrow_right_64.png')}"/>
           </div>
         
         ##OTHER, most Probably the PARENT OF THIS FORK
@@ -44,16 +45,65 @@
                     <img alt="gravatar" src="${h.gravatar_url(c.rhodecode_db_repo.user.email,24)}"/>
                 </div>
                 <span style="font-size: 20px">
-                ${h.select('orther','',c.sources)}:${h.select('other_ref','',c.org_refs)}
+                ${h.select('other_repo','',c.other_repos,class_='refs')}:${h.select('other_ref','',c.other_refs,class_='refs')}
                 </span>
                  <div style="padding:5px 3px 3px 42px;">${c.rhodecode_db_repo.description}</div>
             </div>
             <div style="clear:both;padding-top: 10px"></div>
         </div>
+       <div style="float:left;padding:5px 5px 5px 15px">
+         <span>
+           <a id="refresh" href="#">
+             <img class="icon" title="${_('Refresh')}" alt="${_('Refresh')}" src="${h.url('/images/icons/arrow_refresh.png')}"/>
+             ${_('refresh overview')}
+           </a>
+         </span>       
+       </div>
+       <div style="clear:both;padding-top: 10px"></div>       
+       <div style="float:left" id="pull_request_overview">
+       </div>        
      </div>
-     
-    <h3>${_('New pull request')} from USER:REF into PARENT:REF</h3>
-    ${h.form(url('#'),method='put')}
+    <div style="float:left; border-left:1px dashed #eee">
+        <h4>${_('Pull request reviewers')}</h4>
+        <div id="reviewers" style="padding:0px 0px 0px 15px">
+        ##TODO: make this nicer :)
+          <table class="table noborder">
+                  <tr>
+                      <td>
+                          <div>
+                              <div style="float:left">
+                                  <div class="text" style="padding: 0px 0px 6px;">${_('Choosen reviewers')}</div>
+                                  ${h.select('review_members',[x[0] for x in c.review_members],c.review_members,multiple=True,size=8,style="min-width:210px")}
+                                 <div  id="remove_all_elements" style="cursor:pointer;text-align:center">
+                                     ${_('Remove all elements')}
+                                     <img alt="remove" style="vertical-align:text-bottom" src="${h.url('/images/icons/arrow_right.png')}"/>
+                                 </div>
+                              </div>
+                              <div style="float:left;width:20px;padding-top:50px">
+                                  <img alt="add" id="add_element"
+                                      style="padding:2px;cursor:pointer"
+                                      src="${h.url('/images/icons/arrow_left.png')}"/>
+                                  <br />
+                                  <img alt="remove" id="remove_element"
+                                      style="padding:2px;cursor:pointer"
+                                      src="${h.url('/images/icons/arrow_right.png')}"/>
+                              </div>
+                              <div style="float:left">
+                                   <div class="text" style="padding: 0px 0px 6px;">${_('Available reviewers')}</div>
+                                   ${h.select('available_members',[],c.available_members,multiple=True,size=8,style="min-width:210px")}
+                                   <div id="add_all_elements" style="cursor:pointer;text-align:center">
+                                         <img alt="add" style="vertical-align:text-bottom" src="${h.url('/images/icons/arrow_left.png')}"/>
+                                          ${_('Add all elements')}
+                                   </div>
+                              </div>
+                          </div>
+                      </td>
+                  </tr>
+          </table>        
+        </div>
+    </div> 
+    <h3>${_('Create new pull request')}</h3>
+    
     <div class="form">
         <!-- fields -->
 
@@ -85,7 +135,51 @@
     </div>
     ${h.end_form()}     
      
-     
 </div>
 
+<script type="text/javascript">
+  MultiSelectWidget('review_members','available_members','pull_request_form');
+  
+  var loadPreview = function(){
+      var url = "${h.url('compare_url', 
+          repo_name='org_repo',
+          org_ref_type='branch', org_ref='org_ref',
+          other_ref_type='branch', other_ref='other_ref',
+          repo='other_repo')}";
+  
+      var select_refs = YUQ('#pull_request_form select.refs')
+    
+      for(var i=0;i<select_refs.length;i++){
+        var select_ref = select_refs[i];
+        var select_ref_data = select_ref.value.split(':');
+        var key = null;
+        var val = null;
+        if(select_ref_data.length>1){
+          key = select_ref.name+"_type";
+          val = select_ref_data[0];
+          url = url.replace(key,val);
+    
+          key = select_ref.name;
+          val = select_ref_data[1];
+          url = url.replace(key,val);
+    
+        }else{
+          key = select_ref.name;
+          val = select_ref.value;
+          url = url.replace(key,val);
+        }
+      }
+    
+      ypjax(url,'pull_request_overview', function(data){})	  
+  }
+  YUE.on('refresh','click',function(e){
+     loadPreview()
+  })
+  
+  //lazy load after 0.5
+  
+  setTimeout(loadPreview,500)
+  
+</script>
+
 </%def>