Source code for gramps.gen.lib.tagbase
#
# Gramps - a GTK+/GNOME based genealogy program
#
# Copyright (C) 2010 Nick Hall
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#
"""
TagBase class for Gramps.
"""
#-------------------------------------------------------------------------
#
# TagBase class
#
#-------------------------------------------------------------------------
[docs]class TagBase:
"""
Base class for tag-aware objects.
"""
def __init__(self, source=None):
"""
Initialize a TagBase.
If the source is not None, then object is initialized from values of
the source object.
:param source: Object used to initialize the new object
:type source: TagBase
"""
if source:
self.tag_list = list(source.tag_list)
else:
self.tag_list = []
[docs] def serialize(self):
"""
Convert the object to a serialized tuple of data.
"""
return self.tag_list
[docs] def unserialize(self, data):
"""
Convert a serialized tuple of data to an object.
"""
self.tag_list = data
return self
[docs] def add_tag(self, tag):
"""
Add the tag to the object's list of tags.
:param tag: unicode tag to add.
:type tag: unicode
"""
if tag not in self.tag_list:
self.tag_list.append(tag)
[docs] def remove_tag(self, tag):
"""
Remove the specified tag from the tag list.
If the tag does not exist in the list, the operation has no effect.
:param tag: tag to remove from the list.
:type tag: unicode
:returns: True if the tag was removed, False if it was not in the list.
:rtype: bool
"""
if tag in self.tag_list:
self.tag_list.remove(tag)
return True
else:
return False
[docs] def get_tag_list(self):
"""
Return the list of tags associated with the object.
:returns: Returns the list of tags.
:rtype: list
"""
return self.tag_list
[docs] def set_tag_list(self, tag_list):
"""
Assign the passed list to the objects's list of tags.
:param tag_list: List of tags to ba associated with the object.
:type tag_list: list
"""
self.tag_list = tag_list
[docs] def get_referenced_tag_handles(self):
"""
Return the list of (classname, handle) tuples for all referenced tags.
This method should be used to get the :class:`~.tag.Tag` portion
of the list by objects that store tag lists.
:returns: List of (classname, handle) tuples for referenced objects.
:rtype: list
"""
return [('Tag', handle) for handle in self.tag_list]
def _merge_tag_list(self, acquisition):
"""
Merge the list of tag from acquisition with our own.
:param acquisition: The tag list of this object will be merged with
the current tag list.
:type acquisition: TagBase
"""
for addendum in acquisition.get_tag_list():
self.add_tag(addendum)
[docs] def replace_tag_references(self, old_handle, new_handle):
"""
Replace references to note handles in the list of this object and
merge equivalent entries.
:param old_handle: The note handle to be replaced.
:type old_handle: str
:param new_handle: The note handle to replace the old one with.
:type new_handle: str
"""
refs_list = self.tag_list[:]
new_ref = None
if new_handle in self.tag_list:
new_ref = new_handle
n_replace = refs_list.count(old_handle)
for ix_replace in range(n_replace):
idx = refs_list.index(old_handle)
if new_ref:
self.tag_list.pop(idx)
refs_list.pop(idx)
else:
self.tag_list[idx] = new_handle