changeset 4783:2145dfdc3af3

pullrequests: make top pane one big form with one save button This will temporarily break the PR update functionality.
author Mads Kiilerich <madski@unity3d.com>
date Wed, 21 Jan 2015 17:35:11 +0100
parents 531ff6651672
children d42d7b2a3b2f
files kallithea/config/routing.py kallithea/controllers/pullrequests.py kallithea/model/forms.py kallithea/public/js/base.js kallithea/templates/pullrequests/pullrequest_show.html
diffstat 5 files changed, 37 insertions(+), 76 deletions(-) [+]
line wrap: on
line diff
--- a/kallithea/config/routing.py	Wed Jan 21 17:35:11 2015 +0100
+++ b/kallithea/config/routing.py	Wed Jan 21 17:35:11 2015 +0100
@@ -713,11 +713,6 @@
                  controller='pullrequests',
                  action='post', conditions=dict(function=check_repo,
                                                 method=["POST"]))
-    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_delete',
                  '/{repo_name:.*?}/pull-request/{pull_request_id}',
                  controller='pullrequests',
--- a/kallithea/controllers/pullrequests.py	Wed Jan 21 17:35:11 2015 +0100
+++ b/kallithea/controllers/pullrequests.py	Wed Jan 21 17:35:11 2015 +0100
@@ -486,43 +486,29 @@
     @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
                                    'repository.admin')
     def post(self, repo_name, pull_request_id):
-        repo = RepoModel()._get_repo(repo_name)
-        pull_request = PullRequest.get_or_404(pull_request_id)
-        old_description = pull_request.description
-
-        _form = PullRequestPostForm()().to_python(request.POST)
-
-        pull_request.title = _form['pullrequest_title']
-        pull_request.description = _form['pullrequest_desc'].strip() or _('No description')
-
-        PullRequestModel().mention_from_description(pull_request, old_description)
-
-        Session().commit()
-        h.flash(_('Pull request updated'), category='success')
-
-        return redirect(pull_request.url())
-
-    # pullrequest_update for updating reviewer list
-    @LoginRequired()
-    @NotAnonymous()
-    @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
-                                   'repository.admin')
-    @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()
         #only owner or admin can update it
         owner = pull_request.author.user_id == c.authuser.user_id
         repo_admin = h.HasRepoPermissionAny('repository.admin')(c.repo_name)
-        if h.HasPermissionAny('hg.admin') or repo_admin or owner:
-            reviewers_ids = map(int, filter(lambda v: v not in [None, ''],
-                request.POST.get('reviewers_ids', '').split(',')))
+        if not (h.HasPermissionAny('hg.admin') or repo_admin or owner):
+            raise HTTPForbidden()
+
+        _form = PullRequestPostForm()().to_python(request.POST)
 
-            PullRequestModel().update_reviewers(pull_request_id, reviewers_ids)
-            Session().commit()
-            return True
-        raise HTTPForbidden()
+        old_description = pull_request.description
+        pull_request.title = _form['pullrequest_title']
+        pull_request.description = _form['pullrequest_desc'].strip() or _('No description')
+        PullRequestModel().mention_from_description(pull_request, old_description)
+
+        reviewers_ids = [int(s) for s in _form['review_members']]
+        PullRequestModel().update_reviewers(pull_request_id, reviewers_ids)
+
+        Session().commit()
+        h.flash(_('Pull request updated'), category='success')
+
+        return redirect(pull_request.url())
 
     @LoginRequired()
     @NotAnonymous()
--- a/kallithea/model/forms.py	Wed Jan 21 17:35:11 2015 +0100
+++ b/kallithea/model/forms.py	Wed Jan 21 17:35:11 2015 +0100
@@ -485,7 +485,6 @@
         allow_extra_fields = True
         filter_extra_fields = True
 
-        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)
@@ -505,6 +504,7 @@
 
         pullrequest_title = v.UnicodeString(strip=True, required=True)
         pullrequest_desc = v.UnicodeString(strip=True, required=False)
+        review_members = v.Set()
 
     return _PullRequestPostForm
 
--- a/kallithea/public/js/base.js	Wed Jan 21 17:35:11 2015 +0100
+++ b/kallithea/public/js/base.js	Wed Jan 21 17:35:11 2015 +0100
@@ -1489,28 +1489,10 @@
 var removeReviewMember = function(reviewer_id, repo_name, pull_request_id){
     var $li = $('#reviewer_{0}'.format(reviewer_id));
     $li.find('div div').css("text-decoration", "line-through");
-    $li.find('input').remove();
+    $li.find('input').attr('name', 'review_members_removed');
     $li.find('.reviewer_member_remove').replaceWith('&nbsp;(remove not saved)');
 }
 
-/* handle "Save Changes" of addReviewMember and removeReviewMember on PR */
-var updateReviewers = function(reviewers_ids, repo_name, pull_request_id){
-    if (reviewers_ids === undefined){
-        var reviewers_ids = [];
-        $('#review_members').find('input').each(function(){
-                reviewers_ids.push(this.value);
-            });
-    }
-    var url = pyroutes.url('pullrequest_update', {"repo_name":repo_name,
-                                                  "pull_request_id": pull_request_id});
-    var postData = {'_method':'put',
-                    'reviewers_ids': reviewers_ids};
-    var success = function(o){
-        window.location.reload();
-    }
-    ajaxPOST(url,postData,success);
-}
-
 /* activate auto completion of users and groups ... but only used for users as PR reviewers */
 var PullRequestAutoComplete = function (divid, cont, users_list, groups_list) {
     var myUsers = users_list;
--- a/kallithea/templates/pullrequests/pullrequest_show.html	Wed Jan 21 17:35:11 2015 +0100
+++ b/kallithea/templates/pullrequests/pullrequest_show.html	Wed Jan 21 17:35:11 2015 +0100
@@ -24,6 +24,7 @@
     ${self.breadcrumbs()}
   </div>
 
+  ${h.form(url('pullrequest_post', repo_name=c.repo_name, pull_request_id=c.pull_request.pull_request_id), method='post', id='pull_request_form')}
     <div class="form pr-box" style="float: left">
       <div class="pr-details-title ${'closed' if c.pull_request.is_closed() else ''}">
           ${_('Title')}: ${c.pull_request.title}
@@ -49,8 +50,6 @@
 
         %if editable:
         <div id="pr-edit-form" style="display:none">
-          ${h.form(url('pullrequest_post', repo_name=c.repo_name, pull_request_id=c.pull_request.pull_request_id), method='post', id='pull_request_form')}
-
           <div class="field">
               <div class="label-summary">
                   <label for="pullrequest_title">${_('Title')}:</label>
@@ -67,13 +66,7 @@
               <div class="textarea text-area editor">
                   ${h.textarea('pullrequest_desc',size=30,content=c.pull_request.description,placeholder=_('Write a short description on this pull request'))}
               </div>
-              <div class="buttons">
-                  ${h.submit('save',_('Save'),class_="btn btn-mini")}
-                  ${h.reset('reset',_('Cancel'),class_="btn btn-mini",onclick="YUD.setStyle('pr-edit-form','display','none');YUD.setStyle(YUD.getElementsByClassName('pr-not-edit'),'display','')")}
-             </div>
           </div>
-
-          ${h.end_form()}
         </div>
         %endif
 
@@ -173,8 +166,7 @@
           </div>
         </div>
 
-        ${h.form(url('pullrequest_copy_update',repo_name=c.repo_name,pull_request_id=c.pull_request.pull_request_id), method='post')}
-          <div class="field">
+        <div class="field">
             <div class="label-summary">
               <label>${_('Update')}:</label>
             </div>
@@ -200,9 +192,7 @@
                 ${h.submit('copy_update',_('Create Pull Request Update'),class_="btn btn-small")}
               </div>
             %endif
-          </div>
-        ${h.end_form()}
-
+        </div>
       </div>
     </div>
     ## REVIEWERS
@@ -237,15 +227,21 @@
                ${h.text('user', class_='yui-ac-input',placeholder=_('Type name of reviewer to add'))}
                <div id="reviewers_container"></div>
             </div>
-            <div style="padding:0px 10px">
-             <span id="update_pull_request" class="btn btn-small">${_('Save Changes')}</span>
-            </div>
           </div>
           %endif
         </div>
     </div>
-
-  <div style="clear: both"></div>
+    <div class="form" style="clear:both">
+      <div class="fields">
+        %if editable:
+          <div class="buttons">
+            ${h.submit('pr-form-save',_('Save'),class_="btn btn-small")}
+            ${h.reset('pr-form-reset',_('Cancel'),class_="btn btn-small")}
+          </div>
+        %endif
+      </div>
+    </div>
+  ${h.end_form()}
 </div>
 
 <div class="box">
@@ -306,7 +302,6 @@
 
     pyroutes.register('pullrequest_comment', "${url('pullrequest_comment',repo_name='%(repo_name)s',pull_request_id='%(pull_request_id)s')}", ['repo_name', 'pull_request_id']);
     pyroutes.register('pullrequest_comment_delete', "${url('pullrequest_comment_delete',repo_name='%(repo_name)s',comment_id='%(comment_id)s')}", ['repo_name', 'comment_id']);
-    pyroutes.register('pullrequest_update', "${url('pullrequest_update',repo_name='%(repo_name)s',pull_request_id='%(pull_request_id)s')}", ['repo_name', 'pull_request_id']);
 
     </script>
 
@@ -349,8 +344,11 @@
 
           linkInlineComments(document.getElementsByClassName('firstlink'), document.getElementsByClassName("inline-comment"));
 
-          $('#update_pull_request').click(function(e){
-              updateReviewers(undefined, "${c.repo_name}", "${c.pull_request.pull_request_id}");
+          var $org_review_members = $('#review_members').clone();
+          $('#pr-form-reset').click(function(e){
+              $('#pr-edit-form').hide();
+              $('.pr-not-edit').show();
+              $('#review_members').html($org_review_members);
           });
 
           // hack: re-navigate to target after JS is done ... if a target is set and setting href thus won't reload