diff --git a/partner_programs/solution_publication_api.py b/partner_programs/solution_publication_api.py index 43e66fbc..c6f806b8 100644 --- a/partner_programs/solution_publication_api.py +++ b/partner_programs/solution_publication_api.py @@ -31,7 +31,7 @@ def finalize_response(self, request, response, *args, **kwargs): return response def program(self, pk): - program = program_for(pk) + program = getattr(self, "visibility_program", None) or program_for(pk) if program.draft or program.solution_storage_mode != "solution": raise Http404 return program diff --git a/partner_programs/tests/test_dev_publication_audit.py b/partner_programs/tests/test_dev_publication_audit.py index ad0ca1d2..5e0de736 100644 --- a/partner_programs/tests/test_dev_publication_audit.py +++ b/partner_programs/tests/test_dev_publication_audit.py @@ -47,6 +47,10 @@ def test_all_program_audit_checks_eligible_closed_and_draft_without_business_edi for key, value in changes.items(): setattr(program, key, value) program.save() + create_partner_program( + solution_storage_mode="solution", draft=True, + datetime_started=None, datetime_finished=None, datetime_registration_ends=None, + ) with patch.dict(os.environ, VERIFY_EXPECTED_API_SHA="a" * 40, VERIFY_PHASE="verify_publication"): with patch("builtins.print") as output: main() diff --git a/partner_programs/tests/test_published_projects_api.py b/partner_programs/tests/test_published_projects_api.py index 563830d3..f776dad3 100644 --- a/partner_programs/tests/test_published_projects_api.py +++ b/partner_programs/tests/test_published_projects_api.py @@ -111,7 +111,10 @@ def test_flag_future_draft_and_solution_mode_do_not_open_legacy_reader(self): self.read(f"/programs/{program.pk}/published-projects/").status_code, 404, ) - self.assertEqual(self.read(f"/programs/{program.pk}/").status_code, 200) + self.assertEqual( + self.read(f"/programs/{program.pk}/").status_code, + 404 if program.draft else 200, + ) self.assertIn(self.read(f"/projects/{hidden.pk}/").status_code, (401, 403)) hidden.refresh_from_db() self.assertFalse(hidden.is_public) diff --git a/partner_programs/tests/test_solution_publication.py b/partner_programs/tests/test_solution_publication.py index 3b7aec99..e3406f4f 100644 --- a/partner_programs/tests/test_solution_publication.py +++ b/partner_programs/tests/test_solution_publication.py @@ -198,7 +198,7 @@ def test_first_list_at_deadline_and_late_flag_enable_are_immediate(self): def test_program_page_publishes_and_draft_program_stays_private(self): PartnerProgram.objects.filter(pk=self.program.pk).update(draft=True) self.assertEqual(APIClient().get(self.public_url).status_code, 404) - self.assertEqual(APIClient().get(f"/programs/{self.program.pk}/").status_code, 200) + self.assertEqual(APIClient().get(f"/programs/{self.program.pk}/").status_code, 404) self.assertEqual(self.publish(), 0) self.solution.refresh_from_db() self.assertIsNone(self.solution.published_at) diff --git a/scripts/verify_program_publication_dev.py b/scripts/verify_program_publication_dev.py index da2efbb2..79ec0b55 100644 --- a/scripts/verify_program_publication_dev.py +++ b/scripts/verify_program_publication_dev.py @@ -126,7 +126,7 @@ def all_ids(path, kind): and program.datetime_finished <= now ) # The ordinary program page must be sufficient; no task/service call here. - read(root) + read(root, 404 if program.draft else 200) if program.solution_storage_mode == "legacy_project": path = root + "published-projects/" if due: @@ -156,11 +156,12 @@ def all_ids(path, kind): assert set(material) == {"application", "published_at", "fields", "answers", "team"} assert material["application"]["program_id"] == program.pk assert material["application"]["solution_id"] == pk - read(root + "projects/", 401) + read(root + "projects/", 404 if program.draft else 401) results.append(dict( program_id=program.pk, mode=program.solution_storage_mode, draft=program.draft, publication_enabled=program.publish_projects_after_finish, - finished=program.datetime_finished <= now, published_count=len(actual), + finished=bool(program.datetime_finished and program.datetime_finished <= now), + published_count=len(actual), )) assert dict(Project.objects.values_list("pk", "is_public")) == expected_projects @@ -169,7 +170,7 @@ def all_ids(path, kind): assert after == before, "Non-publication data changed" # Repeat every program request; original publication timestamps must survive. for program in programs: - read(f"/programs/{program.pk}/") + read(f"/programs/{program.pk}/", 404 if program.draft else 200) assert dict(Project.objects.values_list("pk", "is_public")) == expected_projects assert dict(ProgramSolution.all_objects.values_list("pk", "published_at")) == expected_solutions assert snapshot() == before diff --git a/scripts/verify_program_solutions_dev.py b/scripts/verify_program_solutions_dev.py index 0c62dd45..6fc26f90 100644 --- a/scripts/verify_program_solutions_dev.py +++ b/scripts/verify_program_solutions_dev.py @@ -384,7 +384,7 @@ def request(actor, method, path, body=None, expected=200, binary=False): request(None, "get", f"/projects/{work.pk}/") checks.append("legacy-immediate-publication-without-job-only-is-public-changed") for old in PartnerProgram.objects.filter(pk__in=legacy_before).order_by("pk"): - request(None, "get", f"/programs/{old.pk}/") + request(None, "get", f"/programs/{old.pk}/", expected=404 if old.draft else 200) manager = old.managers.first() if manager is not None: request(manager, "get", f"/programs/{old.pk}/management/projects/")