From 3fe1e0eb06243898b0bf3d121b85249051383da3 Mon Sep 17 00:00:00 2001 From: David Snopek Date: Wed, 24 Jul 2013 20:17:52 +0100 Subject: [PATCH] Implemented 'create_dynamic_deck' for custom study options. --- AnkiServer/apps/rest_app.py | 43 +++++++++++++++++++++++++++++++++++++ tests/test_rest_app.py | 16 ++++++++++++++ 2 files changed, 59 insertions(+) diff --git a/AnkiServer/apps/rest_app.py b/AnkiServer/apps/rest_app.py index 15529f1..b8d2e15 100644 --- a/AnkiServer/apps/rest_app.py +++ b/AnkiServer/apps/rest_app.py @@ -14,6 +14,7 @@ except ImportError: import os, logging +import anki.consts import anki.lang from anki.lang import _ as t @@ -336,6 +337,48 @@ class CollectionHandler(RestHandlerBase): def select_deck(self, col, req): col.decks.select(req.data['deck_id']) + dyn_modes = { + 'random': anki.consts.DYN_RANDOM, + 'added': anki.consts.DYN_ADDED, + 'due': anki.consts.DYN_DUE, + } + + def create_dynamic_deck(self, col, req): + name = req.data.get('name', t('Custom Study Session')) + deck = col.decks.byName(name) + if deck: + if not deck['dyn']: + raise HTTPBadRequest("There is an existing non-dynamic deck with the name %s" % name) + + # safe to empty it because it's a dynamic deck + # TODO: maybe this should be an option? + col.sched.emptyDyn(deck['id']) + else: + deck = col.decks.get(col.decks.newDyn(name)) + + query = req.data.get('query', '') + count = req.data.get('count', 100) + mode = req.data.get('mode', 'random') + + try: + mode = self.dyn_modes[mode] + except KeyError: + raise HTTPBadRequest("Unknown mode: %s" % mode) + + deck['terms'][0] = [query, count, mode] + + if mode != anki.consts.DYN_RANDOM: + deck['resched'] = True + else: + deck['resched'] = False + + if not col.sched.rebuildDyn(deck['id']): + raise HTTPBadRequest("No cards matched the criteria you provided") + + col.decks.save(deck) + + return deck + # # CARD - A specific card in a deck with a history of review (generated from # a note based on the template). diff --git a/tests/test_rest_app.py b/tests/test_rest_app.py index 6643c94..6bd9e2d 100644 --- a/tests/test_rest_app.py +++ b/tests/test_rest_app.py @@ -179,6 +179,22 @@ class CollectionHandlerTest(CollectionTestBase): ret = self.execute('select_deck', data) self.assertEqual(ret, None); + def test_create_dynamic_deck_simple(self): + self.add_default_note(5) + + data = { + 'name': 'Dyn deck', + 'mode': 'random', + 'count': 2, + 'query': "deck:\"Default\" (tag:'Tag1' or tag:'Tag2') (-tag:'Tag3')", + } + ret = self.execute('create_dynamic_deck', data) + self.assertEqual(ret['name'], 'Dyn deck') + self.assertEqual(ret['dyn'], True) + + cards = self.collection.findCards('deck:"Dyn deck"') + self.assertEqual(len(cards), 2) + def test_list_models(self): data = {} ret = self.execute('list_models', data)