diff --git a/anki/collection.py b/anki/collection.py index 1c6376af7..2dd413444 100644 --- a/anki/collection.py +++ b/anki/collection.py @@ -81,7 +81,11 @@ class _Collection: backend: Backend def __init__( - self, db: DB, backend: Backend, server: bool = False, log: bool = False + self, + db: DB, + backend: Backend, + server: Optional["anki.storage.ServerData"] = None, + log: bool = False, ) -> None: self.backend = backend self._debugLog = log @@ -92,7 +96,7 @@ class _Collection: self.server = server self._lastSave = time.time() self.clearUndo() - self.media = MediaManager(self, server) + self.media = MediaManager(self, server is not None) self.models = ModelManager(self) self.decks = DeckManager(self) self.tags = TagManager(self) @@ -132,6 +136,8 @@ class _Collection: self.sched = V2Scheduler(self) if not self.server: self.conf["localOffset"] = self.sched.timezoneOffset() + elif self.server.minutes_west is not None: + self.conf["localOffset"] = self.server.minutes_west def changeSchedulerVer(self, ver: int) -> None: if ver == self.schedVer(): diff --git a/anki/storage.py b/anki/storage.py index 259661897..1012cf6af 100644 --- a/anki/storage.py +++ b/anki/storage.py @@ -6,7 +6,7 @@ import copy import json import os import re -from typing import Any, Dict, Tuple +from typing import Any, Dict, Optional, Tuple from anki.backend import Backend from anki.collection import _Collection @@ -23,8 +23,12 @@ from anki.stdmodels import ( from anki.utils import intTime, isWin +class ServerData: + minutes_west: Optional[int] + + def Collection( - path: str, lock: bool = True, server: bool = False, log: bool = False + path: str, lock: bool = True, server: Optional[ServerData] = None, log: bool = False ) -> _Collection: "Open a new or existing collection. Path must be unicode." backend = Backend() diff --git a/anki/sync.py b/anki/sync.py index 26359b324..0ddec2033 100644 --- a/anki/sync.py +++ b/anki/sync.py @@ -36,7 +36,7 @@ class UnexpectedSchemaChange(Exception): class Syncer: cursor: Optional[sqlite3.Cursor] - def __init__(self, col, server=None) -> None: + def __init__(self, col: "anki.storage._Collection", server=None) -> None: self.col = col self.server = server @@ -95,7 +95,9 @@ class Syncer: return "basicCheckFailed" # step 2: startup and deletions runHook("sync", "meta") - rrem = self.server.start(minUsn=self.minUsn, lnewer=self.lnewer) + rrem = self.server.start( + minUsn=self.minUsn, lnewer=self.lnewer, offset=self.col.localOffset() + ) # apply deletions to server lgraves = self.removed() @@ -178,7 +180,9 @@ class Syncer: def changes(self) -> dict: "Bundle up small objects." - d = dict(models=self.getModels(), decks=self.getDecks(), tags=self.getTags()) + d: Dict[str, Any] = dict( + models=self.getModels(), decks=self.getDecks(), tags=self.getTags() + ) if self.lnewer: d["conf"] = self.getConf() d["crt"] = self.col.crt @@ -328,7 +332,7 @@ from notes where %s""" def remove(self, graves) -> None: # pretend to be the server so we don't set usn = -1 - self.col.server = True + self.col.server = True # type: ignore # notes first, so we don't end up with duplicate graves self.col._remNotes(graves["notes"]) @@ -338,7 +342,7 @@ from notes where %s""" for oid in graves["decks"]: self.col.decks.rem(oid, childrenToo=False) - self.col.server = False + self.col.server = False # type: ignore # Models ##########################################################################