diff --git a/config/urls.py b/config/urls.py index 64a73e38..19b00334 100755 --- a/config/urls.py +++ b/config/urls.py @@ -21,6 +21,7 @@ from libraries.views import ( LibraryByCategory, LibraryDetail, LibraryByVersion, + LibraryByVersionDetail, ) from support.views import SupportView, ContactView from versions.api import VersionViewSet @@ -43,6 +44,11 @@ urlpatterns = [ path("403", ForbiddenView.as_view(), name="forbidden"), path("404", NotFoundView.as_view(), name="not_found"), path("500", InternalServerErrorView.as_view(), name="internal_server_error"), + path( + "about/", + TemplateView.as_view(template_name="boost/about.html"), + name="boost-about", + ), path("health/", include("health_check.urls")), path("forum/", include(machina_urls)), path( @@ -66,11 +72,6 @@ urlpatterns = [ LibraryDetail.as_view(), name="library-detail", ), - path( - "about/", - TemplateView.as_view(template_name="boost/about.html"), - name="boost-about", - ), path( "people/detail/", TemplateView.as_view(template_name="boost/people_detail.html"), @@ -139,6 +140,11 @@ urlpatterns = [ ), path("contact/", ContactView.as_view(), name="contact"), # Boost versions views + path( + "versions//libraries//", + LibraryByVersionDetail.as_view(), + name="libraries-by-version-detail", + ), path( "versions//libraries/", LibraryByVersion.as_view(), diff --git a/libraries/tests/test_views.py b/libraries/tests/test_views.py index 756379bf..a56ac095 100644 --- a/libraries/tests/test_views.py +++ b/libraries/tests/test_views.py @@ -26,6 +26,27 @@ def test_libraries_by_category(tp, library, category): assert res.context["category"] == category +def test_libraries_by_version_detail(tp, library_version): + """GET /versions/{version_identifier}/libraries/{slug}/""" + res = tp.get( + "libraries-by-version-detail", + library_version.version.pk, + library_version.library.slug, + ) + tp.response_200(res) + assert "version" in res.context + + +def test_libraries_by_version_detail_no_library_found(tp, library_version): + """GET /versions/{version_identifier}/libraries/{slug}/""" + res = tp.get( + "libraries-by-version-detail", + library_version.version.pk, + "coffee", + ) + tp.response_404(res) + + def test_libraries_by_version(tp, library_version): """GET /versions/{version_identifier}/libraries/""" # Create a new library_version diff --git a/libraries/views.py b/libraries/views.py index 96eb2f22..5fae0747 100644 --- a/libraries/views.py +++ b/libraries/views.py @@ -1,11 +1,13 @@ import structlog +from django.http import Http404 from django.shortcuts import redirect from django.views.generic import DetailView, ListView from django.views.generic.edit import FormMixin +from versions.models import Version from .forms import LibraryForm -from .models import Category, Issue, Library, PullRequest +from .models import Category, Issue, Library, LibraryVersion, PullRequest logger = structlog.get_logger() @@ -64,6 +66,53 @@ class LibraryByVersion(CategoryMixin, FormMixin, ListView): return super().get(request) +class LibraryByVersionDetail(CategoryMixin, DetailView): + """Display a single Library for a specific Boost version""" + + model = Library + template_name = "libraries/detail.html" + + def get_object(self): + version_pk = self.kwargs.get("version_pk") + slug = self.kwargs.get("slug") + + if not LibraryVersion.objects.filter( + version__pk=version_pk, library__slug=slug + ).exists(): + raise Http404("No library found matching the query") + + try: + obj = self.get_queryset().get(slug=slug) + except queryset.model.DoesNotExist: + raise Http404("No library found matching the query") + return obj + + def get(self, request, *args, **kwargs): + self.object = self.get_object() + context = self.get_context_data(object=self.object) + context["closed_prs_count"] = self.get_closed_prs_count(self.object) + context["open_issues_count"] = self.get_open_issues_count(self.object) + context["version"] = self.get_version() + return self.render_to_response(context) + + def get_closed_prs_count(self, obj): + return PullRequest.objects.filter(library=obj, is_open=True).count() + + def get_open_issues_count(self, obj): + return Issue.objects.filter(library=obj, is_open=True).count() + + def get_version(self): + version_pk = self.kwargs.get("version_pk") + if version_pk: + try: + return Version.objects.get(pk=version_pk) + except Version.DoesNotExist: + logger.info("libraries_by_version_detail_view_version_not_found") + return + else: + return Version.objects.most_recent() + + class LibraryByLetter(CategoryMixin, ListView): """List all of our libraries that begin with a certain letter"""