diff --git a/config/urls.py b/config/urls.py index 4f77c21c..9a866a66 100755 --- a/config/urls.py +++ b/config/urls.py @@ -19,6 +19,7 @@ from libraries.views import ( LibraryList, LibraryByCategory, LibraryDetail, + LibraryListByVersion, ) from libraries.api import LibrarySearchView from support.views import SupportView, ContactView @@ -132,7 +133,13 @@ urlpatterns = [ TemplateView.as_view(template_name="support/getting_started.html"), name="getting-started", ), - path("contact/", ContactView.as_view(), name="contact"), + path("contact/", ContactView.as_view(), name="contact"),\ + # Boost versions views + path( + "versions//libraries/", + LibraryListByVersion.as_view(), + name="libraries-by-version", + ), path("versions//", VersionDetail.as_view(), name="version-detail"), path("versions/", VersionList.as_view(), name="version-list"), # Markdown content diff --git a/libraries/tests/test_views.py b/libraries/tests/test_views.py index bcc37d13..2be79990 100644 --- a/libraries/tests/test_views.py +++ b/libraries/tests/test_views.py @@ -26,6 +26,20 @@ def test_libraries_by_category(tp, library, category): assert res.context["category"] == category +def test_libraries_by_version(tp, library_version): + """GET /versions/{version_identifier}/libraries/""" + # Create a new library_version + excluded_library = baker.make("libraries.Library", name="Sample") + res = tp.get("libraries-by-version", library_version.version.slug) + tp.response_200(res) + assert "library_list" in res.context + + # Confirm that correct libraries are present + assert len(res.context["library_list"]) == 1 + assert library_version.library in res.context["library_list"] + assert excluded_library not in res.context["library_list"] + + def test_library_detail(library, tp): """GET /libraries/{repo}/""" url = tp.reverse("library-detail", library.slug) diff --git a/libraries/views.py b/libraries/views.py index 0ffc89f0..b706a282 100644 --- a/libraries/views.py +++ b/libraries/views.py @@ -38,6 +38,31 @@ class LibraryList(CategoryMixin, FormMixin, ListView): return super().get(request) +class LibraryListByVersion(CategoryMixin, FormMixin, ListView): + """List all of our libraries for a specific Boost version by name""" + + form_class = LibraryForm + paginate_by = 25 + queryset = ( + Library.objects.prefetch_related("authors", "categories").all().order_by("name") + ) + template_name = "libraries/list.html" + + def get_queryset(self): + version_slug = self.kwargs.get("slug") + return super().get_queryset().filter(library_version__version__slug=version_slug) + + def post(self, request): + """User has submitted a form and will be redirected to the right results""" + form = self.get_form() + if form.is_valid(): + category = form.cleaned_data["categories"][0] + return redirect("libraries-by-category", category=category.slug) + else: + logger.info("library_list_invalid_category") + return super().get(request) + + class LibraryByCategory(CategoryMixin, ListView): """List all of our libraries in a certain category"""