Skip to content

Commit 8e8fa2c

Browse files
committed
Handle types correctly for Gramps 6.0
1 parent c395868 commit 8e8fa2c

File tree

2 files changed

+60
-21
lines changed

2 files changed

+60
-21
lines changed

gramps_webapi/api/resources/util.py

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@
5555
)
5656

5757
# from gramps.gen.lib.serialize import to_json
58-
from gramps.gen.lib.json_utils import object_to_string, remove_object
58+
from gramps.gen.lib.json_utils import object_to_dict, object_to_string, remove_object
5959
from gramps.gen.lib.primaryobj import BasicPrimaryObject as GrampsObject
6060
from gramps.gen.plug import BasePluginManager
6161
from gramps.gen.relationship import get_relationship_calculator
@@ -950,36 +950,36 @@ def fix_object_dict(object_dict: dict, class_name: Optional[str] = None):
950950
):
951951
if isinstance(v, str):
952952
if class_name == "Family":
953-
d_out[k] = {
954-
"_class": f"{class_name}RelType",
955-
"string": xml_to_locale(f"{class_name}RelType", v),
956-
}
953+
_class = "FamilyRelType"
954+
obj = gramps.gen.lib.__dict__[_class]()
955+
obj.set_from_xml_str(v)
956+
d_out[k] = object_to_dict(obj)
957957
elif class_name == "RepoRef":
958-
d_out[k] = {
959-
"_class": "SourceMediaType",
960-
"string": xml_to_locale("SourceMediaType", v),
961-
}
958+
_class = "SourceMediaType"
959+
obj = gramps.gen.lib.__dict__[_class]()
960+
obj.set_from_xml_str(v)
961+
d_out[k] = object_to_dict(obj)
962962
else:
963-
d_out[k] = {
964-
"_class": f"{class_name}Type",
965-
"string": xml_to_locale(f"{class_name}Type", v),
966-
}
963+
_class = f"{class_name}Type"
964+
obj = gramps.gen.lib.__dict__[_class]()
965+
obj.set_from_xml_str(v)
966+
d_out[k] = object_to_dict(obj)
967967
else:
968968
d_out[k] = v
969969
elif k == "role":
970970
if isinstance(v, str):
971-
d_out[k] = {
972-
"_class": "EventRoleType",
973-
"string": xml_to_locale("EventRoleType", v),
974-
}
971+
_class = "EventRoleType"
972+
obj = gramps.gen.lib.__dict__[_class]()
973+
obj.set_from_xml_str(v)
974+
d_out[k] = object_to_dict(obj)
975975
else:
976976
d_out[k] = v
977977
elif k == "origintype":
978978
if isinstance(v, str):
979-
d_out[k] = {
980-
"_class": "NameOriginType",
981-
"string": xml_to_locale("NameOriginType", v),
982-
}
979+
_class = "NameOriginType"
980+
obj = gramps.gen.lib.__dict__[_class]()
981+
obj.set_from_xml_str(v)
982+
d_out[k] = object_to_dict(obj)
983983
else:
984984
d_out[k] = v
985985
elif k in ["rect", "mother_handle", "father_handle", "famc"] and not v:

tests/test_endpoints/test_post.py

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -708,3 +708,42 @@ def test_add_people_quota_objects(self):
708708
self.client.delete(f"/api/people/{handle}", headers=headers)
709709
rv = self.client.post("/api/objects/", json=people[:4], headers=headers)
710710
assert rv.status_code == 405
711+
712+
def test_objects_add_person_types(self):
713+
"""Add a person and check that types are handled correctly even
714+
when using incomplete dicts."""
715+
handle_person = make_handle()
716+
person = {
717+
"handle": handle_person,
718+
"primary_name": {
719+
"surname_list": [
720+
{
721+
"surname": "Doe",
722+
}
723+
],
724+
"first_name": "John",
725+
"type": "Married Name",
726+
},
727+
"gender": 1,
728+
}
729+
headers = get_headers(self.client, "admin", "123")
730+
rv = self.client.post("/api/people/", headers=headers)
731+
rv = self.client.get("/api/people/", headers=headers)
732+
handles = [obj["handle"] for obj in rv.json]
733+
# delete existing people
734+
for handle in handles:
735+
self.client.delete(f"/api/people/{handle}", headers=headers)
736+
rv = self.client.post("/api/people/", json=person, headers=headers)
737+
self.assertEqual(rv.status_code, 201)
738+
# check return value
739+
out = rv.json
740+
assert len(out) == 1
741+
rv = self.client.get(
742+
f"/api/people/{handle_person}?extend=event_ref_list&locale=de",
743+
headers=headers,
744+
)
745+
assert rv.status_code == 200
746+
person_dict = rv.json
747+
assert person_dict["primary_name"]["first_name"] == "John"
748+
assert person_dict["primary_name"]["surname_list"][0]["surname"] == "Doe"
749+
assert person_dict["primary_name"]["type"] == "Married Name"

0 commit comments

Comments
 (0)