Filter out versions without libraries

- Create a get_versions() method in the LibraryListView that filters out
  versions that don't have any libraries from the drop-down menu
- Ensure that the active() manager is unaffected, so the versions are still
valid for the query string, only hidden in the drop-down menu
This commit is contained in:
Lacey Williams Henschel
2023-08-10 05:44:00 -07:00
parent 8f6a926af5
commit d853705df0
2 changed files with 38 additions and 2 deletions

View File

@@ -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):

View File

@@ -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"""