diff --git a/gramps/gen/db/base.py b/gramps/gen/db/base.py index 006994a24..b0a75a7d5 100644 --- a/gramps/gen/db/base.py +++ b/gramps/gen/db/base.py @@ -2306,9 +2306,9 @@ class QuerySet(object): self.generator = generator() return self - def tag(self, tag_text): + def tag(self, tag_text, remove=False): """ - Tag the selected items with the tag name. + Tag or untag the selected items with the tag name. """ if self.generator and self.needs_to_run: raise Exception("Queries in invalid order") @@ -2317,8 +2317,12 @@ class QuerySet(object): else: self.generator = self._generate() tag = self.database.get_tag_from_name(tag_text) + if (not tag and remove): + # no tag by this name, and want to remove it + # nothing to do + return trans_class = self.database.get_transaction_class() - with trans_class("Tag Selected Items", self.database, batch=True) as trans: + with trans_class("Tag Selected Items", self.database, batch=False) as trans: if tag is None: tag = self.database.get_table_func("Tag","class_func")() tag.set_name(tag_text) @@ -2327,5 +2331,9 @@ class QuerySet(object): for item in self.generator: if tag.handle not in item.tag_list: item.add_tag(tag.handle) - commit_func(item, trans) + elif remove: + item.remove_tag(tag.handle) + else: + continue + commit_func(item, trans) diff --git a/gramps/plugins/database/test/db_test.py b/gramps/plugins/database/test/db_test.py index a0023f79d..5f6e161a5 100644 --- a/gramps/plugins/database/test/db_test.py +++ b/gramps/plugins/database/test/db_test.py @@ -191,6 +191,14 @@ class BSDDBTest(unittest.TestCase): result = self.db.Person.where(lambda person: person.tag_list.name == "Test").count() self.assertTrue(result == 1, result) + def test_tag_2(self): + self.db.Person.where(lambda person: person.gramps_id == "I0001").tag("Test") + result = self.db.Person.where(lambda person: person.tag_list.name == "Test").count() + self.assertTrue(result == 1, result) + self.db.Person.where(lambda person: person.gramps_id == "I0001").tag("Test", remove=True) + result = self.db.Person.where(lambda person: person.tag_list.name == "Test").count() + self.assertTrue(result == 0, result) + def test_filter_1(self): from gramps.gen.filters.rules.person import (IsDescendantOf, IsAncestorOf)