Merge pull request #408 from ErezVolk/add-tags-on-update
Add an option to add a set of tags to notes updated on import
This commit is contained in:
commit
5edf901c16
@ -18,7 +18,7 @@ support site, it would be great if you could add your name below as well.
|
||||
|
||||
********************
|
||||
|
||||
- Sample Name
|
||||
Erez Volk <erez.volk@gmail.com>
|
||||
|
||||
********************
|
||||
|
||||
|
@ -64,11 +64,13 @@ class NoteImporter(Importer):
|
||||
allowHTML = False
|
||||
importMode = 0
|
||||
mapping: Optional[List[str]]
|
||||
tagModified: Optional[str]
|
||||
|
||||
def __init__(self, col: _Collection, file: str) -> None:
|
||||
Importer.__init__(self, col, file)
|
||||
self.model = col.models.current()
|
||||
self.mapping = None
|
||||
self.tagModified = None
|
||||
self._tagsMapped = False
|
||||
|
||||
def run(self) -> None:
|
||||
@ -271,6 +273,13 @@ content in the text file to the correct fields."""
|
||||
self.col.tags.register(n.tags)
|
||||
tags = self.col.tags.join(n.tags)
|
||||
return [intTime(), self.col.usn(), n.fieldsStr, tags, id, n.fieldsStr, tags]
|
||||
elif self.tagModified:
|
||||
tags = self.col.db.scalar("select tags from notes where id = ?", id)
|
||||
tagList = self.col.tags.split(tags) + self.tagModified.split()
|
||||
tagList = self.col.tags.canonify(tagList)
|
||||
self.col.tags.register(tagList)
|
||||
tags = self.col.tags.join(tagList)
|
||||
return [intTime(), self.col.usn(), n.fieldsStr, tags, id, n.fieldsStr]
|
||||
else:
|
||||
return [intTime(), self.col.usn(), n.fieldsStr, id, n.fieldsStr]
|
||||
|
||||
@ -283,6 +292,13 @@ update notes set mod = ?, usn = ?, flds = ?, tags = ?
|
||||
where id = ? and (flds != ? or tags != ?)""",
|
||||
rows,
|
||||
)
|
||||
elif self.tagModified:
|
||||
self.col.db.executemany(
|
||||
"""
|
||||
update notes set mod = ?, usn = ?, flds = ?, tags = ?
|
||||
where id = ? and flds != ?""",
|
||||
rows,
|
||||
)
|
||||
else:
|
||||
self.col.db.executemany(
|
||||
"""
|
||||
|
@ -1,6 +1,7 @@
|
||||
# coding: utf-8
|
||||
|
||||
import os
|
||||
from tempfile import NamedTemporaryFile
|
||||
|
||||
from anki.importing import (
|
||||
Anki2Importer,
|
||||
@ -194,6 +195,100 @@ def test_csv2():
|
||||
deck.close()
|
||||
|
||||
|
||||
def test_tsv_tag_modified():
|
||||
deck = getEmptyCol()
|
||||
mm = deck.models
|
||||
m = mm.current()
|
||||
f = mm.newField("Top")
|
||||
mm.addField(m, f)
|
||||
mm.save(m)
|
||||
n = deck.newNote()
|
||||
n["Front"] = "1"
|
||||
n["Back"] = "2"
|
||||
n["Top"] = "3"
|
||||
n.addTag("four")
|
||||
deck.addNote(n)
|
||||
|
||||
with NamedTemporaryFile(mode="w") as tf:
|
||||
tf.write("1\tb\tc\n")
|
||||
tf.flush()
|
||||
i = TextImporter(deck, tf.name)
|
||||
i.initMapping()
|
||||
i.tagModified = "boom"
|
||||
i.run()
|
||||
|
||||
n.load()
|
||||
assert n["Front"] == "1"
|
||||
assert n["Back"] == "b"
|
||||
assert n["Top"] == "c"
|
||||
assert "four" in n.tags
|
||||
assert "boom" in n.tags
|
||||
assert len(n.tags) == 2
|
||||
assert i.updateCount == 1
|
||||
|
||||
deck.close()
|
||||
|
||||
|
||||
def test_tsv_tag_multiple_tags():
|
||||
deck = getEmptyCol()
|
||||
mm = deck.models
|
||||
m = mm.current()
|
||||
f = mm.newField("Top")
|
||||
mm.addField(m, f)
|
||||
mm.save(m)
|
||||
n = deck.newNote()
|
||||
n["Front"] = "1"
|
||||
n["Back"] = "2"
|
||||
n["Top"] = "3"
|
||||
n.addTag("four")
|
||||
n.addTag("five")
|
||||
deck.addNote(n)
|
||||
|
||||
with NamedTemporaryFile(mode="w") as tf:
|
||||
tf.write("1\tb\tc\n")
|
||||
tf.flush()
|
||||
i = TextImporter(deck, tf.name)
|
||||
i.initMapping()
|
||||
i.tagModified = "five six"
|
||||
i.run()
|
||||
|
||||
n.load()
|
||||
assert n["Front"] == "1"
|
||||
assert n["Back"] == "b"
|
||||
assert n["Top"] == "c"
|
||||
assert list(sorted(n.tags)) == list(sorted(["four", "five", "six"]))
|
||||
|
||||
deck.close()
|
||||
|
||||
|
||||
def test_csv_tag_only_if_modified():
|
||||
deck = getEmptyCol()
|
||||
mm = deck.models
|
||||
m = mm.current()
|
||||
f = mm.newField("Left")
|
||||
mm.addField(m, f)
|
||||
mm.save(m)
|
||||
n = deck.newNote()
|
||||
n["Front"] = "1"
|
||||
n["Back"] = "2"
|
||||
n["Left"] = "3"
|
||||
deck.addNote(n)
|
||||
|
||||
with NamedTemporaryFile(mode="w") as tf:
|
||||
tf.write("1,2,3\n")
|
||||
tf.flush()
|
||||
i = TextImporter(deck, tf.name)
|
||||
i.initMapping()
|
||||
i.tagModified = "right"
|
||||
i.run()
|
||||
|
||||
n.load()
|
||||
assert n.tags == []
|
||||
assert i.updateCount == 0
|
||||
|
||||
deck.close()
|
||||
|
||||
|
||||
def test_supermemo_xml_01_unicode():
|
||||
deck = getEmptyCol()
|
||||
file = str(os.path.join(testDir, "support/supermemo1.xml"))
|
||||
|
@ -91,6 +91,7 @@ class ImportDialog(QDialog):
|
||||
self.frm.autoDetect.clicked.connect(self.onDelimiter)
|
||||
self.updateDelimiterButtonText()
|
||||
self.frm.allowHTML.setChecked(self.mw.pm.profile.get("allowHTML", True))
|
||||
self.frm.importMode.currentIndexChanged.connect(self.importModeChanged)
|
||||
self.frm.importMode.setCurrentIndex(self.mw.pm.profile.get("importMode", 1))
|
||||
# import button
|
||||
b = QPushButton(_("Import"))
|
||||
@ -179,6 +180,9 @@ you can enter it here. Use \\t to represent tab."""
|
||||
self.mw.pm.profile["importMode"] = self.importer.importMode
|
||||
self.importer.allowHTML = self.frm.allowHTML.isChecked()
|
||||
self.mw.pm.profile["allowHTML"] = self.importer.allowHTML
|
||||
if self.frm.tagModifiedCheck.isChecked():
|
||||
self.importer.tagModified = self.frm.tagModifiedTag.toPlainText()
|
||||
self.mw.pm.profile["tagModified"] = self.importer.tagModified
|
||||
did = self.deck.selectedId()
|
||||
if did != self.importer.model["did"]:
|
||||
self.importer.model["did"] = did
|
||||
@ -283,6 +287,14 @@ you can enter it here. Use \\t to represent tab."""
|
||||
def helpRequested(self):
|
||||
openHelp("importing")
|
||||
|
||||
def importModeChanged(self, newImportMode):
|
||||
if newImportMode == 0:
|
||||
allowTagModified = True
|
||||
else:
|
||||
allowTagModified = False
|
||||
self.frm.tagModifiedCheck.setEnabled(allowTagModified)
|
||||
self.frm.tagModifiedTag.setEnabled(allowTagModified)
|
||||
|
||||
|
||||
def showUnicodeWarning():
|
||||
"""Shorthand to show a standard warning."""
|
||||
|
@ -77,6 +77,20 @@
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="tagModifiedLayout">
|
||||
<item>
|
||||
<widget class="QCheckBox" name="tagModifiedCheck">
|
||||
<property name="text">
|
||||
<string>Tag modified notes:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLineEdit" name="tagModifiedTag"/>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
|
Loading…
Reference in New Issue
Block a user