Skip to content

Commit cc72b73

Browse files
author
Fritz Otlinghaus
committed
Merge pull request #13 from Scriptkiddi/aip1000
Aip1000
2 parents 6b983ed + 155d40b commit cc72b73

File tree

1 file changed

+113
-61
lines changed

1 file changed

+113
-61
lines changed

Diff for: anknotes/__main__.py

+113-61
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,30 @@
1616

1717

1818
# Note: This class was adapted from the Real-Time_Import_for_use_with_the_Rikaisama_Firefox_Extension plug-in by [email protected]
19-
#.. itself adapted from Yomichan plugin by Alex Yatskov.
19+
# .. itself adapted from Yomichan plugin by Alex Yatskov.
2020

2121
PATH = os.path.dirname(os.path.abspath(__file__))
2222
ONLY_ADD_NEW = True
23+
DO_UPDATE_NOTES = True
2324
EVERNOTE_MODEL = "evernote_note"
2425
TITLE_FIELD_NAME = "title"
2526
CONTENT_FIELD_NAME = "content"
2627
GUID_FIELD_NAME = "Evernote Guid"
2728

2829

2930
class Anki:
31+
def update_evernote_cards(self, evernote_cards, tag):
32+
count = 0
33+
for card in evernote_cards:
34+
anki_field_info = {TITLE_FIELD_NAME: card.front.decode('utf-8'),
35+
CONTENT_FIELD_NAME: card.back.decode('utf-8'),
36+
GUID_FIELD_NAME: card.guid}
37+
card.tags.append(tag)
38+
self.update_note(anki_field_info, card.tags)
39+
count += 1
40+
self.stop_editing()
41+
return count
42+
3043
def add_evernote_cards(self, evernote_cards, deck, tag):
3144
count = 0
3245
model_name = EVERNOTE_MODEL
@@ -40,6 +53,20 @@ def add_evernote_cards(self, evernote_cards, deck, tag):
4053
self.stop_editing()
4154
return count
4255

56+
def update_note(self, fields, tags=list()):
57+
col = self.collection()
58+
note_id = col.findNotes(fields[GUID_FIELD_NAME])[0]
59+
note = anki.notes.Note(col, None, note_id)
60+
note.tags = tags
61+
for fld in note._model['flds']:
62+
if TITLE_FIELD_NAME in fld.get('name'):
63+
note.fields[fld.get('ord')] = fields[TITLE_FIELD_NAME]
64+
elif CONTENT_FIELD_NAME in fld.get('name'):
65+
note.fields[fld.get('ord')] = fields[CONTENT_FIELD_NAME]
66+
# we dont have to update the evernote guid because if it changes we wont find this note anyway
67+
note.flush()
68+
return note.id
69+
4370
def add_note(self, deck_name, model_name, fields, tags=list()):
4471
note = self.create_note(deck_name, model_name, fields, tags)
4572
if note is not None:
@@ -55,8 +82,8 @@ def create_note(self, deck_name, model_name, fields, tags=list()):
5582
col = self.collection()
5683
note = anki.notes.Note(col, model)
5784
note.model()['did'] = id_deck
58-
tags = [tags]
5985
note.tags = tags
86+
6087
for name, value in fields.items():
6188
note[name] = value
6289
return note
@@ -79,8 +106,8 @@ def add_evernote_model(self): # adapted from the IREAD plug-in from Frank
79106
mm.addField(evernote_model, guid_field)
80107
# Add template
81108
t = mm.newTemplate('EvernoteReview')
82-
t['qfmt'] = "{{"+TITLE_FIELD_NAME+"}}"
83-
t['afmt'] = "{{"+CONTENT_FIELD_NAME+"}}"
109+
t['qfmt'] = "{{" + TITLE_FIELD_NAME + "}}"
110+
t['afmt'] = "{{" + CONTENT_FIELD_NAME + "}}"
84111
mm.addTemplate(evernote_model, t)
85112
mm.add(evernote_model)
86113
return evernote_model
@@ -91,22 +118,21 @@ def add_evernote_model(self): # adapted from the IREAD plug-in from Frank
91118
source_ord, source_field = fmap[GUID_FIELD_NAME]
92119
source_field['sticky'] = False
93120

94-
def get_guids_from_anki_id(self,ids):
95-
guids = []
121+
def get_guids_from_anki_id(self, ids):
122+
guids = {}
96123
for a_id in ids:
97124
card = self.collection().getCard(a_id)
98125
items = card.note().items()
99126
if len(items) == 3:
100-
guids.append(items[2][1]) # not a very smart access
127+
guids[str(a_id)] = items[2][1] # not a very smart access
101128
return guids
102129

103130
def can_add_note(self, deck_name, model_name, fields):
104131
return bool(self.create_note(deck_name, model_name, fields))
105132

106133
def get_cards_id_from_tag(self, tag):
107-
query = "tag:"+tag
134+
query = "tag:" + tag
108135
ids = self.collection().findCards(query)
109-
#show_tooltip(ids)
110136
return ids
111137

112138
def start_editing(self):
@@ -142,7 +168,6 @@ def __init__(self, q, a, g, tags):
142168

143169

144170
class Evernote:
145-
146171
def __init__(self):
147172
if not mw.col.conf.get('evernoteToken', False):
148173
# First run of the Plugin we did not save the access key yet
@@ -214,9 +239,34 @@ def proceed(self):
214239
anki_guids = self.anki.get_guids_from_anki_id(anki_ids)
215240
evernote_guids = self.get_evernote_guids_from_tag(self.evernoteTags)
216241
if ONLY_ADD_NEW:
217-
note_guids_to_import = set(evernote_guids)-set(anki_guids)
218-
n = self.import_into_anki(note_guids_to_import, self.deck, self.ankiTag)
219-
show_tooltip(str(n) + " cards have been imported")
242+
cards_to_add_or_update = self.dict_remove_duplicates(evernote_guids, anki_guids)
243+
n = self.import_into_anki(cards_to_add_or_update['add'], self.deck, self.ankiTag)
244+
n2 = 0
245+
if DO_UPDATE_NOTES:
246+
self.anki.start_editing()
247+
self.update_in_anki(cards_to_add_or_update['update'], self.ankiTag)
248+
n2 = len(cards_to_add_or_update['update'])
249+
250+
show_tooltip("{} existing card(s) have been updated (deleted and re-added) and {} new card(s) have been imported.".format(str(n2), str(n)))
251+
self.anki.stop_editing()
252+
253+
def dict_remove_duplicates(self, evernote_guids, anki_guids):
254+
notes_to_add = []
255+
notes_to_update = []
256+
for evernote_guid in evernote_guids:
257+
for anki_id, anki_guid in anki_guids.items():
258+
if anki_guid == evernote_guid:
259+
notes_to_update.append(evernote_guid)
260+
break
261+
else:
262+
notes_to_add.append(evernote_guid)
263+
return {'add': notes_to_add, 'update': notes_to_update}
264+
265+
def update_in_anki(self, guid_set, tag):
266+
267+
cards = self.evernote.create_evernote_cards(guid_set)
268+
number = self.anki.update_evernote_cards(cards, tag)
269+
return number
220270

221271
def import_into_anki(self, guid_set, deck, tag):
222272
cards = self.evernote.create_evernote_cards(guid_set)
@@ -228,7 +278,7 @@ def get_evernote_guids_from_tag(self, tags):
228278
for tag in tags:
229279
tag_guid = self.evernote.find_tag_guid(tag)
230280
if tag_guid is not None:
231-
note_guids = note_guids+self.evernote.find_notes_filter_by_tag_guids([tag_guid])
281+
note_guids = note_guids + self.evernote.find_notes_filter_by_tag_guids([tag_guid])
232282
return note_guids
233283

234284

@@ -237,73 +287,75 @@ def show_tooltip(text, time_out=3000):
237287

238288

239289
def main():
240-
show_tooltip(str())
290+
# show_tooltip(str())
241291
controller = Controller()
242292
controller.proceed()
243293

294+
244295
action = aqt.qt.QAction("Import from Evernote", aqt.mw)
245296
aqt.mw.connect(action, aqt.qt.SIGNAL("triggered()"), main)
246297
aqt.mw.form.menuTools.addAction(action)
247298

248299

