def test_two_mem_files_sharing_same_logs(self):
     filename = os.path.join(os.getcwd(), "tests", "files", "basedir_2_mem",
                             "deck1.mem")
     self.mem_importer().do_import(filename)
     assert self.database().con.execute(\
         "select count() from log where event_type=?",
         (EventTypes.REPETITION, )).fetchone()[0] == 1
     filename = os.path.join(os.getcwd(), "tests", "files", "basedir_2_mem",
                             "deck2.mem")
     self.mem_importer().do_import(filename)
     assert self.database().con.execute(\
         "select count() from log where event_type=?",
         (EventTypes.REPETITION, )).fetchone()[0] == 3
     assert self.database().con.execute(\
         "select count() from log where event_type=?",
         (EventTypes.ADDED_CARD, )).fetchone()[0] == 2
     card = self.database().card("4c8fff73", is_id_internal=False)
     assert self.database().average_thinking_time(card) == 1.5
     assert self.database().total_thinking_time(card) == 3.0
     assert self.database().card_count_for_grade(0, active_only=True) == 2
     tag = self.database().get_or_create_tag_with_name("666")
     assert self.database().card_count_for_grade_and_tag(
         0, tag, active_only=True) == 0
     from mnemosyne.libmnemosyne.statistics_pages.grades import Grades
     page = Grades(component_manager=self.mnemosyne.component_manager)
     from mnemosyne.libmnemosyne.tag_tree import TagTree
     self.tag_tree = TagTree(self.mnemosyne.component_manager,
                             count_cards=False)
     self.nodes = self.tag_tree.nodes()
     for index, node in enumerate(self.nodes):
         if node == "666":
             page.prepare_statistics(index)
             assert page.y == [0, 0, 0, 0, 0, 0, 0]
     page.prepare_statistics(-1)
     assert page.y == [0, 2, 0, 0, 0, 0, 0]
예제 #2
0
 def __init__(self, **kwds):
     super().__init__(**kwds)
     self.tag_tree = TagTree(self.component_manager, count_cards=False)
     self.nodes = self.tag_tree.nodes()
     self.variants = [(self.ALL_CARDS, _("All cards")),
                      (self.ACTIVE_CARDS, _("Active cards only"))]
     for index, node in enumerate(self.nodes):
         if node == "__UNTAGGED__":
             node = _("Untagged")
         self.variants.append((index, node))
예제 #3
0
    def rebuild(self):
        """To be called when external events invalidate the tag tree,
        e.g. due to edits in the card browser widget.

        """

        self.save_criterion()
        self.store_tree_state()
        self.tag_tree = TagTree(self.component_manager)
        self.restore_criterion()
예제 #4
0
 def display(self, criterion=None):
     # Create criterion if needed.
     if criterion is None:
         criterion = DefaultCriterion(self.component_manager)
         for tag in self.database().tags():
             criterion._tag_ids_active.add(tag._id)
     # Create tree.
     self.tag_tree = TagTree(self.component_manager)
     self.tree_wdgt.clear()
     self.node_items = []
     self.tag_for_node_item = []
     self.nodes_which_can_be_deleted = []
     self.nodes_which_can_be_renamed = []
     node = "__ALL__"
     node_name = "%s (%d)" % (self.tag_tree.display_name_for_node[node],
         self.tag_tree.card_count_for_node[node])
     root = self.tag_tree[node]
     root_item = QtWidgets.QTreeWidgetItem(\
         self.tree_wdgt, [node_name, node], 0)
     root_item.setFlags(root_item.flags() | \
        QtCore.Qt.ItemIsUserCheckable | QtCore.Qt.ItemIsTristate)
     root_item.setCheckState(0, QtCore.Qt.Checked)
     self.create_tree(self.tag_tree[node], qt_parent=root_item)
     # Set forbidden tags.
     if len(criterion._tag_ids_forbidden):
         for i in range(len(self.node_items)):
             node_item = self.node_items[i]
             tag = self.tag_for_node_item[i]
             if tag._id in criterion._tag_ids_forbidden:
                 node_item.setCheckState(0, QtCore.Qt.Checked)
             else:
                 node_item.setCheckState(0, QtCore.Qt.Unchecked)
     # Set active tags.
     else:
         # We first set all the tags inactive. We cannot do this in the
         # second branch of the upcoming 'if' statement, as then an
         # inactive parent tag coming later in the list will deactivate
         # active child tags coming earlier in the list.
         for node_item in self.node_items:
             node_item.setCheckState(0, QtCore.Qt.Unchecked)
         for i in range(len(self.node_items)):
             node_item = self.node_items[i]
             tag = self.tag_for_node_item[i]
             if tag._id in criterion._tag_ids_active:
                 node_item.setCheckState(0, QtCore.Qt.Checked)
     # Restore state of the tree.
     self.tree_wdgt.expandAll()
     collapsed = self.config()["tag_tree_wdgt_state"]
     if collapsed is None:
         collapsed = []
     iterator = QtWidgets.QTreeWidgetItemIterator(self.tree_wdgt)
     while iterator.value():
         if iterator.value().text(1) in collapsed:
             iterator.value().setExpanded(False)
         iterator += 1
