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
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()
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()
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)