From d84803b47531ec9b7fc6d6b5403d3b47a12a5e7c Mon Sep 17 00:00:00 2001 From: Petr Jasek Date: Wed, 26 Jun 2024 17:26:39 +0200 Subject: [PATCH 1/2] merge template and planning subject when creating item SDBELGA-821 --- server/features/assignments_content.feature | 29 +++++++++++++++---- .../assignments/assignments_content.py | 27 ++++++++++++++++- 2 files changed, 50 insertions(+), 6 deletions(-) diff --git a/server/features/assignments_content.feature b/server/features/assignments_content.feature index 9c72f38b4..6de13cce3 100644 --- a/server/features/assignments_content.feature +++ b/server/features/assignments_content.feature @@ -13,7 +13,12 @@ Feature: Assignment content "data": { "profile": "#content_types._id#", "slugline": "Foo", - "headline": "Headline From Template" + "headline": "Headline From Template", + "subject": [ + {"name": "Template subject", "qcode": "template", "scheme": "templatecv"}, + {"name": "Conflict", "qcode": "conflict", "scheme": "shared"}, + {"name": "Single A", "qcode": "singlea", "scheme": "single"} + ] } } ] @@ -50,7 +55,8 @@ Feature: Assignment content {"is_active": true, "qcode": "ncostat:onreq", "name": "coverage upon request", "label": "On request"} ] - } + }, + {"_id": "single", "selection_type": "single selection"} ] """ When we post to "/planning" @@ -59,7 +65,13 @@ Feature: Assignment content { "item_class": "item class value", "slugline": "test slugline", - "planning_date": "2016-01-02" + "planning_date": "2016-01-02", + "subject": [ + {"name": "Planning subject", "qcode": "planning", "scheme": "planning-cv"}, + {"name": "Conflict", "qcode": "conflict", "scheme": "shared"}, + {"name": "Extra", "qcode": "extra", "scheme": "shared"}, + {"name": "Single B", "qcode": "singleb", "scheme": "single"} + ] } ] """ @@ -188,7 +200,7 @@ Feature: Assignment content @auth @vocabularies - Scenario: Create content with headline and abstract derived from the Assignment + Scenario: Create content will inherit metadata from template and assignment When we patch "/planning/#planning._id#" """ { @@ -243,7 +255,14 @@ Feature: Assignment content "headline": "Headline From Template", "abstract": "

test description

", "profile": "#content_types._id#", - "flags": {"marked_for_not_publication": false, "overide_auto_assign_to_workflow": "__no_value__"} + "flags": {"marked_for_not_publication": false, "overide_auto_assign_to_workflow": "__no_value__"}, + "subject": [ + {"name": "Template subject", "qcode": "template", "scheme": "templatecv"}, + {"name": "Planning subject", "qcode": "planning", "scheme": "planning-cv"}, + {"name": "Conflict", "qcode": "conflict", "scheme": "shared"}, + {"name": "Extra", "qcode": "extra", "scheme": "shared"}, + {"name": "Single A", "qcode": "singlea", "scheme": "single"} + ] } """ diff --git a/server/planning/assignments/assignments_content.py b/server/planning/assignments/assignments_content.py index 5f4878de2..501f39e0f 100644 --- a/server/planning/assignments/assignments_content.py +++ b/server/planning/assignments/assignments_content.py @@ -35,7 +35,7 @@ from planning.signals import assignment_content_create -FIELDS_TO_COPY = ("anpa_category", "subject", "urgency", "place") +FIELDS_TO_COPY = ("anpa_category", "urgency", "place") FIELDS_TO_OVERRIDE = [ "urgency", "slugline", @@ -90,6 +90,8 @@ def get_item_from_assignment(assignment, template=None): if planning.get(field): item[field] = deepcopy(planning[field]) + merge_subject(item, planning) + if assignment.get("description_text"): item["abstract"] = "

{}

".format(assignment["description_text"]) @@ -321,3 +323,26 @@ class AssignmentsContentResource(Resource): item_methods = [] privileges = {"POST": "archive"} + + +def merge_subject(item, planning): + vocabularies = get_resource_service("vocabularies").get_from_mongo( + req=None, lookup={"selection_type": "single selection"}, projection={"_id": 1} + ) + single_value_vocabularies = set([v["_id"] for v in vocabularies]) + subject = item.setdefault("subject", []) + if planning.get("subject"): + for s in planning["subject"]: + if s.get("scheme") in single_value_vocabularies: + if find_subject(subject, s.get("scheme")): + continue + elif find_subject(subject, s.get("scheme"), s.get("qcode")): + continue + + subject.append(s) + + +def find_subject(subject, scheme, qcode=None): + for s in subject: + if s.get("scheme") == scheme and (qcode is None or s.get("qcode") == qcode): + return s From c9850dcf76012ad9341de711b99ab9a775e9adcd Mon Sep 17 00:00:00 2001 From: Petr Jasek Date: Thu, 27 Jun 2024 10:33:41 +0200 Subject: [PATCH 2/2] handle place and category --- server/features/assignments_content.feature | 20 ++++++++++++ .../assignments/assignments_content.py | 31 +++++++++++++------ 2 files changed, 41 insertions(+), 10 deletions(-) diff --git a/server/features/assignments_content.feature b/server/features/assignments_content.feature index 6de13cce3..84cb83c5a 100644 --- a/server/features/assignments_content.feature +++ b/server/features/assignments_content.feature @@ -18,6 +18,12 @@ Feature: Assignment content {"name": "Template subject", "qcode": "template", "scheme": "templatecv"}, {"name": "Conflict", "qcode": "conflict", "scheme": "shared"}, {"name": "Single A", "qcode": "singlea", "scheme": "single"} + ], + "place": [ + {"name": "from template", "qcode": "123"} + ], + "anpa_category": [ + {"name": "from template", "qcode": "cata"} ] } } @@ -71,6 +77,12 @@ Feature: Assignment content {"name": "Conflict", "qcode": "conflict", "scheme": "shared"}, {"name": "Extra", "qcode": "extra", "scheme": "shared"}, {"name": "Single B", "qcode": "singleb", "scheme": "single"} + ], + "place": [ + {"name": "from planning", "qcode": "345"} + ], + "anpa_category": [ + {"name": "from planning", "qcode": "catb"} ] } ] @@ -262,6 +274,14 @@ Feature: Assignment content {"name": "Conflict", "qcode": "conflict", "scheme": "shared"}, {"name": "Extra", "qcode": "extra", "scheme": "shared"}, {"name": "Single A", "qcode": "singlea", "scheme": "single"} + ], + "place": [ + {"name": "from template", "qcode": "123"}, + {"name": "from planning", "qcode": "345"} + ], + "anpa_category": [ + {"name": "from template", "qcode": "cata"}, + {"name": "from planning", "qcode": "catb"} ] } """ diff --git a/server/planning/assignments/assignments_content.py b/server/planning/assignments/assignments_content.py index 501f39e0f..8fac118a7 100644 --- a/server/planning/assignments/assignments_content.py +++ b/server/planning/assignments/assignments_content.py @@ -35,14 +35,13 @@ from planning.signals import assignment_content_create -FIELDS_TO_COPY = ("anpa_category", "urgency", "place") +FIELDS_TO_COPY = ("urgency",) FIELDS_TO_OVERRIDE = [ "urgency", "slugline", "ednote", "abstract", "headline", - "ednote", "language", ] @@ -91,6 +90,8 @@ def get_item_from_assignment(assignment, template=None): item[field] = deepcopy(planning[field]) merge_subject(item, planning) + merge_list("place", item, planning) + merge_list("anpa_category", item, planning) if assignment.get("description_text"): item["abstract"] = "

{}

".format(assignment["description_text"]) @@ -326,20 +327,30 @@ class AssignmentsContentResource(Resource): def merge_subject(item, planning): + if not planning.get("subject"): + return + subject = item.setdefault("subject", []) vocabularies = get_resource_service("vocabularies").get_from_mongo( req=None, lookup={"selection_type": "single selection"}, projection={"_id": 1} ) single_value_vocabularies = set([v["_id"] for v in vocabularies]) - subject = item.setdefault("subject", []) - if planning.get("subject"): - for s in planning["subject"]: - if s.get("scheme") in single_value_vocabularies: - if find_subject(subject, s.get("scheme")): - continue - elif find_subject(subject, s.get("scheme"), s.get("qcode")): + for s in planning["subject"]: + if s.get("scheme") in single_value_vocabularies: + if find_subject(subject, s.get("scheme")): continue + elif find_subject(subject, s.get("scheme"), s.get("qcode")): + continue + + subject.append(s) + - subject.append(s) +def merge_list(field, item, planning): + if not planning.get(field): + return + item_values = item.setdefault(field, []) + for value in planning.get(field): + if value.get("qcode") not in set([v.get("qcode") for v in item_values]): + item_values.append(value) def find_subject(subject, scheme, qcode=None):