diff --git a/CHANGES/+content-href-missing-viewset.bugfix b/CHANGES/+content-href-missing-viewset.bugfix new file mode 100644 index 00000000000..e6b35d1a075 --- /dev/null +++ b/CHANGES/+content-href-missing-viewset.bugfix @@ -0,0 +1 @@ +Fixed repository version serialization failing with `LookupError` when the version contains a content type that has no registered viewset. diff --git a/pulpcore/app/models/repository.py b/pulpcore/app/models/repository.py index 1925d549526..37c1b28b061 100644 --- a/pulpcore/app/models/repository.py +++ b/pulpcore/app/models/repository.py @@ -1579,10 +1579,10 @@ def get_content_href(self, request=None): ) ctypes = {c.get_pulp_type(): c for c in repository_model.CONTENT_TYPES} ctype_model = ctypes[self.content_type] - ctype_view = get_view_name_for_model(ctype_model, "list") try: + ctype_view = get_view_name_for_model(ctype_model, "list") ctype_url = reverse(ctype_view, request=request) - except django.urls.exceptions.NoReverseMatch: + except (LookupError, django.urls.exceptions.NoReverseMatch): # We've hit a content type for which there is no viewset. # There's nothing we can do here, except to skip it. return diff --git a/pulpcore/tests/unit/models/test_repository.py b/pulpcore/tests/unit/models/test_repository.py index 8dd566bf6dc..2f014808d6a 100644 --- a/pulpcore/tests/unit/models/test_repository.py +++ b/pulpcore/tests/unit/models/test_repository.py @@ -813,3 +813,22 @@ def test_batch_operations_preserve_correctness(repository, db): assert rvcd_qs.get(count_type=RepositoryVersionContentDetails.PRESENT).count == 40 assert rvcd_qs.filter(count_type=RepositoryVersionContentDetails.ADDED).first() is None assert rvcd_qs.get(count_type=RepositoryVersionContentDetails.REMOVED).count == 60 + + +def test_get_content_href_without_viewset(db, repository, monkeypatch): + """A content type with no registered viewset yields no href instead of raising.""" + + def no_viewset(model_obj, view_action): + raise LookupError(f"Could not determine ViewSet base name for model {model_obj}") + + monkeypatch.setattr(Repository, "CONTENT_TYPES", [Content]) + monkeypatch.setattr("pulpcore.app.models.repository.get_view_name_for_model", no_viewset) + version = RepositoryVersion.objects.create(repository=repository, number=1, complete=True) + count_detail = RepositoryVersionContentDetails.objects.create( + repository_version=version, + content_type=Content.get_pulp_type(), + count_type=RepositoryVersionContentDetails.ADDED, + count=1, + ) + + assert count_detail.get_content_href() is None