From 9e9c6bb6b681c1c73d65874814c54b8a88965d2a Mon Sep 17 00:00:00 2001 From: Lacey Williams Henschel Date: Tue, 30 Jan 2024 09:55:48 -0800 Subject: [PATCH] Add field missing_docs to LibraryVersion model - Add new field to the admin - Add logic for missing library-version docs to view - Add tests --- libraries/admin.py | 4 +- .../0018_libraryversion_missing_docs.py | 20 +++++++++ libraries/models.py | 4 ++ libraries/tests/test_views.py | 45 ++++++++++++++++++- libraries/views.py | 12 ++++- 5 files changed, 80 insertions(+), 5 deletions(-) create mode 100644 libraries/migrations/0018_libraryversion_missing_docs.py diff --git a/libraries/admin.py b/libraries/admin.py index 4e67e81d..09fdd773 100644 --- a/libraries/admin.py +++ b/libraries/admin.py @@ -122,8 +122,8 @@ class LibraryAdmin(admin.ModelAdmin): @admin.register(LibraryVersion) class LibraryVersionAdmin(admin.ModelAdmin): - list_display = ["library", "version", "documentation_url"] - list_filter = ["library", "version"] + list_display = ["library", "version", "missing_docs", "documentation_url"] + list_filter = ["library", "version", "missing_docs"] ordering = ["library__name", "-version__name"] search_fields = ["library__name", "version__name"] change_list_template = "admin/libraryversion_change_list.html" diff --git a/libraries/migrations/0018_libraryversion_missing_docs.py b/libraries/migrations/0018_libraryversion_missing_docs.py new file mode 100644 index 00000000..b1777568 --- /dev/null +++ b/libraries/migrations/0018_libraryversion_missing_docs.py @@ -0,0 +1,20 @@ +# Generated by Django 4.2.2 on 2024-01-30 17:55 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ("libraries", "0017_merge_20230919_2029"), + ] + + operations = [ + migrations.AddField( + model_name="libraryversion", + name="missing_docs", + field=models.BooleanField( + default=False, + help_text="If true, then there are not docs for this version of this library.", + ), + ), + ] diff --git a/libraries/models.py b/libraries/models.py index bf6d5164..edadaacf 100644 --- a/libraries/models.py +++ b/libraries/models.py @@ -281,6 +281,10 @@ class LibraryVersion(models.Model): on_delete=models.CASCADE, ) maintainers = models.ManyToManyField("users.User", related_name="maintainers") + missing_docs = models.BooleanField( + default=False, + help_text="If true, then there are not docs for this version of this library.", + ) documentation_url = models.CharField( max_length=255, blank=True, diff --git a/libraries/tests/test_views.py b/libraries/tests/test_views.py index 47684edd..ddaf28a9 100644 --- a/libraries/tests/test_views.py +++ b/libraries/tests/test_views.py @@ -239,7 +239,9 @@ def test_library_detail_context_get_maintainers(tp, user, library_version): assert response.context["maintainers"][0] == user -def test_library_detail_context_get_documentation_url(tp, user, library_version): +def test_library_detail_context_get_documentation_url_no_docs_link( + tp, user, library_version +): """ GET /libraries/{slug}/ Test that the maintainers var appears as expected @@ -258,6 +260,47 @@ def test_library_detail_context_get_documentation_url(tp, user, library_version) ) +def test_library_detail_context_get_documentation_url_missing_docs_bool( + tp, user, library_version +): + """ + GET /libraries/{slug}/ + Test that the maintainers var appears as expected + """ + library_version.documentation_url = None + library_version.missing_docs = True + library_version.save() + + library = library_version.library + url = tp.reverse("library-detail", library.slug) + response = tp.get(url) + tp.response_200(response) + assert "documentation_url" in response.context + assert ( + response.context["documentation_url"] + == library_version.version.documentation_url + ) + + +def test_library_detail_context_get_documentation_url_docs_present( + tp, user, library_version +): + """ + GET /libraries/{slug}/ + Test that the maintainers var appears as expected + """ + library_version.documentation_url = "https://example.com" + library_version.missing_docs = False + library_version.save() + + library = library_version.library + url = tp.reverse("library-detail", library.slug) + response = tp.get(url) + tp.response_200(response) + assert "documentation_url" in response.context + assert response.context["documentation_url"] == library_version.documentation_url + + def test_libraries_by_version_detail(tp, library_version): """GET /libraries/{slug}/{version_slug}/""" res = tp.get( diff --git a/libraries/views.py b/libraries/views.py index 3463f5cb..e913b03f 100644 --- a/libraries/views.py +++ b/libraries/views.py @@ -306,9 +306,17 @@ class LibraryDetail(FormMixin, DetailView): """Get the documentation URL for the current library.""" obj = self.get_object() library_version = LibraryVersion.objects.get(library=obj, version=version) - if library_version.documentation_url: + docs_url = version.documentation_url + + # If we know the library-version docs are missing, return the version docs + if library_version.missing_docs: + return docs_url + # If we have the library-version docs and believe they are valid, return those + elif library_version.documentation_url: return library_version.documentation_url - return version.documentation_url + # If we wind up here, return the version docs + else: + return docs_url def get_github_url(self, version): """Get the GitHub URL for the current library."""