public decks wip

This commit is contained in:
Damien Elmes 2008-10-04 14:46:23 +09:00
parent 2c568f5b49
commit 357801e625
2 changed files with 63 additions and 32 deletions

View file

@ -17,6 +17,7 @@ from anki.errors import *
from anki.sound import hasSound, playFromText from anki.sound import hasSound, playFromText
from anki.utils import addTags, deleteTags from anki.utils import addTags, deleteTags
from anki.media import rebuildMediaDir from anki.media import rebuildMediaDir
from anki.db import OperationalError
import anki.lang import anki.lang
import ankiqt import ankiqt
ui = ankiqt.ui ui = ankiqt.ui
@ -473,7 +474,7 @@ class AnkiQt(QMainWindow):
else: else:
try: try:
self.rebuildQueue() self.rebuildQueue()
except: except OperationalError:
ui.utils.showWarning(_( ui.utils.showWarning(_(
"Error building queue. Attempting recovery..")) "Error building queue. Attempting recovery.."))
self.onCheckDB() self.onCheckDB()
@ -985,7 +986,8 @@ class AnkiQt(QMainWindow):
# Syncing # Syncing
########################################################################## ##########################################################################
def syncDeck(self, interactive=True, create=False, onlyMerge=False, reload=True): def syncDeck(self, interactive=True, create=False, onlyMerge=False,
reload=True, checkSources=True):
"Synchronise a deck with the server." "Synchronise a deck with the server."
# vet input # vet input
u=self.config['syncUsername'] u=self.config['syncUsername']
@ -1002,9 +1004,17 @@ class AnkiQt(QMainWindow):
# save first, so we can rollback on failure # save first, so we can rollback on failure
self.deck.save() self.deck.save()
self.deck.close() self.deck.close()
# store data we need before closing the deck
self.deckPath = self.deck.path self.deckPath = self.deck.path
self.syncName = self.deck.syncName or self.deck.name() self.syncName = self.deck.syncName or self.deck.name()
self.lastSync = self.deck.lastSync self.lastSync = self.deck.lastSync
if checkSources:
self.sourcesToCheck = self.deck.s.column0(
"select id from sources where syncPeriod != -1 "
"and syncPeriod = 0 or :t - lastSync > syncPeriod",
t=time.time())
else:
self.sourcesToCheck = []
self.deck = None self.deck = None
self.loadAfterSync = reload self.loadAfterSync = reload
# bug triggered by preferences dialog - underlying c++ widgets are not # bug triggered by preferences dialog - underlying c++ widgets are not
@ -1012,7 +1022,8 @@ class AnkiQt(QMainWindow):
import gc; gc.collect() import gc; gc.collect()
self.bodyView.clearWindow() self.bodyView.clearWindow()
self.bodyView.flush() self.bodyView.flush()
self.syncThread = ui.sync.Sync(self, u, p, interactive, create, onlyMerge) self.syncThread = ui.sync.Sync(self, u, p, interactive, create,
onlyMerge, self.sourcesToCheck)
self.connect(self.syncThread, SIGNAL("setStatus"), self.setSyncStatus) self.connect(self.syncThread, SIGNAL("setStatus"), self.setSyncStatus)
self.connect(self.syncThread, SIGNAL("showWarning"), ui.utils.showWarning) self.connect(self.syncThread, SIGNAL("showWarning"), ui.utils.showWarning)
self.connect(self.syncThread, SIGNAL("moveToState"), self.moveToState) self.connect(self.syncThread, SIGNAL("moveToState"), self.moveToState)

View file

