diff --git a/server/planning/output_formatters/json_planning.py b/server/planning/output_formatters/json_planning.py index 479c55545..a10d2d834 100644 --- a/server/planning/output_formatters/json_planning.py +++ b/server/planning/output_formatters/json_planning.py @@ -11,6 +11,7 @@ from superdesk.publish.formatters import Formatter import superdesk +from apps.archive.common import ARCHIVE import json from superdesk.utils import json_serialize_datetime_objectId from copy import deepcopy @@ -170,11 +171,28 @@ def _expand_delivery(self, coverage): ) deliveries = list(delivery_service.get(req=None, lookup={"coverage_id": coverage.get("coverage_id")})) + # Get the associated article(s) linked to the coverage(s) + query = {"$and": [{"_id": {"$in": [item["item_id"] for item in deliveries]}}]} + articles = {item["_id"]: item for item in get_resource_service(ARCHIVE).get_from_mongo(req=None, lookup=query)} + # Check to see if in this delivery chain, whether the item has been published at least once item_never_published = True for delivery in deliveries: for f in remove_fields: delivery.pop(f, None) + + # TODO: This is a hack, need to find a better way of doing this + # If the linked article was auto-published, then use the ``ingest_id`` for the article ID + # This is required when the article was published using the ``NewsroomNinjsFormatter`` + # Otherwise this coverage in Newshub would point to a non-existing wire item + article = articles.get(delivery["item_id"]) + if ( + article is not None + and article.get("ingest_id") + and (article.get("auto_publish") or (article.get("extra") or {}).get("publish_ingest_id_as_guid")) + ): + delivery["item_id"] = article["ingest_id"] + if delivery.get("item_state") == CONTENT_STATE.PUBLISHED: item_never_published = False diff --git a/server/planning/planning/planning.py b/server/planning/planning/planning.py index 109ecbc7a..02e69b80d 100644 --- a/server/planning/planning/planning.py +++ b/server/planning/planning/planning.py @@ -466,6 +466,9 @@ def get_all_items_in_relationship(self, item): return all_items def remove_coverages(self, updates, original): + if "coverages" not in updates: + return + for coverage in (original or {}).get("coverages") or []: updated_coverage = next( ( @@ -525,6 +528,9 @@ def remove_coverage_entity(self, coverage_entity, original_planning, entity_type self._create_update_assignment(original_planning, {}, updated_coverage_entity, coverage_entity) def add_coverages(self, updates, original): + if "coverages" not in updates: + return + planning_date = original.get("planning_date") or updates.get("planning_date") original_coverage_ids = [ coverage["coverage_id"] for coverage in original.get("coverages") or [] if coverage.get("coverage_id") @@ -606,6 +612,9 @@ def update_scheduled_updates(self, updates, original, coverage, original_coverag self._create_update_assignment(original, updates, s, original_scheduled_update, coverage) def update_coverages(self, updates, original): + if "coverages" not in updates: + return + for coverage in updates.get("coverages") or []: coverage_id = coverage.get("coverage_id") original_coverage = next( diff --git a/server/planning/tests/output_formatters/json_planning_test.py b/server/planning/tests/output_formatters/json_planning_test.py index 3ff9aa94f..52996069c 100644 --- a/server/planning/tests/output_formatters/json_planning_test.py +++ b/server/planning/tests/output_formatters/json_planning_test.py @@ -318,3 +318,35 @@ def test_matching_product_ids(self): output = formatter.format(item, {"name": "Test Subscriber"})[0] output_item = json.loads(output[1]) self.assertEqual(output_item["products"], [{"code": "prod-type-planning", "name": "planning-only"}]) + + def test_expand_delivery_uses_ingest_id(self): + self.app.data.insert("assignments", self.assignment) + self.app.data.insert("delivery", self.delivery) + formatter = JsonPlanningFormatter() + item_id = self.delivery[0]["item_id"] + ingest_id = "urn:newsml:localhost:2024-01-24-ingest-1" + article = { + "_id": item_id, + "type": "text", + "headline": "test headline", + "slugline": "test slugline", + "ingest_id": ingest_id, + } + + self.app.data.insert("archive", [article]) + deliveries, _ = formatter._expand_delivery(deepcopy(self.item["coverages"][0])) + self.assertNotEqual(deliveries[0]["item_id"], ingest_id) + + article = self.app.data.find_one("archive", req=None, _id=item_id) + self.app.data.update("archive", item_id, {"auto_publish": True}, article) + deliveries, _ = formatter._expand_delivery(deepcopy(self.item["coverages"][0])) + self.assertEqual(deliveries[0]["item_id"], ingest_id) + + article = self.app.data.find_one("archive", req=None, _id=item_id) + updates = { + "auto_publish": None, + "extra": {"publish_ingest_id_as_guid": True}, + } + self.app.data.update("archive", item_id, updates, article) + deliveries, _ = formatter._expand_delivery(deepcopy(self.item["coverages"][0])) + self.assertEqual(deliveries[0]["item_id"], ingest_id)