def connect(self, *args): # connect, check auth if not self.proxy: self.setStatus(_("Connecting..."), 0) proxy = HttpSyncServerProxy(self.user, self.pwd) proxy.connect("ankiqt-" + ankiqt.appVersion) self.proxy = proxy # check clock if proxy.timediff > 300: self.emit(SIGNAL("syncClockOff"), proxy.timediff) raise SyncError(type="clockOff") return self.proxy
def do_sync(self): if self.SYNC_USERNAME == "" or self.SYNC_PASSWORD == "" and \ self.yesno_dlg(gtk.MESSAGE_QUESTION, "Do you want to set sync account?"): self.run_settings(None, None) self.deck_save() page = "<br/><br/>" self.deck.lastLoaded = time.time() #syncing while 1: proxy = HttpSyncServerProxy(self.SYNC_USERNAME, self.SYNC_PASSWORD) try: proxy.connect("ankimini") except: self.err_dlg("Cant connect - check connection and username/password") return if not proxy.hasDeck(self.deck.syncName): self.err_dlg("Cant sync, no deck on server") return if abs(proxy.timestamp - time.time()) > 60: self.err_dlg("Your clock is off by more than 60 seconds. Syncing will not work until you fix this.") return client = SyncClient(self.deck) client.setServer(proxy) # need to do anything? proxy.deckName = self.deck.syncName if not client.prepareSync(): return # summary page+=""" <html><head> <meta name="viewport" content="user-scalable=yes, width=device-width, maximum-scale=0.6667" /> </head><body>\n Fetching summary from server..<br> """ self.print_html_doc(page) sums = client.summaries() # diff page+="Determining differences.." self.print_html_doc(page) payload = client.genPayload(sums) # send payload pr = client.payloadChangeReport(payload) page+="<br>" + pr + "<br>" page+="Sending payload...<br>" self.print_html_doc(page) res = client.server.applyPayload(payload) # apply reply page+="Applying reply..<br>" self.print_html_doc(page) client.applyPayloadReply(res) # finished. save deck, preserving mod time page+="Sync complete." self.print_html_doc(page) self.deck.rebuildQueue() self.deck.lastLoaded = self.deck.modified self.deck.s.flush() self.deck.s.commit()
def syncDeck(self, deck): try: proxy = HttpSyncServerProxy(config.get('SYNC_USERNAME'), config.get('SYNC_PASSWORD')) proxy.connect("ankimini") except: raise Exception("Can't sync: " + traceback.format_exc()) if not proxy.hasDeck(deck.name()): raise Exception("Can't sync, no deck on server") if abs(proxy.timestamp - time.time()) > 60: raise Exception("Your clock is off by more than 60 seconds.<br>" \ "Syncing will not work until you fix this.") client = SyncClient(deck) client.setServer(proxy) # need to do anything? proxy.deckName = deck.name() print proxy.deckName if not client.prepareSync(0): raise Exception("Nothing to do") self.flushWrite("""<h1>Syncing deck</h1> <h2>%s</h2> <em>This could take a while with a big deck ... please be patient!</em> """ % (deck.path,) ) # hack to get safari to render immediately! self.flushWrite("<!--" + " "*1024 + "-->") # this can take a long time ... ensure the client doesn't timeout before we finish from threading import Event, Thread ping_event = Event() def ping_client( s = self.wfile, ev=ping_event ): while 1: ev.wait(3) if ev.isSet(): return s.write(".<!--\n-->") s.flush() ping_thread = Thread(target=ping_client) ping_thread.start() # summary self.lineWrite("Fetching summary from server..") sums = client.summaries() needFull = client.needFullSync(sums) if needFull: self.lineWrite("Doing full sync..") client.fullSync() else: # diff self.lineWrite("Determining differences..") payload = client.genPayload(sums) # send payload pr = client.payloadChangeReport(payload) self.lineWrite("<br>" + pr + "<br>") self.lineWrite("Sending payload...") if needFull: deck = ds.Deck(deck.path, backup=False) else: res = client.server.applyPayload(payload) # apply reply self.lineWrite("Applying reply..") client.applyPayloadReply(res) try: client.server.finish() except: deck.s.rollback() # finished. save deck, preserving mod time self.lineWrite("Sync complete.") deck.reset() deck.lastLoaded = deck.modified deck.s.flush() deck.s.commit() # turn off client ping ping_event.set() ping_thread.join(5) return deck
def syncDeck(self, deck): try: proxy = HttpSyncServerProxy(config.get('SYNC_USERNAME'), config.get('SYNC_PASSWORD')) proxy.connect("ankimini") except: raise Exception("Can't sync - check username/password") if not proxy.hasDeck(deck.syncName): raise Exception("Can't sync, no deck on server") if abs(proxy.timestamp - time.time()) > 60: raise Exception("Your clock is off by more than 60 seconds.<br>" \ "Syncing will not work until you fix this.") client = SyncClient(deck) client.setServer(proxy) # need to do anything? proxy.deckName = deck.syncName if not client.prepareSync(): raise Exception("Nothing to do") self.flushWrite("""<h1>Syncing deck</h1> <h2>%s</h2> <em>This could take a while with a big deck ... please be patient!</em> """ % (deck.path, )) # hack to get safari to render immediately! self.flushWrite("<!--" + " " * 1024 + "-->") # this can take a long time ... ensure the client doesn't timeout before we finish from threading import Event, Thread ping_event = Event() def ping_client(s=self.wfile, ev=ping_event): while 1: ev.wait(3) if ev.isSet(): return s.write(".<!--\n-->") s.flush() ping_thread = Thread(target=ping_client) ping_thread.start() # summary self.lineWrite("Fetching summary from server..") sums = client.summaries() needFull = client.needFullSync(sums) if needFull: self.lineWrite("Doing full sync..") client.fullSync() else: # diff self.lineWrite("Determining differences..") payload = client.genPayload(sums) # send payload pr = client.payloadChangeReport(payload) self.lineWrite("<br>" + pr + "<br>") self.lineWrite("Sending payload...") if needFull: deck = ds.Deck(deck.path, backup=False) # why is deck.syncName getting lost on a full sync??? if deck.syncName is None: deck.syncName = proxy.deckName print "syncName was lost on full sync, restored to", deck.syncName else: res = client.server.applyPayload(payload) # apply reply self.lineWrite("Applying reply..") client.applyPayloadReply(res) # finished. save deck, preserving mod time self.lineWrite("Sync complete.") deck.rebuildQueue() deck.lastLoaded = deck.modified deck.s.flush() deck.s.commit() # turn off client ping ping_event.set() ping_thread.join(5) return deck
def connect(self, *args): # connect, check auth proxy = HttpSyncServerProxy(self.user, self.pwd) proxy.sourcesToCheck = self.sourcesToCheck proxy.connect("ankiqt-" + ankiqt.appVersion) return proxy