@ -3,7 +3,7 @@
from PyQt4.QtGui import * from PyQt4.QtGui import *
from PyQt4.QtCore import * from PyQt4.QtCore import *
import os, types, socket, time import os, types, socket, time, traceback
import ankiqt import ankiqt
import anki import anki
from anki.sync import SyncClient, HttpSyncServerProxy from anki.sync import SyncClient, HttpSyncServerProxy
@ -16,7 +16,8 @@ import ankiqt.forms
class Sync(QThread): class Sync(QThread):
def __init__(self, parent, user, pwd, interactive, create, onlyMerge): def __init__(self, parent, user, pwd, interactive, create,
onlyMerge, sourcesToCheck):
QThread.__init__(self) QThread.__init__(self)
self.parent = parent self.parent = parent
self.interactive = interactive self.interactive = interactive
@ -25,6 +26,7 @@ class Sync(QThread):
self.create = create self.create = create
self.ok = True self.ok = True
self.onlyMerge = onlyMerge self.onlyMerge = onlyMerge
self.sourcesToCheck = sourcesToCheck
def setStatus(self, msg, timeout=5000): def setStatus(self, msg, timeout=5000):
self.emit(SIGNAL("setStatus"), msg, timeout) self.emit(SIGNAL("setStatus"), msg, timeout)
@ -54,6 +56,7 @@ class Sync(QThread):
def connect(self, *args): def connect(self, *args):
# connect, check auth # connect, check auth
proxy = HttpSyncServerProxy(self.user, self.pwd) proxy = HttpSyncServerProxy(self.user, self.pwd)
proxy.sourcesToCheck = self.sourcesToCheck
proxy.connect("ankiqt-" + ankiqt.appVersion) proxy.connect("ankiqt-" + ankiqt.appVersion)
return proxy return proxy
@ -87,12 +90,8 @@ class Sync(QThread):
client.setServer(proxy) client.setServer(proxy)
proxy.deckName = self.parent.syncName proxy.deckName = self.parent.syncName
# need to do anything? # need to do anything?
if not client.prepareSync():
self.setStatus(_("Sync: nothing to do"))
self.deck.close()
self.emit(SIGNAL("syncFinished"))
return
start = time.time() start = time.time()
if client.prepareSync():
# summary # summary
self.setStatus(_("Fetching summary from server.."), 0) self.setStatus(_("Fetching summary from server.."), 0)
sums = client.summaries() sums = client.summaries()
@ -112,13 +111,35 @@ class Sync(QThread):
self.deck.lastLoaded = self.deck.modified self.deck.lastLoaded = self.deck.modified
self.deck.s.flush() self.deck.s.flush()
self.deck.s.commit() self.deck.s.commit()
else:
self.setStatus(_("Sync: nothing to do"))
# check sources
if self.sourcesToCheck:
self.setStatus(_("<br><br>Checking shared decks.."))
for source in self.sourcesToCheck:
if not proxy.hasDeck(str(source)):
self.setStatus(_("%x no longer exists.") % source)
continue
proxy.deckName = str(source)
if not client.prepareOneWaySync():
self.setStatus(_("%x up to date.") % source)
continue
self.setStatus(_("Getting payload from %x..") % source)
payload = proxy.genOneWayPayload(client.lastSync)
self.setStatus(_("Applying %d modified cards..") %
len(payload['cards']))
client.applyOneWayPayload(payload)
self.setStatus(_("Check complete."))
self.deck.s.flush()
self.deck.s.commit()
# close and send signal to main thread # close and send signal to main thread
self.deck.close() self.deck.close()
taken = time.time() - start taken = time.time() - start
if taken < 2.5: if taken < 20.5:
time.sleep(2.5 - taken) time.sleep(20.5 - taken)
self.emit(SIGNAL("syncFinished")) self.emit(SIGNAL("syncFinished"))
except Exception, e: except Exception, e:
traceback.print_exc()
self.deck.close() self.deck.close()
# cheap hack to ensure message is displayed # cheap hack to ensure message is displayed
err = `getattr(e, 'data', None) or e` err = `getattr(e, 'data', None) or e`
@ -168,4 +189,3 @@ class DeckChooser(QDialog):
else: else:
self.name = self.decks[self.dialog.decks.currentRow() - offset] self.name = self.decks[self.dialog.decks.currentRow() - offset]
self.close() self.close()