diff --git a/openslides/motions/projector.py b/openslides/motions/projector.py index e67cb1923..9a02d1b21 100644 --- a/openslides/motions/projector.py +++ b/openslides/motions/projector.py @@ -31,6 +31,7 @@ def get_state( f"motion {motion['id']} can not be on the state with id {state_id}" ) + def get_amendment_merge_into_motion(all_data, motion, amendment): """ HINT: This implementation should be consistent to isAccepted() in ViewMotionAmendedParagraph.ts @@ -38,33 +39,38 @@ def get_amendment_merge_into_motion(all_data, motion, amendment): if amendment["state_id"] is None: return 0 - state = get_state( - all_data, motion, amendment["state_id"] - ) - if state["merge_amendment_into_final"] == -1 or state["merge_amendment_into_final"] == 1: + state = get_state(all_data, motion, amendment["state_id"]) + if ( + state["merge_amendment_into_final"] == -1 + or state["merge_amendment_into_final"] == 1 + ): return state["merge_amendment_into_final"] if amendment["recommendation_id"] is None: return 0 - recommendation = get_state( - all_data, motion, amendment["recommendation_id"] - ) + recommendation = get_state(all_data, motion, amendment["recommendation_id"]) return recommendation["merge_amendment_into_final"] + def get_amendments_for_motion(motion, all_data): amendment_data = [] for amendment_id, amendment in all_data["motions/motion"].items(): if amendment["parent_id"] == motion["id"]: - merge_amendment_into_final = get_amendment_merge_into_motion(all_data, motion, amendment) - amendment_data.append({ - "id": amendment["id"], - "identifier": amendment["identifier"], - "title": amendment["title"], - "amendment_paragraphs": amendment["amendment_paragraphs"], - "merge_amendment_into_final": merge_amendment_into_final, - }) + merge_amendment_into_final = get_amendment_merge_into_motion( + all_data, motion, amendment + ) + amendment_data.append( + { + "id": amendment["id"], + "identifier": amendment["identifier"], + "title": amendment["title"], + "amendment_paragraphs": amendment["amendment_paragraphs"], + "merge_amendment_into_final": merge_amendment_into_final, + } + ) return amendment_data + def get_amendment_base_motion(amendment, all_data): try: motion = all_data["motions/motion"][amendment["parent_id"]] @@ -78,17 +84,18 @@ def get_amendment_base_motion(amendment, all_data): "text": motion["text"], } + def get_amendment_base_statute(amendment, all_data): try: - statute = all_data["motions/statute-paragraph"][amendment["statute_paragraph_id"]] + statute = all_data["motions/statute-paragraph"][ + amendment["statute_paragraph_id"] + ] except KeyError: statute_id = amendment["statute_paragraph_id"] raise ProjectorElementException(f"statute with id {statute_id} does not exist") - return { - "title": statute["title"], - "text": statute["text"], - } + return {"title": statute["title"], "text": statute["text"]} + def motion_slide(all_data: AllData, element: Dict[str, Any]) -> Dict[str, Any]: """ @@ -109,7 +116,7 @@ def motion_slide(all_data: AllData, element: Dict[str, Any]) -> Dict[str, Any]: * change_recommendations * submitter """ - mode = element.get("mode", "original") + mode = element.get("mode", get_config(all_data, "motions_recommendation_text_mode")) motion_id = element.get("id") if motion_id is None: @@ -126,9 +133,8 @@ def motion_slide(all_data: AllData, element: Dict[str, Any]) -> Dict[str, Any]: motions_preamble = get_config(all_data, "motions_preamble") if motion["statute_paragraph_id"]: - print("statute") - change_recommendations = [] - amendments = [] + change_recommendations = [] # type: ignore + amendments = [] # type: ignore base_motion = None base_statute = get_amendment_base_statute(motion, all_data) elif bool(motion["parent_id"]) and motion["amendment_paragraphs"]: @@ -137,7 +143,11 @@ def motion_slide(all_data: AllData, element: Dict[str, Any]) -> Dict[str, Any]: base_motion = get_amendment_base_motion(motion, all_data) base_statute = None else: - change_recommendations = list(filter(lambda reco: reco["internal"] == False, motion["change_recommendations"])) + change_recommendations = list( + filter( + lambda reco: reco["internal"] is False, motion["change_recommendations"] + ) + ) amendments = get_amendments_for_motion(motion, all_data) base_motion = None base_statute = None diff --git a/tests/unit/motions/test_projector.py b/tests/unit/motions/test_projector.py index af1fcd1ce..c4311d031 100644 --- a/tests/unit/motions/test_projector.py +++ b/tests/unit/motions/test_projector.py @@ -74,7 +74,99 @@ def all_data(): "weight": 10000, "created": "2019-01-19T18:37:34.741336+01:00", "last_modified": "2019-01-19T18:37:34.741368+01:00", - } + "change_recommendations": [ + { + "id": 1, + "motion_id": 1, + "rejected": False, + "internal": True, + "type": 0, + "other_description": "", + "line_from": 1, + "line_to": 2, + "text": "internal new motion text", + "creation_time": "2019-02-09T09:54:06.256378+01:00", + }, + { + "id": 2, + "motion_id": 1, + "rejected": False, + "internal": False, + "type": 0, + "other_description": "", + "line_from": 1, + "line_to": 2, + "text": "public new motion text", + "creation_time": "2019-02-09T09:54:06.256378+01:00", + }, + ], + }, + 2: { + "id": 2, + "identifier": "Ä1", + "title": "Amendment for 12345", + "text": "", + "amendment_paragraphs": ["New motion text"], + "modified_final_version": "", + "reason": "", + "parent_id": 1, + "category_id": None, + "comments": [], + "motion_block_id": None, + "origin": "", + "submitters": [{"id": 4, "user_id": 1, "motion_id": 1, "weight": 1}], + "supporters_id": [], + "state_id": 1, + "state_extension": None, + "state_access_level": 0, + "statute_paragraph_id": None, + "workflow_id": 1, + "recommendation_id": None, + "recommendation_extension": None, + "tags_id": [], + "attachments_id": [], + "polls": [], + "agenda_item_id": 4, + "log_messages": [], + "sort_parent_id": None, + "weight": 10000, + "created": "2019-01-19T18:37:34.741336+01:00", + "last_modified": "2019-01-19T18:37:34.741368+01:00", + "change_recommendations": [], + }, + 3: { + "id": 3, + "identifier": None, + "title": "Statute amendment for §1 Preamble", + "text": "
Some other preamble text
", + "amendment_paragraphs": None, + "modified_final_version": "", + "reason": "", + "parent_id": None, + "category_id": None, + "comments": [], + "motion_block_id": None, + "origin": "", + "submitters": [{"id": 4, "user_id": 1, "motion_id": 1, "weight": 1}], + "supporters_id": [], + "state_id": 1, + "state_extension": None, + "state_access_level": 0, + "statute_paragraph_id": 1, + "workflow_id": 1, + "recommendation_id": None, + "recommendation_extension": None, + "tags_id": [], + "attachments_id": [], + "polls": [], + "agenda_item_id": 4, + "log_messages": [], + "sort_parent_id": None, + "weight": 10000, + "created": "2019-01-19T18:37:34.741336+01:00", + "last_modified": "2019-01-19T18:37:34.741368+01:00", + "change_recommendations": [], + }, } return_value["motions/workflow"] = { 1: { @@ -149,6 +241,14 @@ def all_data(): "first_state_id": 1, } } + return_value["motions/statute-paragraph"] = { + 1: { + "id": 1, + "title": "§1 Preamble", + "text": "Some preamble text
", + "weight": 10000, + } + } return_value["motions/motion-change-recommendation"] = {} return return_value @@ -162,9 +262,85 @@ def test_motion_slide(all_data): "identifier": "4", "title": "12345", "text": "motion text", + "amendments": [ + { + "id": 2, + "title": "Amendment for 12345", + "amendment_paragraphs": ["New motion text"], + "identifier": "Ä1", + "merge_amendment_into_final": 0, + } + ], "amendment_paragraphs": None, + "change_recommendations": [ + { + "id": 2, + "motion_id": 1, + "rejected": False, + "internal": False, + "type": 0, + "other_description": "", + "line_from": 1, + "line_to": 2, + "text": "public new motion text", + "creation_time": "2019-02-09T09:54:06.256378+01:00", + } + ], + "base_motion": None, + "base_statute": None, "is_child": False, "show_meta_box": True, "reason": "", "submitter": ["Administrator"], + "line_length": 90, + "line_numbering_mode": "none", + "preamble": "The assembly may decide:", + } + + +def test_amendment_slide(all_data): + element: Dict[str, Any] = {"id": 2} + + data = projector.motion_slide(all_data, element) + + assert data == { + "identifier": "Ä1", + "title": "Amendment for 12345", + "text": "", + "amendments": [], + "amendment_paragraphs": ["New motion text"], + "change_recommendations": [], + "base_motion": {"identifier": "4", "text": "motion text", "title": "12345"}, + "base_statute": None, + "is_child": True, + "show_meta_box": True, + "reason": "", + "submitter": ["Administrator"], + "line_length": 90, + "line_numbering_mode": "none", + "preamble": "The assembly may decide:", + } + + +def test_statute_amendment_slide(all_data): + element: Dict[str, Any] = {"id": 3} + + data = projector.motion_slide(all_data, element) + + assert data == { + "identifier": None, + "title": "Statute amendment for §1 Preamble", + "text": "Some other preamble text
", + "amendments": [], + "amendment_paragraphs": None, + "change_recommendations": [], + "base_motion": None, + "base_statute": {"title": "§1 Preamble", "text": "Some preamble text
"}, + "is_child": False, + "show_meta_box": True, + "reason": "", + "submitter": ["Administrator"], + "line_length": 90, + "line_numbering_mode": "none", + "preamble": "The assembly may decide:", }