diff --git a/config/urls.py b/config/urls.py index 99afe668..c0f6268f 100755 --- a/config/urls.py +++ b/config/urls.py @@ -28,7 +28,6 @@ from libraries.views import ( LibraryByCategory, LibraryDetail, LibraryListByVersion, - LibraryDetailByVersion, LibraryListByVersionByCategory, ) from libraries.api import LibrarySearchView @@ -184,7 +183,7 @@ urlpatterns = ( ), path( "versions///", - LibraryDetailByVersion.as_view(), + LibraryDetail.as_view(), name="library-detail-by-version", ), path("versions//", VersionDetail.as_view(), name="version-detail"), diff --git a/libraries/views.py b/libraries/views.py index 63e4a4ba..68348494 100644 --- a/libraries/views.py +++ b/libraries/views.py @@ -1,12 +1,12 @@ import structlog from django.http import Http404 -from django.shortcuts import redirect +from django.shortcuts import get_object_or_404, 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 .forms import LibraryForm, VersionSelectionForm from .models import Category, Issue, Library, LibraryVersion, PullRequest logger = structlog.get_logger() @@ -52,9 +52,10 @@ class LibraryList(CategoryMixin, FormMixin, ListView): return super().get(request) -class LibraryDetail(CategoryMixin, DetailView): +class LibraryDetail(CategoryMixin, FormMixin, DetailView): """Display a single Library in insolation""" + form_class = VersionSelectionForm model = Library template_name = "libraries/detail.html" @@ -63,13 +64,22 @@ class LibraryDetail(CategoryMixin, DetailView): context = super().get_context_data(**kwargs) context["closed_prs_count"] = self.get_closed_prs_count(self.object) context["open_issues_count"] = self.get_open_issues_count(self.object) - context["version"] = Version.objects.most_recent() + context["version"] = self.get_version() context["maintainers"] = self.get_maintainers(context["version"]) + context["versions"] = ( + Version.objects.active() + .filter(library_version__library=self.object) + .distinct() + .order_by("-release_date") + ) return context def get_object(self): + """Get the current library object from the slug in the URL. + If present, use the version_slug to get the right LibraryVersion of the library. + Otherwise, default to the most recent version.""" slug = self.kwargs.get("slug") - version = Version.objects.most_recent() + version = self.get_version() if not LibraryVersion.objects.filter( version=version, library__slug=slug @@ -83,16 +93,42 @@ class LibraryDetail(CategoryMixin, DetailView): return obj def get_closed_prs_count(self, obj): + """Get the number of closed pull requests for the current library.""" return PullRequest.objects.filter(library=obj, is_open=True).count() def get_maintainers(self, version): + """Get the maintainers for the current LibraryVersion.""" obj = self.get_object() library_version = LibraryVersion.objects.get(library=obj, version=version) return library_version.maintainers.all() def get_open_issues_count(self, obj): + """Get the number of open issues for the current library.""" return Issue.objects.filter(library=obj, is_open=True).count() + def get_version(self): + """Get the version of Boost for the library we're currently looking at.""" + version_slug = self.kwargs.get("version_slug") + if version_slug: + return get_object_or_404(Version, slug=version_slug) + else: + return Version.objects.most_recent() + + def post(self, request, *args, **kwargs): + """User has submitted a form and will be redirected to the right LibraryVersion.""" + self.object = self.get_object() + form = self.get_form() + if form.is_valid(): + version = form.cleaned_data["version"] + return redirect( + "library-detail-by-version", + version_slug=version.slug, + slug=self.object.slug, + ) + else: + logger.info("library_list_invalid_version") + return super().get(request) + class LibraryByCategory(CategoryMixin, FormMixin, ListView): """List all of our libraries for the current version of Boost in a certain category""" @@ -174,54 +210,54 @@ class LibraryListByVersion(CategoryMixin, FormMixin, ListView): return super().get(request) -class LibraryDetailByVersion(CategoryMixin, DetailView): - """Display a single Library for a specific Boost version""" +# class LibraryDetailByVersion(CategoryMixin, DetailView): +# """Display a single Library for a specific Boost version""" - model = Library - template_name = "libraries/detail.html" +# model = Library +# template_name = "libraries/detail.html" - def get_context_data(self, **kwargs): - context = super().get_context_data(**kwargs) - object = self.get_object() - context["closed_prs_count"] = self.get_closed_prs_count(object) - context["open_issues_count"] = self.get_open_issues_count(object) - context["version_slug"] = self.kwargs.get("version_slug") - context["version"] = self.get_version(self.kwargs.get("version_slug")) - context["version_name"] = context["version"].name - context["maintainers"] = self.get_maintainers(context["version"]) - return context +# def get_context_data(self, **kwargs): +# context = super().get_context_data(**kwargs) +# object = self.get_object() +# context["closed_prs_count"] = self.get_closed_prs_count(object) +# context["open_issues_count"] = self.get_open_issues_count(object) +# context["version_slug"] = self.kwargs.get("version_slug") +# context["version"] = self.get_version(self.kwargs.get("version_slug")) +# context["version_name"] = context["version"].name +# context["maintainers"] = self.get_maintainers(context["version"]) +# return context - def get_object(self): - version_slug = self.kwargs.get("version_slug") - slug = self.kwargs.get("slug") +# def get_object(self): +# version_slug = self.kwargs.get("version_slug") +# slug = self.kwargs.get("slug") - if not LibraryVersion.objects.filter( - version__slug=version_slug, library__slug=slug - ).exists(): - raise Http404("No library found matching the query") - try: - obj = self.get_queryset().get(slug=slug) - except self.model.DoesNotExist: - raise Http404("No library found matching the query") - return obj +# if not LibraryVersion.objects.filter( +# version__slug=version_slug, library__slug=slug +# ).exists(): +# raise Http404("No library found matching the query") +# try: +# obj = self.get_queryset().get(slug=slug) +# except self.model.DoesNotExist: +# raise Http404("No library found matching the query") +# return obj - def get_closed_prs_count(self, obj): - return PullRequest.objects.filter(library=obj, is_open=True).count() +# def get_closed_prs_count(self, obj): +# return PullRequest.objects.filter(library=obj, is_open=True).count() - def get_maintainers(self, version): - obj = self.get_object() - library_version = LibraryVersion.objects.get(library=obj, version=version) - return library_version.maintainers.all() +# def get_maintainers(self, version): +# obj = self.get_object() +# library_version = LibraryVersion.objects.get(library=obj, version=version) +# return library_version.maintainers.all() - def get_open_issues_count(self, obj): - return Issue.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_slug): - try: - return Version.objects.get(slug=version_slug) - except Version.DoesNotExist: - logger.info("libraries_by_version_detail_view_version_not_found") - raise Http404("No object found matching the query") +# def get_version(self, version_slug): +# try: +# return Version.objects.get(slug=version_slug) +# except Version.DoesNotExist: +# logger.info("libraries_by_version_detail_view_version_not_found") +# raise Http404("No object found matching the query") class LibraryListByVersionByCategory(CategoryMixin, FormMixin, ListView): diff --git a/templates/libraries/detail.html b/templates/libraries/detail.html index 134faae2..4d6c46d7 100644 --- a/templates/libraries/detail.html +++ b/templates/libraries/detail.html @@ -23,6 +23,24 @@ + +
+ {% csrf_token %} +
+ + +
+
+