• 
      

    Add "New Updates" dot for unviewed review requests.

    Review Request #11182 — Created Sept. 19, 2020 and updated

    Information

    Review Board
    release-3.0.x

    Reviewers

    The dashboard has a column which can show a blue dot when review requests have
    had new updates since the last time they were viewed by the user. This is used
    by people to let them know that there's some unread content. However, the
    column currently would not include the dot for review requests which have
    never been opened by the user. Since those too should count as unread content,
    we want to cover this scenario as well.

    This change adds "New Updates" blue dot to a review request if it hasn't
    been opened yet.

    Unit tests passed. Also manually checked the "New Updates" dot does appear on review requests that hasn't been visited.

    Summary ID
    Add "New Updates" dot for unviewed review requests.
    The dashboard has a column which can show a blue dot when review requests have had new updates since the last time they were viewed by the user. This is used by people to let them know that there's some unread content. However, the column currently would not include the dot for review requests which have never been opened by the user. Since those too should count as unread content, we want to cover this scenario as well. This change adds "New Updates" blue dot to a review request if it hasn't been opened yet. Testing Done: Unit tests passed.
    4570c4feacc643cf1b65c50f911d711788efe3c5
    NIT fixes.
    517c6c73503f120d973429fba88e6dd493e48c90
    Description From Last Updated

    This would be a great thing to add a unit test for, so we can be sure it works for …

    chipx86chipx86

    Your test cases look to be validating the display of the dot, but none of them are actually testing the …

    daviddavid

    We for sure have some older docstrings without the modern conventions, like Args and Returns, but for any new ones, …

    chipx86chipx86

    The other code in here used COUNT(*), and it works, but we might be able to do better than that. …

    chipx86chipx86

    Since the result is the same, we should avoid duplicating it. Let's instead make the if statement check either condition.

    chipx86chipx86

    There should be a blank line between a block and a statement, to help with readability.

    chipx86chipx86

    E501 line too long (80 > 79 characters)

    reviewbotreviewbot

    W291 trailing whitespace

    reviewbotreviewbot

    W293 blank line contains whitespace

    reviewbotreviewbot

    E501 line too long (85 > 79 characters)

    reviewbotreviewbot

    W291 trailing whitespace

    reviewbotreviewbot

    E302 expected 2 blank lines, found 1

    reviewbotreviewbot

    E231 missing whitespace after ','

    reviewbotreviewbot

    W293 blank line contains whitespace

    reviewbotreviewbot

    W293 blank line contains whitespace

    reviewbotreviewbot

    E231 missing whitespace after ','

    reviewbotreviewbot

    W293 blank line contains whitespace

    reviewbotreviewbot

    W293 blank line contains whitespace

    reviewbotreviewbot

    E231 missing whitespace after ','

    reviewbotreviewbot

    E231 missing whitespace after ','

    reviewbotreviewbot

    W293 blank line contains whitespace

    reviewbotreviewbot

    W291 trailing whitespace

    reviewbotreviewbot

    W293 blank line contains whitespace

    reviewbotreviewbot

    E231 missing whitespace after ','

    reviewbotreviewbot

    W293 blank line contains whitespace

    reviewbotreviewbot

    W291 trailing whitespace

    reviewbotreviewbot

    W293 blank line contains whitespace

    reviewbotreviewbot

    Let's add a blank line between these two.

    daviddavid

    We can wrap the type names as such: queryset (djblets.db.query. _Django16ChainableSelectRelatedQuerySet): However, that type name is kind of a behind-the-scenes …

    daviddavid

    Same here, re: queryset. Also, with "Returns", we don't need to indent the explanation, so this should look like: Returns: …

    daviddavid

    Let's add a blank line between these two.

    daviddavid

    Type and description should be at the same indent level here. The type should also be "unicode" rather than "Str".

    daviddavid

    Please put this blank line back (there should always be two blank lines between top-level definitions in the file, according …

    daviddavid

    Docstrings for test cases shouldn't end in a period, because the test runner will print an ellipsis after each one. …

    daviddavid

    When we write comments, we prefer to have proper sentence capitalization and punctuation (so "Set the new review count to …

    daviddavid
    bnie
    chipx86
    1. 
        
    2. Show all issues

      This would be a great thing to add a unit test for, so we can be sure it works for each possible condition:

      1. No new reviews, no visits (blue dot)
      2. No new reviews, visits (no blue dot)
      3. New reviews, no visits (no blue dot)
      4. New reviews, visits (blue dot)

      Each would be its own unit test in reviewboard/datagrids/tests.py for that column's test class.

      In each one, you'd set up the appropriate state (we have helpers for some things like creating a review request — see reviewboard/testing/testcase.py), and then you'd create a query, augment it with a call to augment_queryset(), and render a result for it for the review request you set up. Then check the resulting HTML.

    3. reviewboard/datagrids/columns.py (Diff revision 1)
       
       
      Show all issues

      We for sure have some older docstrings without the modern conventions, like Args and Returns, but for any new ones, or functions where we're modifying related code, it'll need to follow our conventions.

    4. reviewboard/datagrids/columns.py (Diff revision 1)
       
       
      Show all issues

      The other code in here used COUNT(*), and it works, but we might be able to do better than that. How about trying this query (you'll for sure want to test it — I haven't):

      SELECT 1
         FROM ...
        WHERE ...
          AND ...
        LIMIT 1;
      

      This should be faster, for a couple reasons:

      1. SELECT COUNT(*) requires the database to look up data for a row (meaning that it may have to open files and read in data) in order to generate a count, whereas SELECT 1 doesn't require reading any data.
      2. It also needs to go through each and every row that is a match. That could be thousands, tens of thousands, or even hundreds of thousands, but since we just care about whether there's 0 or more rows, we can LIMIT 1 to terminate the lookup as soon as any are discovered.

      (Assuming this works, it'd be great to have a separate change that simplifies the logic for the other column(s)!)

    5. reviewboard/datagrids/columns.py (Diff revision 1)
       
       
       
       
       
       
       
       
       
      Show all issues

      Since the result is the same, we should avoid duplicating it. Let's instead make the if statement check either condition.

    6. reviewboard/datagrids/columns.py (Diff revision 1)
       
       
       
      Show all issues

      There should be a blank line between a block and a statement, to help with readability.

    7. 
        
    bnie
    Review request changed
    Change Summary:

    Added comments for functions, nit changes, and unit tests.

    Commits:
    Summary ID
    Add "New Updates" dot for unviewed review requests.
    The dashboard has a column which can show a blue dot when review requests have had new updates since the last time they were viewed by the user. This is used by people to let them know that there's some unread content. However, the column currently would not include the dot for review requests which have never been opened by the user. Since those too should count as unread content, we want to cover this scenario as well. This change adds "New Updates" blue dot to a review request if it hasn't been opened yet. Testing Done: Unit tests passed.
    aa9bf313fac58e769403ed2a52c78c6fa07b685d
    Add "New Updates" dot for unviewed review requests.
    The dashboard has a column which can show a blue dot when review requests have had new updates since the last time they were viewed by the user. This is used by people to let them know that there's some unread content. However, the column currently would not include the dot for review requests which have never been opened by the user. Since those too should count as unread content, we want to cover this scenario as well. This change adds "New Updates" blue dot to a review request if it hasn't been opened yet. Testing Done: Unit tests passed.
    8e1d6795cca82be0fb9f48e21735e87b75be4423

    Checks run (1 failed, 1 succeeded)

    flake8 failed.
    JSHint passed.

    flake8

    bnie
    david
    1. Looking pretty good. Most of my comments are little style nits, but the first one here is important re: test cases.

    2. Show all issues

      Your test cases look to be validating the display of the dot, but none of them are actually testing the SQL query you wrote, since you're manually setting is_visited. Can we instead set up the correct ReviewRequestVisit state so that the query gets run?

    3. reviewboard/datagrids/columns.py (Diff revision 3)
       
       
       
      Show all issues

      Let's add a blank line between these two.

    4. reviewboard/datagrids/columns.py (Diff revision 3)
       
       
       
       
      Show all issues

      We can wrap the type names as such:

      queryset (djblets.db.query.
                _Django16ChainableSelectRelatedQuerySet):
      

      However, that type name is kind of a behind-the-scenes implementation detail which is likely to go away in the future. Let's claim that the type is django.db.models.query.QuerySet

    5. reviewboard/datagrids/columns.py (Diff revision 3)
       
       
       
      Show all issues

      Same here, re: queryset. Also, with "Returns", we don't need to indent the explanation, so this should look like:

      Returns:
          django.db.models.query.QuerySet:
          The query for the datagrid.
      
    6. reviewboard/datagrids/columns.py (Diff revision 3)
       
       
       
      Show all issues

      Let's add a blank line between these two.

    7. reviewboard/datagrids/columns.py (Diff revision 3)
       
       
       
      Show all issues

      Type and description should be at the same indent level here. The type should also be "unicode" rather than "Str".

    8. reviewboard/datagrids/columns.py (Diff revision 3)
       
       
      Show all issues

      Please put this blank line back (there should always be two blank lines between top-level definitions in the file, according to Python's style standards).

    9. reviewboard/datagrids/tests.py (Diff revision 3)
       
       
      Show all issues

      Docstrings for test cases shouldn't end in a period, because the test runner will print an ellipsis after each one. Same for all your other new ones.

    10. reviewboard/datagrids/tests.py (Diff revision 3)
       
       
      Show all issues

      When we write comments, we prefer to have proper sentence capitalization and punctuation (so "Set the new review count to 0."). Same for the ones in the other test cases.

    11. 
        
    bnie
    Review request changed
    Change Summary:

    Query issue in unit tests was not yet solved.

    Commits:
    Summary ID
    Add "New Updates" dot for unviewed review requests.
    The dashboard has a column which can show a blue dot when review requests have had new updates since the last time they were viewed by the user. This is used by people to let them know that there's some unread content. However, the column currently would not include the dot for review requests which have never been opened by the user. Since those too should count as unread content, we want to cover this scenario as well. This change adds "New Updates" blue dot to a review request if it hasn't been opened yet. Testing Done: Unit tests passed.
    3be01edbbadcd8e0451f16294f11886594e78903
    Add "New Updates" dot for unviewed review requests.
    The dashboard has a column which can show a blue dot when review requests have had new updates since the last time they were viewed by the user. This is used by people to let them know that there's some unread content. However, the column currently would not include the dot for review requests which have never been opened by the user. Since those too should count as unread content, we want to cover this scenario as well. This change adds "New Updates" blue dot to a review request if it hasn't been opened yet. Testing Done: Unit tests passed.
    4570c4feacc643cf1b65c50f911d711788efe3c5
    NIT fixes.
    517c6c73503f120d973429fba88e6dd493e48c90

    Checks run (2 succeeded)

    flake8 passed.
    JSHint passed.