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)
Exemple #3
0
    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()
Exemple #5
0
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
Exemple #6
0
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
Exemple #7
0
 def addNote(self, note: Note) -> int:
     self.add_note(note, note.model()["did"])
     return len(note.cards())
Exemple #8
0
    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)