From 0414d26a97a88051010bb542906d31e898053ca8 Mon Sep 17 00:00:00 2001 From: Hiroyasu OHYAMA Date: Mon, 18 Dec 2023 19:04:26 +0900 Subject: [PATCH 1/3] Added an ID attribute to Entry exported yaml data for importing its data This is necessary when import Entries using data that is exported from AirOne, because previous implementation doesn't write Entry-ID attribute to export data. Import processing couldn't understand which Entry is updated Entry or new created one. This commit fixed that processing by adding Entry ID to export data. --- CHANGELOG.md | 2 ++ dashboard/tasks.py | 1 + dashboard/tests/test_view.py | 3 +++ entry/models.py | 4 ++-- entry/tasks.py | 1 + entry/tests/test_api_v2.py | 4 ++-- entry/tests/test_model.py | 3 +++ 7 files changed, 14 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ab41511dc..7c719eb40 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,8 @@ ### Added ### Changed +* Added an ID attribute to Entry exported yaml data for importing its data. + Contributed by @userlocalhost ### Fixed diff --git a/dashboard/tasks.py b/dashboard/tasks.py index d662926ce..2ae2e22cc 100644 --- a/dashboard/tasks.py +++ b/dashboard/tasks.py @@ -127,6 +127,7 @@ def _get_attr_value(atype: int, value: dict): resp_data: dict = {} for index, entry_info in enumerate(values): data: dict = { + "id": entry_info["entry"]["id"], "name": entry_info["entry"]["name"], "attrs": {}, } diff --git a/dashboard/tests/test_view.py b/dashboard/tests/test_view.py index 104115791..3391e7a29 100644 --- a/dashboard/tests/test_view.py +++ b/dashboard/tests/test_view.py @@ -1256,6 +1256,7 @@ def test_yaml_export(self): "date": {"type": AttrTypeValue["date"], "value": date(2020, 1, 1)}, } entities = [] + test_entries = [] for index in range(2): entity = Entity.objects.create(name="Entity-%d" % index, created_user=user) for attr_name, info in attr_info.items(): @@ -1283,6 +1284,7 @@ def test_yaml_export(self): attrv = attr.add_value(user, info["value"]) entry.register_es() + test_entries.append(entry) entities.append(entity) @@ -1308,6 +1310,7 @@ def test_yaml_export(self): len(resp_data[entity.name]), Entry.objects.filter(schema=entity).count() ) for e_data in resp_data[entity.name]: + self.assertTrue(e_data["id"] in [x.id for x in test_entries]) self.assertTrue(e_data["name"] in ["e-0", "e-1"]) self.assertTrue(all([x in attr_info.keys() for x in e_data["attrs"]])) diff --git a/entry/models.py b/entry/models.py index 2c2048f6d..2448de46c 100644 --- a/entry/models.py +++ b/entry/models.py @@ -1747,7 +1747,7 @@ def export(self, user): else: attrinfo[attr.schema.name] = None - return {"name": self.name, "attrs": attrinfo} + return {"id": self.id, "name": self.name, "attrs": attrinfo} def export_v2(self, user, with_entity: bool = False) -> dict: attrinfo = [] @@ -1790,7 +1790,7 @@ def export_v2(self, user, with_entity: bool = False) -> dict: } ) - return {"name": self.name, "attrs": attrinfo} + return {"id": self.id, "name": self.name, "attrs": attrinfo} # NOTE: Type-Write def get_es_document(self, es=None, entity_attrs=None): diff --git a/entry/tasks.py b/entry/tasks.py index 5e6f92be1..5c10b10cc 100644 --- a/entry/tasks.py +++ b/entry/tasks.py @@ -321,6 +321,7 @@ def _get_attr_value(atype: int, value: dict): resp_data: List[ExportedEntityEntries] = [] for index, entry_info in enumerate(values): data: ExportedEntry = { + "id": entry_info["entry"]["id"], "name": entry_info["entry"]["name"], "attrs": [], } diff --git a/entry/tests/test_api_v2.py b/entry/tests/test_api_v2.py index 74807aa75..d825b4ea8 100644 --- a/entry/tests/test_api_v2.py +++ b/entry/tests/test_api_v2.py @@ -4155,7 +4155,7 @@ def test_export_advanced_search_result_with_no_value(self): "entry.tasks.export_search_result_v2.delay", Mock(side_effect=tasks.export_search_result_v2) ) def test_export_with_all_entities(self): - self.add_entry(self.user, "Entry", self.entity, values={"val": "hoge"}) + test_entry = self.add_entry(self.user, "Entry", self.entity, values={"val": "hoge"}) resp = self.client.post( "/entry/api/v2/advanced_search_result_export/", @@ -4202,7 +4202,7 @@ def test_export_with_all_entities(self): [ { "entity": "test-entity", - "entries": [{"attrs": [{"name": "val", "value": "hoge"}], "name": "Entry"}], + "entries": [{"attrs": [{"name": "val", "value": "hoge"}], "name": "Entry", "id": test_entry.id}], } ], ) diff --git a/entry/tests/test_model.py b/entry/tests/test_model.py index 75aa0a982..5739b62df 100644 --- a/entry/tests/test_model.py +++ b/entry/tests/test_model.py @@ -1865,6 +1865,8 @@ def test_export_entry(self): ) exported_data = entry.export(user) self.assertTrue("new_attr" in exported_data["attrs"]) + self.assertEqual(exported_data["id"], entry.id) + self.assertEqual(exported_data["name"], entry.name) def test_export_entry_v2(self): user = User.objects.create(username="hoge") @@ -1901,6 +1903,7 @@ def test_export_entry_v2(self): entry.attrs.get(name="str2").add_value(user, "bar") exported_data = entry.export_v2(user) + self.assertEqual(exported_data["id"], entry.id) self.assertEqual(exported_data["name"], entry.name) self.assertEqual( len(exported_data["attrs"]), From 24e51f8ec22daacc0c3537138a35e6184f2cd3c9 Mon Sep 17 00:00:00 2001 From: Hiroyasu OHYAMA Date: Mon, 18 Dec 2023 19:07:15 +0900 Subject: [PATCH 2/3] Run ruff to be compatible with PEP8 --- entry/tests/test_api_v2.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/entry/tests/test_api_v2.py b/entry/tests/test_api_v2.py index d825b4ea8..0d7e8fadd 100644 --- a/entry/tests/test_api_v2.py +++ b/entry/tests/test_api_v2.py @@ -4202,7 +4202,13 @@ def test_export_with_all_entities(self): [ { "entity": "test-entity", - "entries": [{"attrs": [{"name": "val", "value": "hoge"}], "name": "Entry", "id": test_entry.id}], + "entries": [ + { + "attrs": [{"name": "val", "value": "hoge"}], + "name": "Entry", + "id": test_entry.id, + } + ], } ], ) From 4332200c4d8b4b83c756a4632fedafb21c273e41 Mon Sep 17 00:00:00 2001 From: Hiroyasu OHYAMA Date: Tue, 19 Dec 2023 10:21:45 +0900 Subject: [PATCH 3/3] Updated type-hint because of previous commit that add another attribute to ExportedEntry --- entry/tasks.py | 1 + 1 file changed, 1 insertion(+) diff --git a/entry/tasks.py b/entry/tasks.py index 5c10b10cc..66bf42029 100644 --- a/entry/tasks.py +++ b/entry/tasks.py @@ -41,6 +41,7 @@ class ExportedEntryAttribute(TypedDict): class ExportedEntry(TypedDict): + id: int name: str attrs: list[ExportedEntryAttribute] referrals: NotRequired[list[dict]] # same as ExportedEntityEntries, avoiding cycle definition