def duplicate_selected_note(browser): assert(len(browser.selectedNotes()) == 1) base_note = browser.card.note() base_did = browser.card.did new_note = Note(mw.col, base_note.model()) #self.id = timestampID(col.db, "notes") t = base_note.id + 1 while mw.col.db.scalar("select id from %s where id = ?" % "notes", t): t += 1 new_note.id = t #No change needed: self.guid = guid64() #No change needed: self._model = model #No change needed: self.mid = model['id'] new_note.tags = copy.copy(base_note.tags) #self.tags = [] new_note.fields = copy.copy(base_note.fields) #self.fields = [""] * len(self._model['flds']) new_note.flags = base_note.flags #self.flags = 0 new_note.data = base_note.data #self.data = "" #No change needed: self._fmap = self.col.models.fieldMap(self._model) #No change needed: self.scm = self.col.scm new_note.addTag(u'Copied') browser.model.beginReset() #The cards will be added to the deck set into the current template. #Changing the template's deck would be unexpected, # so change the decks manually cards = mw.col.addNote(new_note) for card in new_note.cards(): if card.did != base_did: card.did = base_did card.flush() browser.model.endReset()
def create(self, text): self.highlight(self.settings['extractBgColor'], self.settings['extractTextColor']) currentCard = mw.reviewer.card currentNote = currentCard.note() model = mw.col.models.byName(self.settings['modelName']) newNote = Note(mw.col, model) newNote.tags = currentNote.tags setField(newNote, self.settings['textField'], fixImages(text)) setField(newNote, self.settings['sourceField'], getField(currentNote, self.settings['sourceField'])) if self.settings['editSource']: EditCurrent(mw) if self.settings['extractDeck']: did = mw.col.decks.byName(self.settings['extractDeck'])['id'] else: did = currentCard.did if self.settings['copyTitle']: title = getField(currentNote, self.settings['titleField']) else: title = '' if self.settings['editExtract']: setField(newNote, self.settings['titleField'], title) addCards = AddCards(mw) addCards.editor.setNote(newNote) deckName = mw.col.decks.get(did)['name'] addCards.deckChooser.deck.setText(deckName) addCards.modelChooser.models.setText(self.settings['modelName']) else: title, accepted = getText('Enter title', title='Extract Text', default=title) if accepted: setField(newNote, self.settings['titleField'], title) newNote.model()['did'] = did mw.col.addNote(newNote) if self.settings['extractSchedule']: mw.readingManager.scheduler.answer(newNote.cards()[0], SCHEDULE_EXTRACT)
def previewCards(self, note: Note, type: int = 0, did: Optional[int] = None) -> List: existing_cards = {} for card in note.cards(): existing_cards[card.ord] = card all_cards = [] for idx, template in enumerate(note.model()["tmpls"]): if idx in existing_cards: all_cards.append(existing_cards[idx]) else: # card not currently in database, generate an ephemeral one all_cards.append( self._newCard(note, template, 1, flush=False, did=did)) return all_cards
def _update_deck(tw_note: TwNote, anki_note: Note, mw: Any, default_deck: str) -> None: """ Given a note already in Anki's database, move its cards into an appropriate deck if they aren't already there. All cards must go to the same deck for the time being -- although this is currently irrelevant since we don't support any note types with multiple cards! The note must be flushed to Anki's database for this to work correctly. """ # Confusingly, mw.col.decks.id returns the ID of an existing deck, and # creates it if it doesn't exist. This happens to be exactly what we want. deck_name = tw_note.target_deck or default_deck new_did = mw.col.decks.id(deck_name) for card in anki_note.cards(): if card.did != new_did: card.did = new_did card.flush()
def add_to_anki(source, deck, model): n = Note(mw.col, model) for key in source: tmp = tostr(source[key]) try: n[str(key)] = tmp except KeyError: L.error( "No {} field found in Anki. Try adding one to the model (the 'note type'), or deleting the model and reimporting the sample deck." .format(key)) mw.col.addNote( n ) #BUT, it will not be visible in Anki if no cards can be generated (i.e. if the fields needed by those cards are empty) n.flush() dm = mw.col.decks #get the DeckManager card_ids = [card.id for card in n.cards()] #TODO: If the new note has no cards, just delete it now? Or at least give a warning that future syncs will keep adding invisible dups (unless the user adds the ID field to the front of a flashcard). dm.setDeck(card_ids, deck['id']) L.w(' ADDED to deck {}: {}'.format(deck['name'], fnote(n))) return n
def noteToDeck(nid, browser, did=None): """adds the did to nidToDeck. Either the given one, or one from a sibling card not in default. Do not add anything if nid already in nidToDeck. Return the did """ if nid in nidToDeck: return nidToDeck[nid] if did: nidToDeck[nid] = did return did note = Note(browser.col, id=nid) cards = note.cards() for card in cards: if card.did != defaultID: nidToDeck[nid] = card.did return card.did else: return None
def addNote(self, note: Note) -> int: self.add_note(note, note.model()["did"]) return len(note.cards())
def create(self, text, settings): currentCard = mw.reviewer.card currentNote = currentCard.note() model = mw.col.models.byName(settings['modelName']) newNote = Note(mw.col, model) newNote.tags = currentNote.tags setField(newNote, settings['textField'], fixImages(text)) if settings['extractDeck']: deck = mw.col.decks.byName(settings['extractDeck']) if not deck: showWarning('Destination deck no longer exists. ' 'Please update your settings.') return did = deck['id'] else: did = currentCard.did if settings['isQuickKey']: newNote.tags += settings['tags'] if settings['sourceField']: setField(newNote, settings['sourceField'], getField(currentNote, self.settings['sourceField'])) if settings['editExtract']: highlight = self._editExtract(newNote, did, settings) else: highlight = True newNote.model()['did'] = did mw.col.addNote(newNote) else: if settings['copyTitle']: title = getField(currentNote, settings['titleField']) else: title = '' setField(newNote, settings['sourceField'], getField(currentNote, settings['sourceField'])) if settings['prioEnabled']: setField(newNote, settings['prioField'], getField(currentNote, settings['prioField'])) if settings['editExtract']: setField(newNote, settings['titleField'], title) highlight = self._editExtract(newNote, did, settings) else: highlight = self._getTitle(newNote, did, title, settings) if settings['scheduleExtract'] and not settings['prioEnabled']: cards = newNote.cards() if cards: mw.readingManager.scheduler.answer(cards[0], SCHEDULE_EXTRACT) if highlight: self.highlight(settings['extractBgColor'], settings['extractTextColor']) if settings['editSource']: EditCurrent(mw)