Example #1
0
    def run(self, args: argparse.Namespace) -> None:
        deck_name: str = args.deck
        num: int = args.id
        question: Optional[str] = args.question
        answers: Optional[List[str]] = args.answer
        tags: Optional[List[str]] = args.tag
        new_num: Optional[int] = args.new_id

        with db.session_scope() as session:
            deck = db.get_deck_by_name(session, deck_name)
            card = db.get_card_by_num(session, deck, num)

            if not util.confirm(
                    'Are you sure you want to update card #%d (%r)?' %
                (card.num, card.question)):
                return

            if question is not None:
                card.question = question

            if answers is not None:
                card.answers = answers

            if tags is not None:
                card.tags = [
                    db.get_tag_by_name(session, deck, tag) for tag in tags
                ]

            if new_num is not None:
                db.move_card(session, card, new_num)
Example #2
0
 def run(self, args: argparse.Namespace) -> None:
     deck_name: str = args.deck
     how_many: Optional[int] = args.n
     mode: Mode = args.mode
     with db.session_scope() as session:
         deck = db.get_deck_by_name(session, deck_name)
         _review(session, deck, how_many, mode)
Example #3
0
    def run(self, args: argparse.Namespace) -> None:
        deck_name: str = args.deck
        deck_description: Optional[str] = args.description

        with db.session_scope() as session:
            deck = db.get_deck_by_name(session, deck_name)
            if deck_description is not None:
                deck.description = deck_description
Example #4
0
 def run(self, args: argparse.Namespace) -> None:
     deck_name: str = args.deck
     with db.session_scope() as session:
         deck = db.get_deck_by_name(session, deck_name)
         if not util.confirm(
                 'Are you sure you want to delete deck %r?' % deck_name):
             return
         session.delete(deck)
Example #5
0
 def run(self, args: argparse.Namespace) -> None:
     deck_name: str = args.deck
     tag_name: str = args.tag
     with db.session_scope() as session:
         deck = db.get_deck_by_name(session, deck_name)
         tag = db.get_tag_by_name(session, deck, tag_name)
         if not util.confirm(
                 'Are you sure you want to delete tag %r?' % tag.name):
             return
         session.delete(tag)
Example #6
0
 def run(self, args: argparse.Namespace) -> None:
     deck_name: str = args.deck
     deck_description: str = args.description
     with db.session_scope() as session:
         if db.try_get_deck_by_name(session, deck_name):
             raise error.DeckAlreadyExistsError(
                 'A deck with name %r already exists' % deck_name)
         deck = db.Deck()
         deck.name = deck_name
         deck.description = deck_description
         session.add(deck)
Example #7
0
    def run(self, args: argparse.Namespace) -> None:
        deck_name: str = args.deck
        path: str = args.output

        with db.session_scope() as session:
            deck = db.get_deck_by_name(session, deck_name)
            if path:
                with open(path, 'w') as handle:
                    _write_report(deck, session, handle)
            else:
                _write_report(deck, session, sys.stdout)
Example #8
0
    def run(self, args: argparse.Namespace) -> None:
        deck_name: str = args.deck
        tag_name: str = args.name
        tag_color: Optional[str] = args.color

        with db.session_scope() as session:
            deck = db.get_deck_by_name(session, deck_name)

            tag = db.Tag()
            tag.name = tag_name
            tag.color = tag_color
            deck.tags.append(tag)
Example #9
0
 def run(self, args: argparse.Namespace) -> None:
     deck_name: str = args.deck
     num: int = args.id
     with db.session_scope() as session:
         deck = db.get_deck_by_name(session, deck_name)
         card = db.get_card_by_num(session, deck, num)
         if not util.confirm(
                 "Are you sure you want to delete card #%d (%r)?" %
             (card.num, card.question)):
             return
         for user_answer in card.user_answers:
             session.delete(user_answer)
         session.delete(card)
Example #10
0
    def run(self, _args: argparse.Namespace) -> None:
        with db.session_scope() as session:
            if not session.query(db.Deck).count():
                print("No decks to show.")
                return

            results = session.query(db.Deck.id, db.Deck.name,
                                    db.Deck.description)
            for deck_id, name, description in results:
                card_count = (session.query(sa.func.count(
                    db.Deck.cards)).filter(db.Deck.id == deck_id).scalar())
                print("%s: %s (%d cards)" %
                      (name, description or "(no description)", card_count))
