mirror of
https://github.com/ankitects/anki.git
synced 2025-09-21 23:42:23 -04:00
public decks wip
This commit is contained in:
parent
2c568f5b49
commit
357801e625
2 changed files with 63 additions and 32 deletions
|
@ -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)
|
||||||
|
|
|
@ -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()
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue