mirror of
https://github.com/ankitects/anki.git
synced 2025-09-25 01:06:35 -04:00
Add support for multi deck deletion in python
This commit is contained in:
parent
f7c20e40b5
commit
88c69665f3
4 changed files with 42 additions and 20 deletions
|
@ -2,6 +2,7 @@ decks-add-new-deck-ctrlandn = Add New Deck (Ctrl+N)
|
||||||
decks-are-you-sure-you-wish-to = Are you sure you wish to delete { $val }?
|
decks-are-you-sure-you-wish-to = Are you sure you wish to delete { $val }?
|
||||||
decks-build = Build
|
decks-build = Build
|
||||||
decks-cards-selected-by = cards selected by
|
decks-cards-selected-by = cards selected by
|
||||||
|
decks-confirm-deletion = Are you sure you wish to delete { $deck_count } decks including { $card_count } cards?
|
||||||
decks-create-deck = Create Deck
|
decks-create-deck = Create Deck
|
||||||
decks-custom-steps-in-minutes = Custom steps (in minutes)
|
decks-custom-steps-in-minutes = Custom steps (in minutes)
|
||||||
decks-deck = Deck
|
decks-deck = Deck
|
||||||
|
|
|
@ -135,7 +135,10 @@ class DeckManager:
|
||||||
if isinstance(did, str):
|
if isinstance(did, str):
|
||||||
did = int(did)
|
did = int(did)
|
||||||
assert cardsToo and childrenToo
|
assert cardsToo and childrenToo
|
||||||
self.col._backend.remove_deck(did)
|
self.remove([did])
|
||||||
|
|
||||||
|
def remove(self, dids: List[int]) -> None:
|
||||||
|
self.col._backend.remove_decks(dids)
|
||||||
|
|
||||||
def all_names_and_ids(
|
def all_names_and_ids(
|
||||||
self, skip_empty_default: bool = False, include_filtered: bool = True
|
self, skip_empty_default: bool = False, include_filtered: bool = True
|
||||||
|
@ -212,10 +215,15 @@ class DeckManager:
|
||||||
def count(self) -> int:
|
def count(self) -> int:
|
||||||
return len(self.all_names_and_ids())
|
return len(self.all_names_and_ids())
|
||||||
|
|
||||||
def card_count(self, did: int, include_subdecks: bool) -> Any:
|
def card_count(
|
||||||
dids: List[int] = [did]
|
self, dids: Union[int, Iterable[int]], include_subdecks: bool
|
||||||
|
) -> Any:
|
||||||
|
if isinstance(dids, int):
|
||||||
|
dids = {dids}
|
||||||
|
else:
|
||||||
|
dids = set(dids)
|
||||||
if include_subdecks:
|
if include_subdecks:
|
||||||
dids += [r[1] for r in self.children(did)]
|
dids.update([child[1] for did in dids for child in self.children(did)])
|
||||||
count = self.col.db.scalar(
|
count = self.col.db.scalar(
|
||||||
"select count() from cards where did in {0} or "
|
"select count() from cards where did in {0} or "
|
||||||
"odid in {0}".format(ids2str(dids))
|
"odid in {0}".format(ids2str(dids))
|
||||||
|
|
|
@ -5,7 +5,7 @@ from __future__ import annotations
|
||||||
from concurrent.futures import Future
|
from concurrent.futures import Future
|
||||||
from copy import deepcopy
|
from copy import deepcopy
|
||||||
from dataclasses import dataclass
|
from dataclasses import dataclass
|
||||||
from typing import Any
|
from typing import Any, List
|
||||||
|
|
||||||
import aqt
|
import aqt
|
||||||
from anki.decks import DeckTreeNode
|
from anki.decks import DeckTreeNode
|
||||||
|
@ -296,20 +296,26 @@ class DeckBrowser:
|
||||||
self.show()
|
self.show()
|
||||||
|
|
||||||
def ask_delete_deck(self, did: int) -> bool:
|
def ask_delete_deck(self, did: int) -> bool:
|
||||||
deck = self.mw.col.decks.get(did)
|
return self.ask_delete_decks([did])
|
||||||
if deck["dyn"]:
|
|
||||||
|
def ask_delete_decks(self, dids: List[int]) -> bool:
|
||||||
|
decks = [self.mw.col.decks.get(did) for did in dids]
|
||||||
|
if all([deck["dyn"] for deck in decks]):
|
||||||
return True
|
return True
|
||||||
|
|
||||||
count = self.mw.col.decks.card_count(did, include_subdecks=True)
|
count = self.mw.col.decks.card_count(dids, include_subdecks=True)
|
||||||
if not count:
|
if not count:
|
||||||
return True
|
return True
|
||||||
|
|
||||||
extra = tr(TR.DECKS_IT_HAS_CARD, count=count)
|
if len(dids) == 1:
|
||||||
if askUser(
|
extra = tr(TR.DECKS_IT_HAS_CARD, count=count)
|
||||||
f"{tr(TR.DECKS_ARE_YOU_SURE_YOU_WISH_TO, val=deck['name'])} {extra}"
|
return askUser(
|
||||||
):
|
f"{tr(TR.DECKS_ARE_YOU_SURE_YOU_WISH_TO, val=decks[0]['name'])} {extra}"
|
||||||
return True
|
)
|
||||||
return False
|
|
||||||
|
return askUser(
|
||||||
|
tr(TR.DECKS_CONFIRM_DELETION, deck_count=len(dids), card_count=count)
|
||||||
|
)
|
||||||
|
|
||||||
def _delete(self, did: int) -> None:
|
def _delete(self, did: int) -> None:
|
||||||
if self.ask_delete_deck(did):
|
if self.ask_delete_deck(did):
|
||||||
|
|
|
@ -1108,15 +1108,15 @@ class SidebarTreeView(QTreeView):
|
||||||
self.browser.model.beginReset()
|
self.browser.model.beginReset()
|
||||||
self.mw.taskman.run_in_background(do_rename, on_done)
|
self.mw.taskman.run_in_background(do_rename, on_done)
|
||||||
|
|
||||||
def delete_deck(self, item: SidebarItem) -> None:
|
def delete_deck(self, _item: SidebarItem) -> None:
|
||||||
self.browser.editor.saveNow(lambda: self._delete_deck(item))
|
self.browser.editor.saveNow(self._delete_decks)
|
||||||
|
|
||||||
def _delete_deck(self, item: SidebarItem) -> None:
|
def _delete_decks(self) -> None:
|
||||||
did = item.id
|
dids = self._selected_decks()
|
||||||
if self.mw.deckBrowser.ask_delete_deck(did):
|
if self.mw.deckBrowser.ask_delete_decks(dids):
|
||||||
|
|
||||||
def do_delete() -> None:
|
def do_delete() -> None:
|
||||||
return self.mw.col.decks.rem(did, True)
|
return self.mw.col.decks.remove(dids)
|
||||||
|
|
||||||
def on_done(fut: Future) -> None:
|
def on_done(fut: Future) -> None:
|
||||||
self.mw.requireReset(reason=ResetReason.BrowserDeleteDeck, context=self)
|
self.mw.requireReset(reason=ResetReason.BrowserDeleteDeck, context=self)
|
||||||
|
@ -1190,3 +1190,10 @@ class SidebarTreeView(QTreeView):
|
||||||
|
|
||||||
def _selected_items(self) -> List[SidebarItem]:
|
def _selected_items(self) -> List[SidebarItem]:
|
||||||
return [self.model().item_for_index(idx) for idx in self.selectedIndexes()]
|
return [self.model().item_for_index(idx) for idx in self.selectedIndexes()]
|
||||||
|
|
||||||
|
def _selected_decks(self) -> List[int]:
|
||||||
|
return [
|
||||||
|
item.id
|
||||||
|
for item in self._selected_items()
|
||||||
|
if item.item_type == SidebarItemType.DECK
|
||||||
|
]
|
||||||
|
|
Loading…
Reference in a new issue