mirror of
https://github.com/boostorg/website-v2.git
synced 2026-02-27 05:32:08 +00:00
✨ Add ability to select a Version of a library
This commit is contained in:
@@ -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"),
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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">
|
||||
|
||||
Reference in New Issue
Block a user