Beispiel #1
0
def _review(
    session: Any, deck: db.Deck, how_many: Optional[int], mode: Mode
) -> None:
    first_iteration = True
    cards_left = how_many
    while True:
        cards_to_review = scheduler.get_cards_to_review(session, deck)
        random.shuffle(cards_to_review)
        if cards_left is not None:
            cards_to_review = cards_to_review[0:cards_left]

        if not cards_to_review:
            due_cards = scheduler.get_due_cards(session, deck)

            if first_iteration:
                print("No cards to review.")
            else:
                print("No more cards to review.")
            if due_cards:
                next_due_date = due_cards[0].due_date
                assert next_due_date
                print(
                    "Next review in %s."
                    % util.format_timedelta(next_due_date - datetime.now())
                )
            return

        if not first_iteration:
            print("%d cards to review." % len(cards_to_review))
            print()

        index = 0
        correct_answer_count = 0
        while index < len(cards_to_review):
            card = cards_to_review[index]
            user_answer = _review_single_card(
                index, correct_answer_count, cards_to_review, card, mode
            )
            card.user_answers.append(user_answer)
            index += 1
            if user_answer.is_correct:
                card.due_date = scheduler.next_due_date(card)
                correct_answer_count += 1
                if cards_left is not None:
                    cards_left -= 1
            else:
                cards_to_review.insert(
                    random.randint(
                        index + ((len(cards_to_review) - index) // 2),
                        len(cards_to_review),
                    ),
                    card,
                )
            session.commit()

        first_iteration = False
Beispiel #2
0
def _learn_single_card(index: int, cards_to_study: List[db.Card],
                       card: db.Card) -> None:
    print('Card #{} ({:.01%} done, {} left)'.format(
        card.num, index / len(cards_to_study),
        len(cards_to_study) - index))
    question = 'Question: %s' % card.question
    if card.tags:
        question += ' [%s]' % util.format_card_tags(card.tags)
    util.ask(question)
    util.ask('Answers: %s' % ', '.join(card.answers))
    print('')

    card.is_active = True
    card.due_date = scheduler.next_due_date(card)
    card.activation_date = datetime.now()
Beispiel #3
0
def _learn_single_card(index: int, num_cards_to_study: int, card: db.Card,
                       mode: Mode) -> None:
    print("Card #{} ({:.01%} done, {} left)".format(
        card.num, index / num_cards_to_study, num_cards_to_study - index))

    raw_question = card.question
    raw_answers = card.answers
    if mode is Mode.reversed or mode is Mode.mixed and random.random() > 0.5:
        raw_question, raw_answers = random.choice(raw_answers), [raw_question]

    util.ask(render_question_prompt(raw_question, raw_answers, card.tags))
    util.ask("Answers: %s" % ", ".join(raw_answers))
    print("")

    card.is_active = True
    card.due_date = scheduler.next_due_date(card)
    card.activation_date = datetime.now()
Beispiel #4
0
def _import(handle: IO[Any]) -> None:
    with db.session_scope() as session:
        deck_obj = json.load(handle)

        deck = db.Deck()
        deck.name = deck_obj['name']
        deck.description = deck_obj['description']

        existing_deck = db.try_get_deck_by_name(session, deck.name)
        if existing_deck:
            if not util.confirm(
                    'Are you sure you want to overwrite deck %r?' % deck.name):
                return
            session.delete(existing_deck)
            session.commit()

        tag_dict = {}
        for tag_obj in deck_obj['tags']:
            tag = db.Tag()
            tag.name = tag_obj['name']
            tag.color = tag_obj['color']
            deck.tags.append(tag)
            tag_dict[tag.name] = tag

        for card_obj in deck_obj['cards']:
            card = db.Card()
            card.num = card_obj['id']
            card.question = card_obj['question']
            card.answers = card_obj['answers']
            card.is_active = card_obj['active']
            card.tags = [tag_dict[name] for name in card_obj['tags']]
            for user_answer_obj in card_obj['user_answers']:
                user_answer = db.UserAnswer()
                user_answer.date = parse_date(user_answer_obj['date'])
                user_answer.is_correct = user_answer_obj['correct']
                card.user_answers.append(user_answer)
            if 'activation_date' in card_obj:
                if card_obj['activation_date']:
                    card.activation_date = parse_date(
                        card_obj['activation_date'])
            elif card.user_answers:
                card.activation_date = sorted(card.user_answers,
                                              key=lambda ua: ua.date)[0].date
            card.due_date = scheduler.next_due_date(card)
            deck.cards.append(card)
        session.add(deck)