From adbed685ced5464a82fe976d8a9531bf8431a48f Mon Sep 17 00:00:00 2001 From: Tim Jentzsch Date: Mon, 6 Feb 2023 19:38:24 +0100 Subject: [PATCH] Fix date_last_active returning None too often It now correctly filters out None entries for claim_time and complete_time. --- blossom/authentication/models.py | 6 ++- .../authentication/tests/test_blossomuser.py | 46 ++++++++++++++++++- 2 files changed, 49 insertions(+), 3 deletions(-) diff --git a/blossom/authentication/models.py b/blossom/authentication/models.py index d01318d8..f8ea9466 100644 --- a/blossom/authentication/models.py +++ b/blossom/authentication/models.py @@ -114,12 +114,14 @@ def date_last_active(self) -> Optional[datetime]: This will give the time where the user last claimed or completed a post. """ recently_claimed = ( - Submission.objects.filter(claimed_by=self).order_by("-claim_time").first() + Submission.objects.filter(claimed_by=self, claim_time__isnull=False) + .order_by("-claim_time") + .first() ) recent_claim_time = recently_claimed.claim_time if recently_claimed else None recently_completed = ( - Submission.objects.filter(completed_by=self) + Submission.objects.filter(completed_by=self, complete_time__isnull=False) .order_by("-complete_time") .first() ) diff --git a/blossom/authentication/tests/test_blossomuser.py b/blossom/authentication/tests/test_blossomuser.py index c5f514e9..f8148a44 100644 --- a/blossom/authentication/tests/test_blossomuser.py +++ b/blossom/authentication/tests/test_blossomuser.py @@ -1,5 +1,5 @@ from datetime import datetime, timedelta -from typing import Optional +from typing import List, Optional, Tuple from unittest.mock import PropertyMock, patch import pytest @@ -269,3 +269,47 @@ def test_transcription_check_reason( return_value=check_percentage, ): assert user.transcription_check_reason() == expected + + +@pytest.mark.parametrize( + "submission_times, expected", + [ + ([(None, None)], None), + ([(None, datetime(2023, 1, 10))], datetime(2023, 1, 10)), + ( + [(None, None), (datetime(2023, 1, 10), datetime(2023, 1, 11))], + datetime(2023, 1, 11), + ), + ( + [ + (datetime(2023, 1, 3), datetime(2023, 1, 4)), + (datetime(2023, 1, 10), datetime(2023, 1, 11)), + ], + datetime(2023, 1, 11), + ), + ], +) +def test_date_last_active( + client: Client, + submission_times: List[Tuple[datetime, datetime]], + expected: Optional[datetime], +) -> None: + """Ensure that the last activity date is calculated correctly.""" + client, headers, user = setup_user_client(client, id=123, username="Test") + + for idx, (claim_time, complete_time) in enumerate(submission_times): + create_submission( + id=idx + 100, + claimed_by=user, + completed_by=user, + claim_time=None + if claim_time is None + else claim_time.replace(tzinfo=pytz.UTC), + complete_time=None + if complete_time is None + else complete_time.replace(tzinfo=pytz.UTC), + ) + + expected = None if expected is None else expected.replace(tzinfo=pytz.UTC) + + assert user.date_last_active() == expected