diff --git a/proto/anki/decks.proto b/proto/anki/decks.proto index 97c4dfb7d..3a38f3a8b 100644 --- a/proto/anki/decks.proto +++ b/proto/anki/decks.proto @@ -11,6 +11,8 @@ import "anki/generic.proto"; import "anki/collection.proto"; service DecksService { + rpc NewDeck(generic.Empty) returns (Deck); + rpc AddDeck(Deck) returns (collection.OpChangesWithId); rpc AddDeckLegacy(generic.Json) returns (collection.OpChangesWithId); rpc AddOrUpdateDeckLegacy(AddOrUpdateDeckLegacyRequest) returns (DeckId); rpc DeckTree(DeckTreeRequest) returns (DeckTreeNode); diff --git a/pylib/anki/decks.py b/pylib/anki/decks.py index 6c540ae5a..a1bb8283c 100644 --- a/pylib/anki/decks.py +++ b/pylib/anki/decks.py @@ -25,6 +25,7 @@ FilteredDeckConfig = decks_pb2.Deck.Filtered DeckCollapseScope = decks_pb2.SetDeckCollapsedRequest.Scope DeckConfigsForUpdate = deckconfig_pb2.DeckConfigsForUpdate UpdateDeckConfigs = deckconfig_pb2.UpdateDeckConfigsRequest +Deck = decks_pb2.Deck # type aliases until we can move away from dicts DeckDict = dict[str, Any] @@ -104,9 +105,9 @@ class DeckManager(DeprecatedNamesMixin): if id := self.col.decks.id_for_name(name): return OpChangesWithId(id=id) else: - deck = self.col.decks.new_deck_legacy(filtered=False) - deck["name"] = name - return self.add_deck_legacy(deck) + deck = self.col.decks.new_deck() + deck.name = name + return self.add_deck(deck) def add_deck_legacy(self, deck: DeckDict) -> OpChangesWithId: "Add a deck created with new_deck_legacy(). Must have id of 0." @@ -161,6 +162,13 @@ class DeckManager(DeprecatedNamesMixin): def get_all_legacy(self) -> list[DeckDict]: return list(from_json_bytes(self.col._backend.get_all_decks_legacy()).values()) + def new_deck(self) -> Deck: + "Return a new normal deck. It must be added with .add_deck() after a name assigned." + return self.col._backend.new_deck() + + def add_deck(self, deck: Deck) -> OpChangesWithId: + return self.col._backend.add_deck(message=deck) + def new_deck_legacy(self, filtered: bool) -> DeckDict: deck = from_json_bytes(self.col._backend.new_deck_legacy(filtered)) if deck["dyn"]: diff --git a/rslib/src/backend/decks.rs b/rslib/src/backend/decks.rs index 63cf04743..be2a5cafb 100644 --- a/rslib/src/backend/decks.rs +++ b/rslib/src/backend/decks.rs @@ -13,6 +13,15 @@ use crate::{ }; impl DecksService for Backend { + fn new_deck(&self, _input: pb::Empty) -> Result { + Ok(Deck::new_normal().into()) + } + + fn add_deck(&self, deck: pb::Deck) -> Result { + let mut deck: Deck = deck.try_into()?; + self.with_col(|col| Ok(col.add_deck(&mut deck)?.map(|_| deck.id.0).into())) + } + fn add_deck_legacy(&self, input: pb::Json) -> Result { let schema11: DeckSchema11 = serde_json::from_slice(&input.json)?; let mut deck: Deck = schema11.into();