mozreview: show review flag in the commits table (bug 1197879) r?smacleod draft
authorMauro Doglio <mdoglio@mozilla.com>
Fri, 08 Apr 2016 12:09:15 +0100
changeset 8121 84ca3ce51ec1bb6aa5f012913e370f72c4e05523
parent 8120 c7043a56fcd3dfbda95169199de561451275fab9
child 8122 cf687187e8aa43e745bebd147097bba26ae5b491
push id830
push usermdoglio@mozilla.com
push dateTue, 17 May 2016 10:03:33 +0000
reviewerssmacleod
bugs1197879
mozreview: show review flag in the commits table (bug 1197879) r?smacleod MozReview-Commit-ID: IStWatbqdnq
hgext/reviewboard/tests/test-review-request-summary.t
pylib/mozreview/mozreview/review_helpers.py
pylib/mozreview/mozreview/static/mozreview/css/commits.less
pylib/mozreview/mozreview/templates/mozreview/commits.html
pylib/mozreview/mozreview/templatetags/mozreview.py
--- a/hgext/reviewboard/tests/test-review-request-summary.t
+++ b/hgext/reviewboard/tests/test-review-request-summary.t
@@ -64,16 +64,17 @@
     commit: 98467d80785ec84dd871f213c167ed704a6d974d
     submitter: default+5
     issue_open_count: 0
     status: pending
     reviewers:
     - reviewer
     reviewers_status:
       reviewer:
+        review_flag: r?
         ship_it: false
   - summary: Bug 1 - Foo 2
     id: 3
     commit: 3a446ae4382006c43cdfa5aa33c494f582736f35
     submitter: default+5
     issue_open_count: 0
     status: pending
     reviewers: []
@@ -110,16 +111,17 @@ Opening an issue should be reflected in 
     commit: 98467d80785ec84dd871f213c167ed704a6d974d
     submitter: default+5
     issue_open_count: 1
     status: pending
     reviewers:
     - reviewer
     reviewers_status:
       reviewer:
+        review_flag: r?
         ship_it: false
   - summary: Bug 1 - Foo 2
     id: 3
     commit: 3a446ae4382006c43cdfa5aa33c494f582736f35
     submitter: default+5
     issue_open_count: 0
     status: pending
     reviewers: []
@@ -145,16 +147,17 @@ Resolving an issue should decrement the 
     commit: 98467d80785ec84dd871f213c167ed704a6d974d
     submitter: default+5
     issue_open_count: 0
     status: pending
     reviewers:
     - reviewer
     reviewers_status:
       reviewer:
+        review_flag: r?
         ship_it: false
   - summary: Bug 1 - Foo 2
     id: 3
     commit: 3a446ae4382006c43cdfa5aa33c494f582736f35
     submitter: default+5
     issue_open_count: 0
     status: pending
     reviewers: []
@@ -181,16 +184,17 @@ Giving a ship-it should result in a chan
     commit: 98467d80785ec84dd871f213c167ed704a6d974d
     submitter: default+5
     issue_open_count: 0
     status: pending
     reviewers:
     - reviewer
     reviewers_status:
       reviewer:
+        review_flag: r+
         ship_it: true
   - summary: Bug 1 - Foo 2
     id: 3
     commit: 3a446ae4382006c43cdfa5aa33c494f582736f35
     submitter: default+5
     issue_open_count: 0
     status: pending
     reviewers: []
@@ -217,16 +221,17 @@ Verify we can also get the summaries by 
       commit: 98467d80785ec84dd871f213c167ed704a6d974d
       submitter: default+5
       issue_open_count: 0
       status: submitted
       reviewers:
       - reviewer
       reviewers_status:
         reviewer:
+          review_flag: r+
           ship_it: true
     - summary: Bug 1 - Foo 2
       id: 3
       commit: 3a446ae4382006c43cdfa5aa33c494f582736f35
       submitter: default+5
       issue_open_count: 0
       status: pending
       reviewers: []
--- a/pylib/mozreview/mozreview/review_helpers.py
+++ b/pylib/mozreview/mozreview/review_helpers.py
@@ -1,16 +1,17 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 from __future__ import absolute_import, unicode_literals
 
 from reviewboard.reviews.models import ReviewRequestDraft
 
