diff --git a/CHANGELOG.rst b/CHANGELOG.rst index fdea34322..d868a6b55 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -17,6 +17,10 @@ Unreleased ---------- * nothing unreleased +[5.6.9] +-------- +* fix: Do NOT skip validating intentions which have NO related catalog queries + [5.6.8] -------- * chore: Upgrade Python requirements diff --git a/enterprise/__init__.py b/enterprise/__init__.py index 3d2c4a9e5..dd9a5619e 100644 --- a/enterprise/__init__.py +++ b/enterprise/__init__.py @@ -2,4 +2,4 @@ Your project description goes here. """ -__version__ = "5.6.8" +__version__ = "5.6.9" diff --git a/enterprise/management/commands/validate_default_enrollment_intentions.py b/enterprise/management/commands/validate_default_enrollment_intentions.py index 9d4ff2ae8..819ee7834 100644 --- a/enterprise/management/commands/validate_default_enrollment_intentions.py +++ b/enterprise/management/commands/validate_default_enrollment_intentions.py @@ -7,7 +7,7 @@ from django.core.management import BaseCommand, CommandError from django.db.models import Max -from django.db.models.functions import Greatest +from django.db.models.functions import Coalesce, Greatest from django.utils import timezone from enterprise.content_metadata.api import get_and_cache_customer_content_metadata @@ -98,7 +98,11 @@ def handle(self, *args, **options): ).annotate( catalogs_modified_latest=Greatest( Max("enterprise_customer__enterprise_customer_catalogs__modified"), - Max("enterprise_customer__enterprise_customer_catalogs__enterprise_catalog_query__modified"), + Coalesce( + Max("enterprise_customer__enterprise_customer_catalogs__enterprise_catalog_query__modified"), + # Arbitrarily default to 1 year ago. Greatest() in MySQL relies on all inputs being non-null. + timezone.now() - timedelta(days=360), + ) ) ) diff --git a/tests/test_enterprise/management/test_validate_default_enrollment_intentions.py b/tests/test_enterprise/management/test_validate_default_enrollment_intentions.py index f9939a061..66701f1cb 100644 --- a/tests/test_enterprise/management/test_validate_default_enrollment_intentions.py +++ b/tests/test_enterprise/management/test_validate_default_enrollment_intentions.py @@ -52,6 +52,10 @@ def setUp(self): @ddt.data( # Totally happy case. {}, + # Happy case (customer evaluated despite not having any related catalog queries). + { + "catalog_query_exists": False, + }, # Happy-ish case (customer was skipped because catalog query was too new). { "catalog_query_modified": NOW - timedelta(minutes=29), @@ -90,6 +94,7 @@ def test_validate_default_enrollment_intentions( catalog_query_modified=NOW - timedelta(minutes=31), catalog_modified=NOW - timedelta(minutes=31), catalog_exists=True, + catalog_query_exists=True, customer_content_metadata_api_success=True, expected_logging="1/2 were evaluated (1/2 skipped)", expected_command_error=False, @@ -123,12 +128,15 @@ def test_validate_default_enrollment_intentions( ), ) if catalog_exists: - self.catalog_query.modified = catalog_query_modified - # bulk_update() avoids signals. - EnterpriseCatalogQuery.objects.bulk_update( - [self.catalog_query], - ["modified"], - ) + if catalog_query_exists: + self.catalog_query.modified = catalog_query_modified + # bulk_update() avoids signals. + EnterpriseCatalogQuery.objects.bulk_update( + [self.catalog_query], + ["modified"], + ) + else: + self.catalog_query.delete() self.catalog.modified = catalog_modified EnterpriseCustomerCatalog.objects.bulk_update( [self.catalog],