diff --git a/libraries/tests/test_views.py b/libraries/tests/test_views.py index f6bd4931..4d762281 100644 --- a/libraries/tests/test_views.py +++ b/libraries/tests/test_views.py @@ -5,21 +5,34 @@ from dateutil.relativedelta import relativedelta from model_bakery import baker +from versions.models import Version + def test_library_list(library_version, tp, url_name="libraries"): """GET /libraries/""" - last_year = datetime.date.today() - datetime.timedelta(days=365) + # Create a version with a library + last_year = library_version.version.release_date - datetime.timedelta(days=365) v2 = baker.make("versions.Version", name="Version 1.78.0", release_date=last_year) lib2 = baker.make( "libraries.Library", name="sample", ) baker.make("libraries.LibraryVersion", library=lib2, version=v2) + + # Create a version with no libraries + v_no_libraries = baker.make( + "versions.Version", name="No Libraries", release_date=last_year + ) + + # Confirm that you know which version is the most recent + assert library_version.version == Version.objects.most_recent() + res = tp.get(url_name) tp.response_200(res) assert "library_list" in res.context assert library_version.library in res.context["library_list"] assert lib2 not in res.context["library_list"] + assert v_no_libraries not in res.context["versions"] def test_library_list_mini(library_version, tp): diff --git a/libraries/views.py b/libraries/views.py index 19fb9b2a..6a2449b0 100644 --- a/libraries/views.py +++ b/libraries/views.py @@ -3,6 +3,7 @@ import structlog from dateutil.relativedelta import relativedelta from django.http import Http404 +from django.db.models import Count from django.shortcuts import get_object_or_404, redirect from django.views.generic import DetailView, ListView from django.views.generic.edit import FormMixin @@ -52,7 +53,7 @@ class LibraryList(VersionAlertMixin, ListView): else: context["version"] = Version.objects.most_recent() context["categories"] = self.get_categories(context["version"]) - context["versions"] = Version.objects.active().order_by("-release_date") + context["versions"] = self.get_versions() context["library_list"] = self.get_queryset() return context @@ -63,6 +64,28 @@ class LibraryList(VersionAlertMixin, ListView): .order_by("name") ) + def get_versions(self): + """ + Return a queryset of all versions to display in the version dropdown. + """ + versions = Version.objects.active().order_by("-release_date") + + # Annotate each version with the number of libraries it has + versions = versions.annotate( + library_count=Count("library_version", distinct=True) + ).order_by("-release_date") + + # Filter out versions with no libraries + versions = versions.filter(library_count__gt=0) + + most_recent_version = Version.objects.most_recent() + + # Confirm the most recent v is in the queryset, even if it has no libraries + if most_recent_version not in versions: + versions = versions | Version.objects.filter(pk=most_recent_version.pk) + + return versions + class LibraryListMini(LibraryList): """Flat list version of LibraryList"""