+from mozreview.extra_data import REVIEW_FLAG_KEY
 from mozreview.models import get_profile
 
 
 def gen_latest_reviews(review_request):
     """Generate a series of relevant reviews.
 
     Generates the set of reviews for a review request where there is
     only a single review for each user and it is that users most
@@ -73,31 +74,39 @@ def has_l3_shipit(review_request):
         if get_profile(review.user).has_scm_ldap_group('scm_level_3'):
             return True
 
     return False
 
 
 def get_reviewers_status(review_request, reviewers=None):
     """Returns the latest review status for each reviewer."""
+
+    # Don't show any status on drafts.
+    if type(review_request) == ReviewRequestDraft:
+        return {}
+
     if not reviewers:
         reviewers = review_request.target_people.all()
     reviewers_status = dict()
 
     for r in reviewers:
-        reviewers_status[r.username] = {'ship_it': False}
-
-    # Don't show any status on drafts.
-    if type(review_request) == ReviewRequestDraft:
-        return reviewers_status
+        # The initial state is r?
+        reviewers_status[r.username] = {
+            'ship_it': False,
+            'review_flag': 'r?',
+        }
 
     for review in gen_latest_reviews(review_request):
-
-        if review.user.username in reviewers_status:
-            reviewers_status[review.user.username]['ship_it'] = review.ship_it
+        review_flag = review.extra_data.get(REVIEW_FLAG_KEY)
+        user = review.user.username
+        if user in reviewers_status:
+            reviewers_status[user]['ship_it'] = review.ship_it
+            if review_flag:
+                reviewers_status[user]['review_flag'] = review_flag
 
     return reviewers_status
 
 
 def has_shipit_carryforward(review_request):
     """Return whether the review request has a carried forward ship-it
 
     A ship-it is considered carried forward if the commit for which it was
--- a/pylib/mozreview/mozreview/static/mozreview/css/commits.less
+++ b/pylib/mozreview/mozreview/static/mozreview/css/commits.less
@@ -80,16 +80,31 @@
         min-height: 10px;
 
         &.reviewer-ship-it {
           background-color: @approval-bg;
           border: 1px solid @approval-border-color;
           padding: 1px 5px;
           .border-radius(2px);
         }
+        &.review-pending::after {
+          content: " (r?)";
+        }
+        &.review-granted::after {
+          content: " (r+)";
+        }
+        &.review-denied::after {
+          content: " (r-)";
+        }
+        &.review-cleared{
+          color: grey;
+        }
+        &.review-cleared::after {
+          content: " (r? cleared)";
+        }
       }
     }
   }
 
   & > tbody > tr {
     background-color: #FFFFFF;
   }
   & > tbody > tr[current="true"],
--- a/pylib/mozreview/mozreview/templates/mozreview/commits.html
+++ b/pylib/mozreview/mozreview/templates/mozreview/commits.html
@@ -53,17 +53,17 @@ This is the template for the "Commits" l
       {% comment "TODO: show this column when the commit author will be available" %}
       <td>{{ child_details.submitter }}</td>
       {% endcomment %}
       <td class="reviewers">
         <span class="mozreview-child-reviewer-list"
               data-id="{{child_details.get_review_request.id}}">
           {% for reviewer, status in child_details|reviewers_status %}
             {% if not forloop.first %}, {% endif %}
-            <span class="reviewer-name{% if status.ship_it %} reviewer-ship-it{% endif %}">{{ reviewer }}</span>
+            <span class="reviewer-name{% if status.ship_it %} reviewer-ship-it{% endif %} {{status.review_flag|review_flag_class}}">{{ reviewer }}</span>
           {% endfor %}
         </span>
       </td>
       <td class="status">
         {% if child_details.get_review_request.issue_open_count > 0 %}
         <a class="issue-count" href="{{child_details.get_review_request.get_absolute_url}}#issue-summary" title="{{child_details.get_review_request.issue_open_count}} open issues">
           <span class="issue-icon">!</span>{{child_details.get_review_request.issue_open_count}}
         </a>
--- a/pylib/mozreview/mozreview/templatetags/mozreview.py
+++ b/pylib/mozreview/mozreview/templatetags/mozreview.py
@@ -113,8 +113,19 @@ def reviewers_status(review_request):
 
 
 @register.filter()
 def userid_to_user(user_id):
     try:
         return User.objects.get(pk=user_id)
     except User.DoesNotExist:
         return 'Unknown user'
+
+
+@register.filter()
+def review_flag_class(review_flag):
+    reviewer_status_class_map = {
+        'r?': 'review-pending',
+        'r+': 'review-granted',
+        'r-': 'review-denied',
+        ' ': 'review-cleared'
+    }
+    return reviewer_status_class_map.get(review_flag)