예제 #5
0
    def test_delete_2(self):
        card_type = self.card_type_with_id("1")
        fact_data = {"f": "question4", "b": "answer4"}
        card = self.controller().create_new_cards(fact_data,
                                                  card_type,
                                                  grade=-1,
                                                  tag_names=["a::b"])[0]
        fact_data = {"f": "question", "b": "answer"}
        card = self.controller().create_new_cards(fact_data,
                                                  card_type,
                                                  grade=-1,
                                                  tag_names=["a"])[0]
        fact_data = {"f": "question2", "b": "answer2"}
        card = self.controller().create_new_cards(fact_data,
                                                  card_type,
                                                  grade=-1,
                                                  tag_names=["Z"])[0]
        fact_data = {"f": "question3", "b": "answer3"}
        card = self.controller().create_new_cards(fact_data,
                                                  card_type,
                                                  grade=-1,
                                                  tag_names=["a::c"])[0]
        fact_data = {"f": "question5", "b": "answer5"}
        card = self.controller().create_new_cards(fact_data,
                                                  card_type,
                                                  grade=-1,
                                                  tag_names=["b::c::d",
                                                             "b"])[0]
        from mnemosyne.libmnemosyne.tag_tree import TagTree
        self.tree = TagTree(self.mnemosyne.component_manager)

        assert self.tree.card_count_for_node["__ALL__"] == 5
        assert self.tree.card_count_for_node["a"] == 3
        assert self.tree.card_count_for_node["Z"] == 1
        assert self.tree.card_count_for_node["a::b"] == 1
        assert self.tree.card_count_for_node["a::c"] == 1
        assert self.tree.card_count_for_node["b"] == 1
        assert self.tree.card_count_for_node["b::c"] == 1
        assert self.tree.card_count_for_node["b::c::d"] == 1

        self.tree.delete_subtree("b::c")
        card = self.database().card(card._id, is_id_internal=True)
        assert card.tag_string() == ""
        self.database().con.execute("select tags from cards where _id=?",
                                    (card._id, )).fetchone()[0] == "b"

        assert self.tree.card_count_for_node["__ALL__"] == 5
        assert self.tree.card_count_for_node["a"] == 3
        assert self.tree.card_count_for_node["Z"] == 1
        assert self.tree.card_count_for_node["a::b"] == 1
        assert self.tree.card_count_for_node["a::c"] == 1
        assert "b" not in self.tree.card_count_for_node
        assert "__UNTAGGED__" in self.tree.card_count_for_node
        assert "b::c" not in self.tree.card_count_for_node
        assert "b::c::d" not in self.tree.card_count_for_node
예제 #6
0
 def test_1(self):
     fact_data = {"f": "question", "b": "answer"}
     card_type = self.card_type_with_id("1")
     card = self.controller().create_new_cards(fact_data,
                                               card_type,
                                               grade=-1,
                                               tag_names=[])[0]
     self.controller().save_file()
     from mnemosyne.libmnemosyne.tag_tree import TagTree
     self.tree = TagTree(self.mnemosyne.component_manager)
     assert len(list(self.tree.keys())) == 2
     assert self.tree['__ALL__'] == ['__UNTAGGED__']
예제 #7
0
 def test_rename_to_empty_2(self):
     card_type = self.card_type_with_id("1")
     fact_data = {"f": "question4", "b": "answer4"}
     card = self.controller().create_new_cards(fact_data,
                                               card_type,
                                               grade=-1,
                                               tag_names=["A::tag1"])[0]
     from mnemosyne.libmnemosyne.tag_tree import TagTree
     self.tree = TagTree(self.mnemosyne.component_manager)
     self.tree.rename_node("A", "")
     assert self.tree.card_count_for_node["tag1"] == 1
     assert len(self.database().tags()) == 2
