def exportInto(self, path): n = 3 if not self.includeSchedulingInfo: n += 1 try: os.unlink(path) except (IOError, OSError): pass self.newDeck = DeckStorage.Deck(path) client = SyncClient(self.deck) server = SyncServer(self.newDeck) client.setServer(server) client.localTime = self.deck.modified client.remoteTime = 0 self.deck.db.flush() # set up a custom change list and sync lsum = self.localSummary() rsum = server.summary(0) payload = client.genPayload((lsum, rsum)) res = server.applyPayload(payload) if not self.includeSchedulingInfo: self.newDeck.resetCards() # media if self.includeMedia: server.deck.mediaPrefix = "" copyLocalMedia(client.deck, server.deck) # need to save manually self.newDeck.rebuildCounts() # FIXME #self.exportedCards = self.newDeck.cardCount self.newDeck.crt = 0 self.newDeck.db.commit() self.newDeck.close()
def exportInto(self, path): n = 3 if not self.includeSchedulingInfo: n += 1 try: os.unlink(path) except (IOError, OSError): pass self.newCol = DeckStorage.Deck(path) client = SyncClient(self.deck) server = SyncServer(self.newDeck) client.setServer(server) client.localTime = self.deck.modified client.remoteTime = 0 self.deck.db.flush() # set up a custom change list and sync lsum = self.localSummary() rsum = server.summary(0) payload = client.genPayload((lsum, rsum)) res = server.applyPayload(payload) if not self.includeSchedulingInfo: self.newDeck.resetCards() # media if self.includeMedia: server.deck.mediaPrefix = "" copyLocalMedia(client.deck, server.deck) # need to save manually self.newDeck.rebuildCounts() # FIXME #self.exportedCards = self.newDeck.cardCount self.newDeck.crt = 0 self.newDeck.db.commit() self.newDeck.close()
def test_localsync_media(): tmpdir = "/tmp/media-tests" try: shutil.rmtree(tmpdir) except OSError: pass shutil.copytree(os.path.join(os.getcwd(), "tests/syncing/media-tests"), tmpdir) deck1anki = os.path.join(tmpdir, "1.anki") deck2anki = os.path.join(tmpdir, "2.anki") deck1media = os.path.join(tmpdir, "1.media") deck2media = os.path.join(tmpdir, "2.media") setup_local((deck1anki, deck2anki)) assert len(os.listdir(deck1media)) == 2 assert len(os.listdir(deck2media)) == 1 client.sync() # metadata should have been copied assert deck1.s.scalar("select count(1) from media") == 3 assert deck2.s.scalar("select count(1) from media") == 3 # copy local files copyLocalMedia(deck1, deck2) assert len(os.listdir(deck1media)) == 2 assert len(os.listdir(deck2media)) == 3 copyLocalMedia(deck2, deck1) assert len(os.listdir(deck1media)) == 3 assert len(os.listdir(deck2media)) == 3 # check delete os.unlink(os.path.join(deck1media, "22161b29b0c18e068038021f54eee1ee.png")) os.system("sync") time.sleep(0.2) rebuildMediaDir(deck1) client.sync() assert deck1.s.scalar("select count(1) from media") == 2 assert deck2.s.scalar("select count(1) from media") == 2
def doImport(self): "Import." random = self.deck.newCardOrder == NEW_CARDS_RANDOM num = 4 if random: num += 1 src = DeckStorage.Deck(self.file, backup=False) client = SyncClient(self.deck) server = SyncServer(src) client.setServer(server) # if there is a conflict, sync local -> src client.localTime = self.deck.modified client.remoteTime = 0 src.s.execute("update facts set modified = 1") src.s.execute("update models set modified = 1") src.s.execute("update cards set modified = 1") src.s.execute("update media set created = 1") self.deck.db.flush() # set up a custom change list and sync lsum = client.summary(0) self._clearDeleted(lsum) rsum = server.summary(0) self._clearDeleted(rsum) payload = client.genPayload((lsum, rsum)) # no need to add anything to src payload['added-models'] = [] payload['added-cards'] = [] payload['added-facts'] = {'facts': [], 'fields': []} assert payload['deleted-facts'] == [] assert payload['deleted-cards'] == [] assert payload['deleted-models'] == [] res = server.applyPayload(payload) client.applyPayloadReply(res) copyLocalMedia(server.deck, client.deck) # add tags fids = [f[0] for f in res['added-facts']['facts']] self.deck.addTags(fids, self.tagsToAdd) # mark import material as newly added self.deck.db.execute("update cards set modified = :t where id in %s" % ids2str([x[0] for x in res['added-cards']]), t=time.time()) self.deck.db.execute( "update facts set modified = :t where id in %s" % ids2str([x[0] for x in res['added-facts']['facts']]), t=time.time()) self.deck.db.execute("update models set modified = :t where id in %s" % ids2str([x['id'] for x in res['added-models']]), t=time.time()) # update total and refresh self.total = len(res['added-facts']['facts']) src.s.rollback() src.engine.dispose() # randomize? if random: self.deck.randomizeNewCards([x[0] for x in res['added-cards']]) self.deck.flushMod()
def doImport(self): "Import." random = self.deck.newCardOrder == NEW_CARDS_RANDOM num = 4 if random: num += 1 src = DeckStorage.Deck(self.file, backup=False) client = SyncClient(self.deck) server = SyncServer(src) client.setServer(server) # if there is a conflict, sync local -> src client.localTime = self.deck.modified client.remoteTime = 0 src.s.execute("update facts set modified = 1") src.s.execute("update models set modified = 1") src.s.execute("update cards set modified = 1") src.s.execute("update media set created = 1") self.deck.db.flush() # set up a custom change list and sync lsum = client.summary(0) self._clearDeleted(lsum) rsum = server.summary(0) self._clearDeleted(rsum) payload = client.genPayload((lsum, rsum)) # no need to add anything to src payload['added-models'] = [] payload['added-cards'] = [] payload['added-facts'] = {'facts': [], 'fields': []} assert payload['deleted-facts'] == [] assert payload['deleted-cards'] == [] assert payload['deleted-models'] == [] res = server.applyPayload(payload) client.applyPayloadReply(res) copyLocalMedia(server.deck, client.deck) # add tags fids = [f[0] for f in res['added-facts']['facts']] self.deck.addTags(fids, self.tagsToAdd) # mark import material as newly added self.deck.db.execute( "update cards set modified = :t where id in %s" % ids2str([x[0] for x in res['added-cards']]), t=time.time()) self.deck.db.execute( "update facts set modified = :t where id in %s" % ids2str([x[0] for x in res['added-facts']['facts']]), t=time.time()) self.deck.db.execute( "update models set modified = :t where id in %s" % ids2str([x['id'] for x in res['added-models']]), t=time.time()) # update total and refresh self.total = len(res['added-facts']['facts']) src.s.rollback() src.engine.dispose() # randomize? if random: self.deck.randomizeNewCards([x[0] for x in res['added-cards']]) self.deck.flushMod()
def exportInto(self, path): n = 3 if not self.includeSchedulingInfo: n += 1 self.deck.startProgress(n) self.deck.updateProgress(_("Exporting...")) self.newDeck = DeckStorage.Deck(path) client = SyncClient(self.deck) server = SyncServer(self.newDeck) server._mediaSupported = self.includeMedia client.setServer(server) client.localTime = self.deck.modified client.remoteTime = 0 self.deck.s.flush() # set up a custom change list and sync lsum = self.localSummary() rsum = server.summary(0) self.deck.updateProgress() payload = client.genPayload((lsum, rsum)) self.deck.updateProgress() res = server.applyPayload(payload) if not self.includeSchedulingInfo: self.deck.updateProgress() self.newDeck.s.statement(""" delete from reviewHistory""") self.newDeck.s.statement(""" update cards set interval = 0, lastInterval = 0, due = created, lastDue = 0, factor = 2.5, firstAnswered = 0, reps = 0, successive = 0, averageTime = 0, reviewTime = 0, youngEase0 = 0, youngEase1 = 0, youngEase2 = 0, youngEase3 = 0, youngEase4 = 0, matureEase0 = 0, matureEase1 = 0, matureEase2 = 0, matureEase3 = 0, matureEase4 = 0, yesCount = 0, noCount = 0, spaceUntil = 0, isDue = 1, type = 2, combinedDue = created, modified = :now """, now=time.time()) self.newDeck.s.statement(""" delete from stats""") # media copyLocalMedia(client.deck, server.deck) # need to save manually self.newDeck.rebuildCounts() self.newDeck.updateAllPriorities() self.exportedCards = self.newDeck.cardCount self.newDeck.utcOffset = -1 self.newDeck.s.commit() self.newDeck.close() self.deck.finishProgress()
def exportInto(self, path): n = 3 if not self.includeSchedulingInfo: n += 1 self.deck.startProgress(n) self.deck.updateProgress(_("Exporting...")) try: os.unlink(path) except (IOError, OSError): pass self.newDeck = DeckStorage.Deck(path) client = SyncClient(self.deck) server = SyncServer(self.newDeck) client.setServer(server) client.localTime = self.deck.modified client.remoteTime = 0 self.deck.s.flush() # set up a custom change list and sync lsum = self.localSummary() rsum = server.summary(0) self.deck.updateProgress() payload = client.genPayload((lsum, rsum)) self.deck.updateProgress() res = server.applyPayload(payload) if not self.includeSchedulingInfo: self.deck.updateProgress() self.newDeck.s.statement(""" delete from reviewHistory""") self.newDeck.s.statement(""" update cards set interval = 0, lastInterval = 0, due = created, lastDue = 0, factor = 2.5, firstAnswered = 0, reps = 0, successive = 0, averageTime = 0, reviewTime = 0, youngEase0 = 0, youngEase1 = 0, youngEase2 = 0, youngEase3 = 0, youngEase4 = 0, matureEase0 = 0, matureEase1 = 0, matureEase2 = 0, matureEase3 = 0, matureEase4 = 0, yesCount = 0, noCount = 0, spaceUntil = 0, type = 2, relativeDelay = 2, combinedDue = created, modified = :now """, now=time.time()) self.newDeck.s.statement(""" delete from stats""") # media if self.includeMedia: server.deck.mediaPrefix = "" copyLocalMedia(client.deck, server.deck) # need to save manually self.newDeck.rebuildCounts() self.newDeck.updateAllPriorities() self.exportedCards = self.newDeck.cardCount self.newDeck.utcOffset = -1 self.newDeck.s.commit() self.newDeck.close() self.deck.finishProgress()