diff --git a/src/gen/proxy/living.py b/src/gen/proxy/living.py index 04cefa223..db27bc0ab 100644 --- a/src/gen/proxy/living.py +++ b/src/gen/proxy/living.py @@ -282,5 +282,6 @@ class LivingProxyDb(ProxyDbBase): new_person.set_family_handle_list(person.get_family_handle_list()) new_person.set_parent_family_handle_list( person.get_parent_family_handle_list() ) + new_person.set_tag_list(person.get_tag_list()) return new_person diff --git a/src/gen/proxy/private.py b/src/gen/proxy/private.py index 8e05788d8..77b47ff63 100644 --- a/src/gen/proxy/private.py +++ b/src/gen/proxy/private.py @@ -816,6 +816,9 @@ def sanitize_person(db, person): copy_notes(db, person, new_person) copy_associations(db, person, new_person) + # copy tags + new_person.set_tag_list(person.get_tag_list()) + return new_person def sanitize_source(db, source): diff --git a/src/gen/proxy/proxybase.py b/src/gen/proxy/proxybase.py index be358e235..e1eec4af4 100644 --- a/src/gen/proxy/proxybase.py +++ b/src/gen/proxy/proxybase.py @@ -99,6 +99,7 @@ class ProxyDbBase(DbReadBase): include_media_object = \ include_repository = \ include_note = \ + include_tag = \ None def get_person_handles(self, sort_handles=True): @@ -181,6 +182,16 @@ class ProxyDbBase(DbReadBase): else: return [] + def get_tag_handles(self, sort_handles=True): + """ + Return a list of database handles, one handle for each Tag in + the database. + """ + if self.db.is_open: + return list(self.iter_tag_handles()) + else: + return [] + def get_default_person(self): """returns the default Person of the database""" return self.db.get_default_person() @@ -245,6 +256,13 @@ class ProxyDbBase(DbReadBase): """ return ifilter(self.include_note, self.db.iter_note_handles()) + def iter_tag_handles(self): + """ + Return an iterator over database handles, one handle for each Tag in + the database. + """ + return ifilter(self.include_tag, self.db.iter_tag_handles()) + @staticmethod def __iter_object(filter, method): """ Helper function to return an iterator over an object class """ @@ -301,6 +319,12 @@ class ProxyDbBase(DbReadBase): """ return self.__iter_object(self.include_note, self.db.iter_notes) + def iter_tags(self): + """ + Return an iterator over Tag objects in the database + """ + return self.__iter_object(self.include_tag, self.db.iter_tags) + @staticmethod def gfilter(predicate, obj): """ @@ -398,6 +422,14 @@ class ProxyDbBase(DbReadBase): return self.gfilter(self.include_note, self.db.get_note_from_handle(handle)) + def get_tag_from_handle(self, handle): + """ + Finds a Tag in the database from the passed gramps handle. + If no such Tag exists, None is returned. + """ + return self.gfilter(self.include_tag, + self.db.get_tag_from_handle(handle)) + def get_person_from_gramps_id(self, val): """ Finds a Person in the database from the passed GRAMPS ID. @@ -462,6 +494,14 @@ class ProxyDbBase(DbReadBase): return self.gfilter(self.include_note, self.db.get_note_from_gramps_id(val)) + def get_tag_from_name(self, val): + """ + Finds a Tag in the database from the passed tag name. + If no such Tag exists, None is returned. + """ + return self.gfilter(self.include_tag, + self.db.get_tag_from_name(val)) + def get_name_group_mapping(self, name): """ Return the default grouping name for a surname @@ -528,6 +568,12 @@ class ProxyDbBase(DbReadBase): """ return self.db.get_number_of_notes() + def get_number_of_tags(self): + """ + Return the number of tags currently in the database. + """ + return self.db.get_number_of_tags() + def get_save_path(self): """returns the save path of the file, or "" if one does not exist""" return self.db.get_save_path() @@ -625,6 +671,9 @@ class ProxyDbBase(DbReadBase): def get_raw_note_data(self, handle): return self.db.get_raw_note_data(handle) + def get_raw_tag_data(self, handle): + return self.db.get_raw_tag_data(handle) + def has_person_handle(self, handle): """ Returns True if the handle exists in the current Person database. @@ -681,6 +730,13 @@ class ProxyDbBase(DbReadBase): return self.gfilter(self.include_note, self.db.get_note_from_gramps_id(val)) is not None + def has_tag_handle(self, handle): + """ + returns True if the handle exists in the current Tag database. + """ + return self.gfilter(self.include_tag, + self.db.get_tag_from_handle(handle)) is not None + def get_mediapath(self): """returns the default media path of the database""" return self.db.get_mediapath() diff --git a/src/gen/proxy/referenced.py b/src/gen/proxy/referenced.py index 36a061335..0f3ac68b0 100644 --- a/src/gen/proxy/referenced.py +++ b/src/gen/proxy/referenced.py @@ -49,6 +49,7 @@ class ReferencedProxyDb(ProxyDbBase): self.unreferenced_repositories = set() self.unreferenced_media_objects = set() self.unreferenced_notes = set() + self.unreferenced_tags = set() # Build lists of unreferenced objects self.__find_unreferenced_objects() @@ -89,6 +90,12 @@ class ReferencedProxyDb(ProxyDbBase): """ return handle not in self.unreferenced_notes + def include_tag(self, handle): + """ + Filter for tags + """ + return handle not in self.unreferenced_tags + def find_backlink_handles(self, handle, include_classes=None): """ Find all objects that hold a reference to the object handle. @@ -155,6 +162,7 @@ class ReferencedProxyDb(ProxyDbBase): (self.unreferenced_media_objects, self.get_media_object_handles), (self.unreferenced_notes, self.get_note_handles), + (self.unreferenced_tags, self.get_tag_handles), ) last_count = 0 diff --git a/src/gen/proxy/referencedbyselection.py b/src/gen/proxy/referencedbyselection.py index dca10f16a..766f2796a 100644 --- a/src/gen/proxy/referencedbyselection.py +++ b/src/gen/proxy/referencedbyselection.py @@ -86,6 +86,7 @@ class ReferencedBySelectionProxyDb(ProxyDbBase): "Repository": set(), "MediaObject": set(), "Note": set(), + "Tag": set(), } def process_object(self, class_name, handle): @@ -179,6 +180,7 @@ class ReferencedBySelectionProxyDb(ProxyDbBase): self.process_lds_ords(person) self.process_notes(person) self.process_associations(person) + self.process_tags(person) def process_family(self, family): """ @@ -302,6 +304,15 @@ class ReferencedBySelectionProxyDb(ProxyDbBase): # -------------------------------------------- + def process_tags(self, original_obj): + """ + Record the tags referenced by the primary object. + """ + for tag_handle in original_obj.get_tag_list(): + self.referenced["Tag"].add(tag_handle) + + # -------------------------------------------- + def process_name(self, name): """ Find all of the primary objects referred to """ self.process_source_ref_list(name) @@ -446,6 +457,12 @@ class ReferencedBySelectionProxyDb(ProxyDbBase): """ return handle in self.referenced["Note"] + def include_tag(self, handle): + """ + Filter for tags + """ + return handle in self.referenced["Tag"] + def find_backlink_handles(self, handle, include_classes=None): """ Return appropriate backlink handles for this proxy.