예제 #8
0
    def test_4(self):
        card_type = self.card_type_with_id("1")
        fact_data = {"f": "question4", "b": "answer4"}
        card = self.controller().create_new_cards(fact_data,
                                                  card_type,
                                                  grade=-1,
                                                  tag_names=["a::b"])[0]
        fact_data = {"f": "question", "b": "answer"}
        card = self.controller().create_new_cards(fact_data,
                                                  card_type,
                                                  grade=-1,
                                                  tag_names=["a"])[0]
        fact_data = {"f": "question2", "b": "answer2"}
        card = self.controller().create_new_cards(fact_data,
                                                  card_type,
                                                  grade=-1,
                                                  tag_names=["Z"])[0]
        fact_data = {"f": "question3", "b": "answer3"}
        card = self.controller().create_new_cards(fact_data,
                                                  card_type,
                                                  grade=-1,
                                                  tag_names=["a::c"])[0]
        fact_data = {"f": "question5", "b": "answer5"}
        card = self.controller().create_new_cards(fact_data,
                                                  card_type,
                                                  grade=-1,
                                                  tag_names=["b::c::d"])[0]
        from mnemosyne.libmnemosyne.tag_tree import TagTree
        self.tree = TagTree(self.mnemosyne.component_manager)
        assert self.tree.card_count_for_node["__ALL__"] == 5
        assert self.tree.card_count_for_node["a"] == 3
        assert self.tree.card_count_for_node["Z"] == 1
        assert self.tree.card_count_for_node["a::b"] == 1
        assert self.tree.card_count_for_node["a::c"] == 1
        assert self.tree.card_count_for_node["b"] == 1
        assert self.tree.card_count_for_node["b::c"] == 1
        assert self.tree.card_count_for_node["b::c::d"] == 1

        self.tree.rename_node("Z", "Z::Z")
        self.tree.rename_node("b::c", "b::cc")
        assert self.tree.card_count_for_node["__ALL__"] == 5
        assert self.tree.card_count_for_node["a"] == 3
        assert self.tree.card_count_for_node["Z"] == 1
        assert self.tree.card_count_for_node["Z::Z"] == 1
        assert self.tree.card_count_for_node["a::b"] == 1
        assert self.tree.card_count_for_node["a::c"] == 1
        assert self.tree.card_count_for_node["b"] == 1
        assert self.tree.card_count_for_node["b::cc"] == 1
        assert self.tree.card_count_for_node["b::cc::d"] == 1
예제 #9
0
 def test_rename_to_forbidden(self):
     card_type = self.card_type_with_id("1")
     fact_data = {"f": "question4", "b": "answer4"}
     card = self.controller().create_new_cards(fact_data,
                                               card_type,
                                               grade=-1,
                                               tag_names=["A::tag1"])[0]
     fact_data = {"f": "question", "b": "answer"}
     card = self.controller().create_new_cards(fact_data,
                                               card_type,
                                               grade=-1,
                                               tag_names=["A"])[0]
     from mnemosyne.libmnemosyne.tag_tree import TagTree
     self.tree = TagTree(self.mnemosyne.component_manager)
     self.tree.rename_node("A", "__UNTAGGED__")
     assert "__UNTAGGED__" in self.tree.card_count_for_node
예제 #10
0
    def test_count_1(self):
        card_type = self.card_type_with_id("1")
        fact_data = {"f": "question4", "b": "answer4"}
        card = self.controller().create_new_cards(fact_data,
                                                  card_type,
                                                  grade=-1,
                                                  tag_names=["b"])[0]
        fact_data = {"f": "question", "b": "answer"}
        card = self.controller().create_new_cards(fact_data,
                                                  card_type,
                                                  grade=-1,
                                                  tag_names=["b", "b"])[0]

        from mnemosyne.libmnemosyne.tag_tree import TagTree
        self.tree = TagTree(self.mnemosyne.component_manager)

        assert self.tree.card_count_for_node["__ALL__"] == 2
예제 #11
0
 def test_rename_to_existing_tag_2(self):
     card_type = self.card_type_with_id("1")
     fact_data = {"f": "question4", "b": "answer4"}
     card = self.controller().create_new_cards(
         fact_data,
         card_type,
         grade=-1,
         tag_names=["Xx::vb::test", "Xx::aa::vb::test"])[0]
     from mnemosyne.libmnemosyne.tag_tree import TagTree
     self.tree = TagTree(self.mnemosyne.component_manager)
     assert len(self.database().tags()) == 3
     self.tree.rename_node("Xx::aa::vb::test", "Xx::vb::test")
     assert self.tree.card_count_for_node["Xx::vb::test"] == 1
     assert "Xx::aa::vb::test" not in self.tree.card_count_for_node
     assert "," not in  self.database().con.execute(\
         "select tags from cards where _id=?", (card._id,)).fetchone()[0]
     assert self.database().con.execute(\
         "select count() from tags_for_card").fetchone()[0] == 1
     assert len(self.database().tags()) == 2
예제 #12
0
    def test_delete_forbidden(self):
        card_type = self.card_type_with_id("1")
        fact_data = {"f": "question", "b": "answer"}
        card = self.controller().create_new_cards(fact_data,
                                                  card_type,
                                                  grade=-1,
                                                  tag_names=["forbidden"])[0]
        assert self.database().active_count() == 1

        c = DefaultCriterion(self.mnemosyne.component_manager)
        c.deactivated_card_type_fact_view_ids = set()
        c._tag_ids_active = set(
            [self.database().get_or_create_tag_with_name("active")._id, 1])
        c._tag_ids_forbidden = set(
            [self.database().get_or_create_tag_with_name("forbidden")._id])
        self.database().set_current_criterion(c)
        assert self.database().active_count() == 0

        from mnemosyne.libmnemosyne.tag_tree import TagTree
        self.tree = TagTree(self.mnemosyne.component_manager)
        self.tree.delete_subtree("forbidden")
        assert self.database().active_count() == 1