diff --git a/gramps/gen/db/dictionary.py b/gramps/gen/db/dictionary.py index 76b2015c3..463d53dcc 100644 --- a/gramps/gen/db/dictionary.py +++ b/gramps/gen/db/dictionary.py @@ -991,3 +991,33 @@ class DictionaryDb(DbWriteBase, DbReadBase): Get the transaction class associated with this database backend. """ return DictionaryTxn + + def get_from_name_and_handle(self, table_name, handle): + """ + Returns a gen.lib object (or None) given table_name and + handle. + + Examples: + + >>> self.get_from_name_and_handle("Person", "a7ad62365bc652387008") + >>> self.get_from_name_and_handle("Media", "c3434653675bcd736f23") + """ + if table_name in self._tables: + return self._tables[table_name]["handle_func"](handle) + return None + + def get_from_name_and_gramps_id(self, table_name, gramps_id): + """ + Returns a gen.lib object (or None) given table_name and + Gramps ID. + + Examples: + + >>> self.get_from_name_and_gramps_id("Person", "I00002") + >>> self.get_from_name_and_gramps_id("Family", "F056") + >>> self.get_from_name_and_gramps_id("Media", "M00012") + """ + if table_name in self._tables: + return self._tables[table_name]["gramps_id_func"](gramps_id) + return None + diff --git a/gramps/gen/lib/test/struct_test.py b/gramps/gen/lib/test/struct_test.py index bfb837f21..49cc6cf86 100644 --- a/gramps/gen/lib/test/struct_test.py +++ b/gramps/gen/lib/test/struct_test.py @@ -26,6 +26,7 @@ from .. import (Person, Family, Event, Source, Place, Citation, Repository, MediaObject, Note, Tag) from gramps.gen.merge.diff import import_as_dict, from_struct from gramps.cli.user import User +from gramps.gen.merge.diff import * class BaseCheck: def test_from_struct(self): @@ -98,7 +99,7 @@ def generate_test(obj): serialized = obj.__class__.from_struct(struct) def test(self): self.assertEqual(obj.serialize(), serialized) - name = "test_%s_%s" % (obj.__class__.__name__, obj.handle) + name = "test_serialize_%s_%s" % (obj.__class__.__name__, obj.handle) setattr(DatabaseCheck, name, test) #### def test2(self): @@ -112,5 +113,18 @@ for table in db._tables.keys(): obj = db._tables[table]["handle_func"](handle) generate_test(obj) +class StructTest(unittest.TestCase): + def test(self): + family = db.get_family_from_gramps_id("F0001") + s = Struct(family.to_struct(), db) + self.assertEqual(s["gramps_id"], "F0001") + s["gramps_id"] = "TEST" + self.assertEqual(s["gramps_id"], "TEST") + self.assertEqual(s["father_handle.primary_name.first_name"], + "Allen Carl") + s["father_handle.primary_name.first_name"] = "Edward" + self.assertEqual(s["father_handle.primary_name.first_name"], + "Edward") + if __name__ == "__main__": unittest.main() diff --git a/gramps/gen/merge/diff.py b/gramps/gen/merge/diff.py index 608d7d533..b884f85a7 100644 --- a/gramps/gen/merge/diff.py +++ b/gramps/gen/merge/diff.py @@ -372,7 +372,7 @@ class Struct(object): part = path[p] struct = self.getitem(part, struct) if isinstance(struct, Struct): - return struct.setitem_from_path(path[p+1:], value) + return struct.setitem_from_path(path[p+1:] + [item], value) if struct is None: return None # struct is set