Add exception logic to load the Detail docs links

- Add a button to the LibraryVersion admin to reload the docs links
- Add some minimal docs on the admin features
This commit is contained in:
Lacey Williams Henschel
2024-02-05 14:14:18 -08:00
parent 6755f76753
commit c9cc3c49b3
6 changed files with 76 additions and 1 deletions

5
docs/admin.md Normal file
View File

@@ -0,0 +1,5 @@
# Admin Features
## LibraryVersions
- Button **Refresh Documentation Links** will re-run the task that retrieves the links to external documentation for every version of every Boost library.

View File

@@ -3,7 +3,10 @@ from django.http import HttpResponseRedirect
from django.urls import path
from .models import Category, Issue, Library, LibraryVersion, PullRequest
from .tasks import update_libraries
from .tasks import (
update_libraries,
update_library_version_documentation_urls_all_versions,
)
@admin.register(Category)
@@ -46,6 +49,25 @@ class LibraryVersionAdmin(admin.ModelAdmin):
list_filter = ["library", "version"]
ordering = ["library__name", "-version__name"]
search_fields = ["library__name", "version__name"]
change_list_template = "admin/libraryversion_change_list.html"
def get_urls(self):
urls = super().get_urls()
my_urls = [
path("update_docs_urls/", self.update_docs_urls, name="update_docs_urls"),
]
return my_urls + urls
def update_docs_urls(self, request):
"""Run the task to refresh the documentation URLS from S3"""
update_library_version_documentation_urls_all_versions.delay()
self.message_user(
request,
"""
Documentation links are being refreshed.
""",
)
return HttpResponseRedirect("../")
@admin.register(Issue)

View File

@@ -1,16 +1,28 @@
import structlog
from config.celery import app
from django.db.models import Q
from core.boostrenderer import get_content_from_s3
from core.htmlhelper import get_library_documentation_urls
from libraries.github import LibraryUpdater
from libraries.models import LibraryVersion
from libraries.utils import get_first_last_day_last_month
from versions.models import Version
from .utils import generate_library_docs_url
logger = structlog.getLogger(__name__)
LIBRARY_DOCS_EXCEPTIONS = {"detail": generate_library_docs_url}
@app.task
def update_library_version_documentation_urls_all_versions():
"""Run the task to update all documentation URLs for all versions"""
for version in Version.objects.all():
get_and_store_library_version_documentation_urls_for_version.delay(version.pk)
@app.task
def get_and_store_library_version_documentation_urls_for_version(version_pk):
"""
@@ -64,6 +76,20 @@ def get_and_store_library_version_documentation_urls_for_version(version_pk):
)
continue
# See if we can load missing docs URLS another way
library_versions = LibraryVersion.objects.filter(version=version).filter(
Q(documentation_url="") | Q(documentation_url__isnull=True)
)
for library_version in library_versions:
exception_url_generator = LIBRARY_DOCS_EXCEPTIONS.get(
library_version.library.name.lower()
)
if exception_url_generator:
library_version.documentation_url = exception_url_generator(
version.boost_url_slug, library_version.library.slug.lower()
)
library_version.save()
@app.task
def update_libraries(update_all=False):

View File

@@ -5,6 +5,7 @@ import os
from libraries.utils import (
decode_content,
generate_fake_email,
generate_library_docs_url,
get_first_last_day_last_month,
parse_date,
write_content_to_tempfile,
@@ -28,6 +29,11 @@ def test_generate_fake_email():
assert "@example.com" in result
def test_generate_library_docs_url():
expected = "/doc/libs/boost_1_84_0/libs/detail/doc/html/index.html"
assert generate_library_docs_url("boost_1_84_0", "detail") == expected
def test_get_first_last_day_last_month():
first_day, last_day = get_first_last_day_last_month()

View File

@@ -28,6 +28,11 @@ def generate_fake_email(val: str) -> str:
return f"{local_email}@example.com"
def generate_library_docs_url(boost_url_slug, library_slug):
"""Generate a documentation url with a specific format"""
return f"/doc/libs/{boost_url_slug}/libs/{library_slug}/doc/html/index.html"
def get_first_last_day_last_month():
now = datetime.now()
first_day_this_month = now.replace(day=1)

View File

@@ -0,0 +1,11 @@
{% extends "admin/change_list.html" %}
{% load i18n admin_urls %}
{% block object-tools %}
<ul class="object-tools">
{% block object-tools-items %}
{{ block.super }}
<li><a href="{% url 'admin:update_docs_urls' %}" class="addlink">{% trans "Refresh Documentation Links" %}</a></li>
{% endblock %}
</ul>
{% endblock %}