Add ability to select a Version of a library

This commit is contained in:
Lacey Williams Henschel
2023-05-09 13:36:11 -07:00
parent b4fca48a6e
commit 35d1bf3f53
3 changed files with 100 additions and 47 deletions

View File

@@ -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/<slug:version_slug>/<slug:slug>/",
LibraryDetailByVersion.as_view(),
LibraryDetail.as_view(),
name="library-detail-by-version",
),
path("versions/<slug:slug>/", VersionDetail.as_view(), name="version-detail"),

View File

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

View File

@@ -23,6 +23,24 @@
</h3>
</div>
<!-- Form to select a version of this library -->
<form action="{% url 'library-detail' slug=object.slug %}" method="post">
{% csrf_token %}
<div>
<label for="id_version" hidden="true">Versions:</label>
<select onchange="this.form.submit()"
name="version"
class="block py-2 pr-11 pl-5 mb-3 w-full text-sm bg-white rounded-md border border-gray-300 cursor-pointer sm:inline-block md:mb-0 md:w-auto dark:bg-black text-sky-600 dark:text-orange dark:border-slate"
id="id_version"
>
<option>Filter by version</option>
{% for v in versions %}
<option value="{{ v.pk }}" {% if version == v %}selected="selected"{% endif %}>{{ v.name }}</option>
{% endfor %}
</select>
</div>
</form>
<div class="p-4 bg-white rounded-lg divide-x divide-gray-200 md:flex">
<div class="pr-3 space-y-2 w-full md:w-1/4">
<a class="block items-center py-1 px-2 rounded cursor-pointer hover:bg-gray-100" href="https://github.com/boostorg/smart_ptr">