Example #11
0
    def run(self, args: argparse.Namespace) -> None:
        deck_name: str = args.deck

        with db.session_scope() as session:
            deck = db.get_deck_by_name(session, deck_name)
            tags = (session.query(
                db.Tag).filter(db.Tag.deck_id == deck.id).all())

            if not tags:
                print("No tags to show.")
                return

            for i, tag in enumerate(tags):
                _print_single_tag(session, i, tag)
Example #12
0
    def run(self, args: argparse.Namespace) -> None:
        deck_name: str = args.deck
        tag_name: str = args.tag
        tag_color: Optional[str] = args.color
        new_tag_name: Optional[str] = args.name

        with db.session_scope() as session:
            deck = db.get_deck_by_name(session, deck_name)
            tag = db.get_tag_by_name(session, deck, tag_name)

            if tag_color is not None:
                tag.color = tag_color

            if new_tag_name is not None:
                tag.name = new_tag_name
Example #13
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)
Example #14
0
    def run(self, args: argparse.Namespace) -> None:
        deck_name: str = args.deck
        how_many: int = args.n

        with db.session_scope() as session:
            deck = db.get_deck_by_name(session, deck_name)
            cards_to_study = scheduler.get_cards_to_study(
                session, deck, how_many)

            if not cards_to_study:
                print('No cards to study.')
                return

            print('%d cards to study. After seeing a card, hit enter.' %
                  len(cards_to_study))
            print()

            for index, card in enumerate(cards_to_study):
                _learn_single_card(index, cards_to_study, card)
Example #15
0
    def run(self, args: argparse.Namespace) -> None:
        deck_name: str = args.deck
        path: Optional[str] = args.path

        with db.session_scope() as session:
            deck = db.get_deck_by_name(session, deck_name)
            deck = (session.query(
                db.Deck).filter(db.Deck.id == deck.id).options(
                    sa.orm.subqueryload(db.Deck.cards).subqueryload(
                        db.Card.tags),
                    sa.orm.subqueryload(db.Deck.cards).subqueryload(
                        db.Card.user_answers),
                ).one())

            if path:
                with open(path, "w") as handle:
                    _export(deck, handle)
            else:
                _export(deck, sys.stdout)
Example #16
0
    def run(self, args: argparse.Namespace) -> None:
        deck_name: str = args.deck
        question: Optional[str] = args.question
        tag: Optional[str] = args.tag
        sort_style: str = args.sort
        show_answers: bool = args.show_answers

        with db.session_scope() as session:
            deck = db.get_deck_by_name(session, deck_name)
            cards = session \
                .query(db.Card) \
                .filter(db.Card.deck_id == deck.id) \
                .options(sa.orm.subqueryload('user_answers'))

            if question is not None:
                cards = cards.filter(
                    sa.func.lower(db.Card.question).like(
                        sa.func.lower(question)))

            if sort_style == SORT_NONE:
                cards = cards.order_by(db.Card.num.asc())
            elif sort_style == SORT_DUE_DATE:
                cards = cards.order_by(db.Card.is_active.desc())
                cards = cards.order_by(db.Card.due_date.asc())
                cards = cards.order_by(db.Card.num.asc())
            else:
                assert False

            cards = cards.all()
            if tag is not None:
                cards = [
                    card
                    for card in cards
                    if tag.lower() in [t.name.lower() for t in card.tags]]

            if not cards:
                print('No cards to show.')
                return

            index_length = ceil(log10(db.get_max_card_num(session, deck)))
            for card in cards:
                _print_single_card(index_length, card, show_answers)
Example #17
0
    def run(self, args: argparse.Namespace) -> None:
        deck_name: str = args.deck
        question: str = args.question
        answers: List[str] = args.answer
        tags: List[str] = args.tag or []
        prepend: bool = args.place == PREPEND

        with db.session_scope() as session:
            deck = db.get_deck_by_name(session, deck_name)

            max_card_num = db.get_max_card_num(session, deck)
            card = db.Card()
            card.num = max_card_num + 1
            card.question = question
            card.answers = answers
            card.tags = [
                db.get_tag_by_name(session, deck, tag) for tag in tags
            ]
            card.is_active = False
            card.due_date = None
            deck.cards.append(card)
            if prepend:
                max_active_card_num = db.get_max_active_card_num(session, deck)
                db.move_card(session, card, max_active_card_num + 1)