249300
def setup_evernote(self):
250-
global evernote_default_deck
251-
global evernote_default_tag
252-
global evernote_tags_to_import
253-
global keep_evernote_tags
254-
255-
layout_tab = self.form.tab_1.layout()
256-
group_box = QGroupBox("Evernote Importer")
257-
layout = QVBoxLayout()
258-
259-
# Default Deck
260-
evernote_default_deck_label = QLabel("Default Deck:")
261-
evernote_default_deck = QLineEdit()
262-
evernote_default_deck.setText(mw.col.conf.get('evernoteDefaultDeck', ""))
263-
layout.insertWidget(int(layout.count())+1, evernote_default_deck_label)
264-
layout.insertWidget(int(layout.count())+2, evernote_default_deck)
265-
evernote_default_deck.connect(evernote_default_deck, SIGNAL("editingFinished()"), update_evernote_default_deck)
266-
267-
# Default Tag
268-
evernote_default_tag_label = QLabel("Default Tag:")
269-
evernote_default_tag = QLineEdit()
270-
evernote_default_tag.setText(mw.col.conf.get('evernoteDefaultTag', ""))
271-
layout.insertWidget(int(layout.count())+1, evernote_default_tag_label)
272-
layout.insertWidget(int(layout.count())+2, evernote_default_tag)
273-
evernote_default_tag.connect(evernote_default_tag, SIGNAL("editingFinished()"), update_evernote_default_tag)
274-
275-
# Tags to import
276-
evernote_tags_to_import_label = QLabel("Tags to import:")
277-
evernote_tags_to_import = QLineEdit()
278-
evernote_tags_to_import.setText(mw.col.conf.get('evernoteTagsToImport', ""))
279-
layout.insertWidget(int(layout.count())+1, evernote_tags_to_import_label)
280-
layout.insertWidget(int(layout.count())+2, evernote_tags_to_import)
281-
evernote_tags_to_import.connect(evernote_tags_to_import,
282-
SIGNAL("editingFinished()"),
283-
update_evernote_tags_to_import)
284-
285-
# keep evernote tags
286-
keep_evernote_tags = QCheckBox("Keep Evernote Tags", self)
287-
keep_evernote_tags.setChecked(mw.col.conf.get('evernoteKeepTags', False))
288-
keep_evernote_tags.stateChanged.connect(update_evernote_keep_tags)
289-
layout.insertWidget(int(layout.count())+1, keep_evernote_tags)
290-
group_box.setLayout(layout)
291-
layout_tab.insertWidget(int(layout.count())+1, group_box)
301+
global evernote_default_deck
302+
global evernote_default_tag
303+
global evernote_tags_to_import
304+
global keep_evernote_tags
305+
306+
layout_tab = self.form.tab_1.layout()
307+
group_box = QGroupBox("Evernote Importer")
308+
layout = QVBoxLayout()
309+
310+
# Default Deck
311+
evernote_default_deck_label = QLabel("Default Deck:")
312+
evernote_default_deck = QLineEdit()
313+
evernote_default_deck.setText(mw.col.conf.get('evernoteDefaultDeck', ""))
314+
layout.insertWidget(int(layout.count()) + 1, evernote_default_deck_label)
315+
layout.insertWidget(int(layout.count()) + 2, evernote_default_deck)
316+
evernote_default_deck.connect(evernote_default_deck, SIGNAL("editingFinished()"), update_evernote_default_deck)
317+
318+
# Default Tag
319+
evernote_default_tag_label = QLabel("Default Tag:")
320+
evernote_default_tag = QLineEdit()
321+
evernote_default_tag.setText(mw.col.conf.get('evernoteDefaultTag', ""))
322+
layout.insertWidget(int(layout.count()) + 1, evernote_default_tag_label)
323+
layout.insertWidget(int(layout.count()) + 2, evernote_default_tag)
324+
evernote_default_tag.connect(evernote_default_tag, SIGNAL("editingFinished()"), update_evernote_default_tag)
325+
326+
# Tags to import
327+
evernote_tags_to_import_label = QLabel("Tags to import:")
328+
evernote_tags_to_import = QLineEdit()
329+
evernote_tags_to_import.setText(mw.col.conf.get('evernoteTagsToImport', ""))
330+
layout.insertWidget(int(layout.count()) + 1, evernote_tags_to_import_label)
331+
layout.insertWidget(int(layout.count()) + 2, evernote_tags_to_import)
332+
evernote_tags_to_import.connect(evernote_tags_to_import,
333+
SIGNAL("editingFinished()"),
334+
update_evernote_tags_to_import)
335+
336+
# keep evernote tags
337+
keep_evernote_tags = QCheckBox("Keep Evernote Tags", self)
338+
keep_evernote_tags.setChecked(mw.col.conf.get('evernoteKeepTags', False))
339+
keep_evernote_tags.stateChanged.connect(update_evernote_keep_tags)
340+
layout.insertWidget(int(layout.count()) + 1, keep_evernote_tags)
341+
group_box.setLayout(layout)
342+
layout_tab.insertWidget(int(layout.count()) + 1, group_box)
292343

293344

294345
def update_evernote_default_deck():
295-
mw.col.conf['evernoteDefaultDeck'] = evernote_default_deck.text()
346+
mw.col.conf['evernoteDefaultDeck'] = evernote_default_deck.text()
296347

297348

298349
def update_evernote_default_tag():
299-
mw.col.conf['evernoteDefaultTag'] = evernote_default_tag.text()
350+
mw.col.conf['evernoteDefaultTag'] = evernote_default_tag.text()
300351

301352

302353
def update_evernote_tags_to_import():
303-
mw.col.conf['evernoteTagsToImport'] = evernote_tags_to_import.text()
354+
mw.col.conf['evernoteTagsToImport'] = evernote_tags_to_import.text()
304355

305356

306357
def update_evernote_keep_tags():
307-
mw.col.conf['evernoteKeepTags'] = keep_evernote_tags.isChecked()
358+
mw.col.conf['evernoteKeepTags'] = keep_evernote_tags.isChecked()
359+
308360

309361
Preferences.setupOptions = wrap(Preferences.setupOptions, setup_evernote)

0 commit comments

Comments
 (0)