Revised Handle class; added get_dependencies; revised Struct class to allow changes
This commit is contained in:
parent
b0517d0ee4
commit
49b7c09cea
@ -22,29 +22,17 @@
|
|||||||
|
|
||||||
from gramps.gen.constfunc import UNITYPE
|
from gramps.gen.constfunc import UNITYPE
|
||||||
|
|
||||||
class Handle:
|
class HandleClass(str):
|
||||||
def __init__(self, classname, handle):
|
def __init__(self, handle):
|
||||||
""" Class to hold type and handle of referenced item """
|
super(HandleClass, self).__init__()
|
||||||
self.classname = classname
|
|
||||||
if handle and not isinstance(handle, UNITYPE):
|
def Handle(classname, handle):
|
||||||
handle = handle.decode('utf-8')
|
if handle is None:
|
||||||
self.handle = handle
|
return None
|
||||||
|
h = HandleClass(handle)
|
||||||
|
h.classname = classname
|
||||||
|
return h
|
||||||
|
|
||||||
def __repr__(self):
|
def __from_struct(struct):
|
||||||
return str({"_class": "Handle",
|
return struct
|
||||||
"handle": self.handle})
|
Handle.from_struct = __from_struct
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
if self.handle:
|
|
||||||
return self.handle
|
|
||||||
else:
|
|
||||||
return "None"
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def from_struct(cls, struct):
|
|
||||||
if isinstance(struct, Handle):
|
|
||||||
return struct.handle
|
|
||||||
elif isinstance(struct, dict):
|
|
||||||
return struct["handle"]
|
|
||||||
else:
|
|
||||||
return struct
|
|
||||||
|
@ -31,7 +31,7 @@ from ..dbstate import DbState
|
|||||||
from gramps.cli.grampscli import CLIManager
|
from gramps.cli.grampscli import CLIManager
|
||||||
from ..plug import BasePluginManager
|
from ..plug import BasePluginManager
|
||||||
from ..db.dictionary import DictionaryDb
|
from ..db.dictionary import DictionaryDb
|
||||||
from gramps.gen.lib.handle import Handle
|
from gramps.gen.lib.handle import HandleClass
|
||||||
from ..const import GRAMPS_LOCALE as glocale
|
from ..const import GRAMPS_LOCALE as glocale
|
||||||
from ..constfunc import handle2internal
|
from ..constfunc import handle2internal
|
||||||
_ = glocale.translation.gettext
|
_ = glocale.translation.gettext
|
||||||
@ -87,9 +87,6 @@ def diff_items(path, json1, json2):
|
|||||||
"""
|
"""
|
||||||
if json1 == json2:
|
if json1 == json2:
|
||||||
return False
|
return False
|
||||||
elif isinstance(json1, Handle) and isinstance(json2, Handle):
|
|
||||||
return not (json1.classname == json2.classname and
|
|
||||||
json1.handle == json2.handle)
|
|
||||||
elif isinstance(json1, list) and isinstance(json2, list):
|
elif isinstance(json1, list) and isinstance(json2, list):
|
||||||
if len(json1) != len(json2):
|
if len(json1) != len(json2):
|
||||||
return True
|
return True
|
||||||
@ -214,6 +211,26 @@ def from_struct(struct):
|
|||||||
return Tag.create(Tag.from_struct(struct))
|
return Tag.create(Tag.from_struct(struct))
|
||||||
raise AttributeError("invalid struct")
|
raise AttributeError("invalid struct")
|
||||||
|
|
||||||
|
def get_dependencies(struct):
|
||||||
|
"""
|
||||||
|
Walk the struct recursively, getting all dependencies on other
|
||||||
|
objects.
|
||||||
|
"""
|
||||||
|
if isinstance(struct, HandleClass):
|
||||||
|
return [(struct.classname, str(struct))]
|
||||||
|
elif isinstance(struct, (tuple, list)):
|
||||||
|
retval = []
|
||||||
|
for item in struct:
|
||||||
|
retval.extend(get_dependencies(item))
|
||||||
|
return retval
|
||||||
|
elif isinstance(struct, dict):
|
||||||
|
retval = []
|
||||||
|
for key in struct.keys():
|
||||||
|
retval.extend(get_dependencies(struct[key]))
|
||||||
|
return retval
|
||||||
|
else:
|
||||||
|
return []
|
||||||
|
|
||||||
class Struct(object):
|
class Struct(object):
|
||||||
"""
|
"""
|
||||||
Class for getting and setting parts of a struct by dotted path.
|
Class for getting and setting parts of a struct by dotted path.
|
||||||
@ -228,6 +245,7 @@ class Struct(object):
|
|||||||
def __init__(self, struct, db=None):
|
def __init__(self, struct, db=None):
|
||||||
self.struct = struct
|
self.struct = struct
|
||||||
self.db = db
|
self.db = db
|
||||||
|
self.transaction = db.get_transaction_class()
|
||||||
|
|
||||||
def __getitem__(self, path):
|
def __getitem__(self, path):
|
||||||
"""
|
"""
|
||||||
@ -283,6 +301,22 @@ class Struct(object):
|
|||||||
else:
|
else:
|
||||||
return
|
return
|
||||||
# update the database
|
# update the database
|
||||||
|
if self.db:
|
||||||
|
self.update_db()
|
||||||
|
|
||||||
|
def update_db(self):
|
||||||
|
name = self.struct["_class"]
|
||||||
|
handle = self.struct["handle"]
|
||||||
|
obj = self.db.get_from_name_and_handle(name, handle)
|
||||||
|
new_obj = from_struct(self.struct)
|
||||||
|
with self.transaction("Struct Update", self.db) as trans:
|
||||||
|
if obj:
|
||||||
|
commit_func = self.db._tables[name]["commit_func"]
|
||||||
|
commit_func(new_obj, trans)
|
||||||
|
else:
|
||||||
|
add_func = self.db._tables[name]["add_func"]
|
||||||
|
add_func(new_obj, trans)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return str(self.struct)
|
return str(self.struct)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user