Skip to content

Commit c73de39

Browse files
authored
Handle missing version library for /libs/library_name (boostorg#1942) (boostorg#1947)
1 parent 88d5fcf commit c73de39

File tree

4 files changed

+107
-11
lines changed

4 files changed

+107
-11
lines changed

config/urls.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
RedirectToDocsView,
2727
RedirectToHTMLDocsView,
2828
RedirectToHTMLToolsView,
29-
RedirectToLibraryView,
29+
RedirectToLibrariesView,
3030
RedirectToReleaseView,
3131
RedirectToToolsView,
3232
StaticContentTemplateView,
@@ -39,6 +39,7 @@
3939
from libraries.views import (
4040
LibraryDetail,
4141
LibraryListDispatcher,
42+
LibraryMissingVersionView,
4243
CommitAuthorEmailCreateView,
4344
VerifyCommitEmailView,
4445
CommitEmailResendView,
@@ -235,6 +236,11 @@
235236
LibraryDetail.as_view(),
236237
name="library-detail",
237238
),
239+
path(
240+
"library/<boostversionslug:version_slug>/<slug:library_slug>/missing/",
241+
LibraryMissingVersionView.as_view(),
242+
name="library-detail-version-missing",
243+
),
238244
path(
239245
"libraries/commit_author_email_create/",
240246
CommitAuthorEmailCreateView.as_view(),
@@ -404,7 +410,7 @@
404410
),
405411
re_path(
406412
r"^doc/libs/(?P<requested_version>[^/]+)/?$",
407-
RedirectToLibraryView.as_view(),
413+
RedirectToLibrariesView.as_view(),
408414
name="redirect-to-library-page",
409415
),
410416
re_path(

core/views.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -900,7 +900,7 @@ def get(self, request, requested_version):
900900
return HttpResponseRedirect(new_path)
901901

902902

903-
class RedirectToLibraryView(BaseRedirectView):
903+
class RedirectToLibrariesView(BaseRedirectView):
904904
"""View to redirect to a versioned libraries page."""
905905

906906
def get(self, request, requested_version):

libraries/views.py

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
determine_selected_boost_version,
3333
set_selected_boost_version,
3434
get_documentation_url,
35+
get_prioritized_version,
3536
get_version_from_cookie,
3637
)
3738
from .constants import LATEST_RELEASE_URL_PATH_STR
@@ -324,22 +325,39 @@ def get_version(self):
324325
def dispatch(self, request, *args, **kwargs):
325326
"""Redirect to the documentation page, if configured to."""
326327
if self.redirect_to_docs:
327-
return redirect(
328-
get_documentation_url(
329-
LibraryVersion.objects.get(
330-
library__slug=self.kwargs.get("library_slug"),
331-
version=self.get_version(),
332-
),
333-
latest=False,
328+
try:
329+
library_version = LibraryVersion.objects.get(
330+
library__slug=self.kwargs.get("library_slug"),
331+
version=self.get_version(),
334332
)
335-
)
333+
except LibraryVersion.DoesNotExist:
334+
# account for the library not yet being available in this version
335+
return redirect(
336+
"library-detail-version-missing",
337+
library_slug=self.kwargs.get("library_slug"),
338+
version_slug=get_prioritized_version(request),
339+
)
340+
return redirect(get_documentation_url(library_version, latest=False))
336341
response = super().dispatch(request, *args, **kwargs)
337342
set_selected_boost_version(
338343
self.kwargs.get("version_slug", LATEST_RELEASE_URL_PATH_STR), response
339344
)
340345
return response
341346

342347

348+
class LibraryMissingVersionView(BoostVersionMixin, DetailView):
349+
"""Display a missing library version page with proper context"""
350+
351+
model = Library
352+
template_name = "libraries/missing_version.html"
353+
slug_url_kwarg = "library_slug"
354+
355+
def get_context_data(self, **kwargs):
356+
context = super().get_context_data(**kwargs)
357+
context["library_view_str"] = get_prioritized_library_view(self.request)
358+
return context
359+
360+
343361
class CommitAuthorEmailCreateView(FormView):
344362
template_name = "libraries/profile_commit_email_address_form.html"
345363
form_class = CommitAuthorEmailForm
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
{% extends "base.html" %}
2+
3+
{% block title %}{{ object.display_name }} - Version Not Available{% endblock %}
4+
{% block description %}
5+
The {{ object.display_name }} library is not available in {{ selected_version.display_name }}.
6+
{% endblock %}
7+
8+
{% block content %}
9+
<main class="content">
10+
<meta http-equiv="refresh" content="30;url={% url 'library-detail' version_slug=LATEST_RELEASE_URL_PATH_STR library_slug=object.slug %}">
11+
<div class="pt-3 md:pt-4 md:pb-1 px-0 mb-0 w-full md:mb-2">
12+
<div class="flex-auto mb-2 w-full">
13+
<div id="overview">
14+
<span class="mx-3 text-xl md:text-3xl text-orange">{{ object.display_name }}</span>
15+
</div>
16+
</div>
17+
</div>
18+
19+
<section class="p-6 my-4 bg-white md:rounded-lg md:shadow-lg dark:text-white text-slate dark:bg-charcoal dark:bg-neutral-700">
20+
<div class="flex items-center">
21+
<i class="fas fa-exclamation-triangle text-orange mr-3 text-2xl"></i>
22+
<h2 class="text-2xl">{{ object.display_name|capfirst }} Not Available for {{ selected_version.display_name }}</h2>
23+
</div>
24+
25+
<div class="whitespace-normal mb-6">
26+
27+
<div class="flex justify-center mb-6 pb-4 border-b border-gray-200 dark:border-gray-600">
28+
<div class="flex items-center text-blue-800 dark:text-blue-200 text-sm">
29+
<i class="fas fa-clock mr-2"></i>
30+
<p>
31+
You will be automatically redirected to {{ object.display_name }} for the latest Boost version in
32+
<span id="countdown">30</span> seconds if no option is selected.
33+
</p>
34+
</div>
35+
</div>
36+
37+
<div class="flex flex-col items-center space-y-4">
38+
<div>
39+
<a href="{% url 'library-detail' version_slug=LATEST_RELEASE_URL_PATH_STR library_slug=object.slug %}"
40+
class="inline-flex items-center px-4 py-2 bg-orange text-white rounded-md hover:bg-orange-600 transition-colors">
41+
<i class="fas fa-book mr-2"></i>
42+
View {{ object.display_name }} in Current Version
43+
</a>
44+
</div>
45+
46+
<div>
47+
<a href="{% url 'libraries-list' version_slug=version_str library_view_str=library_view_str %}"
48+
class="inline-flex items-center px-4 py-2 bg-orange text-white rounded-md hover:bg-orange-600 transition-colors">
49+
<i class="fas fa-list mr-2"></i>
50+
Browse All Libraries in {{ selected_version.display_name }}
51+
</a>
52+
</div>
53+
</div>
54+
</div>
55+
</section>
56+
</main>
57+
58+
<script>
59+
let seconds = 30;
60+
const countdownElement = document.getElementById('countdown');
61+
62+
const timer = setInterval(() => {
63+
seconds--;
64+
countdownElement.textContent = seconds;
65+
66+
if (seconds <= 0) {
67+
clearInterval(timer);
68+
}
69+
}, 1000);
70+
71+
</script>
72+
{% endblock %}

0 commit comments

Comments
 (0)