Skip to content

Instantly share code, notes, and snippets.

@eshapard
Last active October 23, 2023 21:04
Show Gist options
  • Star 7 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save eshapard/b15e0df7d115b20cb58f57f44ba17c08 to your computer and use it in GitHub Desktop.
Save eshapard/b15e0df7d115b20cb58f57f44ba17c08 to your computer and use it in GitHub Desktop.
Anki 2.0 addon. Prevents learning (and re-learning) cards from being removed from a filtered deck. This allows you to rebuild the deck while keeping the learning cards inside of it; bypassing the problems with Anki decks where learning cards are set back to 'new' or 'review' when they exit a filtered deck.
# Filter Safety
# Anki 2.0 addon
# Author EJS
# https://eshapard.github.io/
#
# Prevents cards in learning state from being moved out of a filtered deck
# when you rebuild it.
from anki.sched import Scheduler
#from aqt.utils import showInfo
def safeEmptyDyn(self, did, lim=None):
if not lim:
lim = "did = %s and type != 1 and queue != 1" % did
else:
lim = "%s and type != 1 and queue != 1" % lim
ret = origEmptyDyn(self, did, lim)
return ret
origEmptyDyn = Scheduler.emptyDyn
Scheduler.emptyDyn = safeEmptyDyn
@eshapard
Copy link
Author

This has not been extensively tested, but I think it works. Back up your collection first as a precaution.

@gajewsk2
Copy link

gajewsk2 commented Aug 18, 2017

Wow, this is timely. I was just whining about this issue the other day but hadn't had time to do something similar. https://anki.tenderapp.com/discussions/ankidesktop/24502-why-is-there-no-option-to-filter-parent-decks-like-filtered-decks

My decks relies on hierarchy, so eventually I need to figure out a way to get root decks to ignore the alphabetical order of subdecks and treat all the cards in the subdeck as a single deck, (to give me ascending ivl for all subdecks regardless of deck hierarchy). This might be a nice stop-gap until I figure that out and stop using filtered decks for anything besides cramming.

Thanks for making it public.

UPDATE: been using since i commented. Has been great.

@EliCodesForFun
Copy link

Godlike. I've been using filtered decks for years, but I just used the workaround by including a "is:due -is:learn" but it's not a perfect solution for cards that are in the re-learning queue in the filtered deck, which can get lost if you have to rebuild. Awesome fix!

@ArtappsLaurens
Copy link

Do you have any plans of porting this add on to 2.1? Would love that. Keep up the good work

@Geniusssmit
Copy link

Still waiting for 2.1 :)

@thiswillbeyourgithub
Copy link

Waiting for 2.1 port too :)

@eshapard
Copy link
Author

Sorry, I don't use Anki anymore, so I'll probably never get around to porting it to 2.1.

If anyone wants to take a crack at it, it might work if you rename it to init.py and drop it in a subdirectory under the 2.1 addons directory.

See: https://ankitects.github.io/addon-docs/#/porting2.0

@albo2albo
Copy link

I've just tried this under 2.1 and it appears to work, by more or less following eshapard's comment above on 24th Feb. Here's what I did:

  1. create a folder called filterSafety in the addons folder ie AppData\Roaming\Anki2\addons21\filterSafety
  2. in this folder create a file called __init__.py which contains lines 1 - 20 from filterSafety.py above.
  3. restart Anki

You should note that there are two underscores before and after 'init', as seen in point 2 above.

Hope this helps someone else.

Cheers

@thiswillbeyourgithub
Copy link

Am trying this too. Thanks for the quick tutorial @albo2albo !

If I don't come back here to complain then it probably works OR seems to work OR didn't cause major harm.

@justpeanuts
Copy link

justpeanuts commented Sep 28, 2023

Sorry, I don't use Anki anymore, so I'll probably never get around to porting it to 2.1.

Hi, just stumbled on this repo..
@eshapard mind saying what made you quit anki? what do you use instead? (Just curious.. sorry if it seems nosy.)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment