From 7830911de398cb287d835a6818d911e30d5925a5 Mon Sep 17 00:00:00 2001 From: Jarrett Ye Date: Fri, 15 Nov 2024 11:32:41 +0800 Subject: [PATCH] Feat/clear manual rescheduling logs (#488) Co-authored-by: user1823 <92206575+user1823@users.noreply.github.com> --- __init__.py | 9 +++++++-- schedule/reset.py | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 2 deletions(-) diff --git a/__init__.py b/__init__.py index 59022a9..0654716 100644 --- a/__init__.py +++ b/__init__.py @@ -10,7 +10,7 @@ from .schedule.postpone import postpone from .schedule.advance import advance from .schedule.flatten import flatten -from .schedule.reset import clear_custom_data +from .schedule.reset import clear_custom_data, clear_manual_rescheduling from .schedule.disperse_siblings import disperse_siblings from .schedule.easy_days import ( easy_days, @@ -179,6 +179,10 @@ def reschedule_recent(did): menu_reset = build_action(clear_custom_data, "Clear custom data in all cards") +menu_clear_manual_rescheduling = build_action( + clear_manual_rescheduling, "Delete redundant manual revlog entries" +) + menu_disperse_siblings = build_action(disperse_siblings, "Disperse all siblings") menu_remedy_hard_misuse = build_action(remedy_hard_misuse, "Remedy") @@ -244,9 +248,10 @@ def sponsor(did=None): menu_for_helper.addAction(menu_postpone) menu_for_helper.addAction(menu_advance) menu_for_helper.addAction(menu_flatten) -menu_for_helper.addAction(menu_reset) menu_for_helper.addAction(menu_disperse_siblings) menu_for_helper.addSeparator() +menu_for_helper.addAction(menu_reset) +menu_for_helper.addAction(menu_clear_manual_rescheduling) menu_for_remedy = menu_for_helper.addMenu("Remedy Hard Misuse") menu_for_remedy.addAction(menu_remedy_hard_misuse) menu_for_remedy.addAction(menu_undo_remedy) diff --git a/schedule/reset.py b/schedule/reset.py index 14f2592..a3a0fb4 100644 --- a/schedule/reset.py +++ b/schedule/reset.py @@ -1,4 +1,5 @@ from ..utils import * +from anki.utils import ids2str def clear_custom_data(did): @@ -33,3 +34,39 @@ def clear_custom_data(did): mw.col.merge_undo_entries(undo_entry) tooltip(f"""{cnt} cards cleared in {time.time() - start_time:.2f} seconds.""") mw.reset() + + +def clear_manual_rescheduling(did): + if not askUser( + 'This option removes revlog entries generated by "Set due date" and "Reschedule cards on change" ' + + "that immediately precede another manual or reschedule entry.\n\n" + + "This action cannot be undone. Do you want to continue?" + ): + return + + if not ask_one_way_sync(): + return + + revlog_ids = mw.col.db.list( + """ + SELECT cur.id + FROM revlog as cur + WHERE cur.type >= 4 + AND cur.factor <> 0 + AND ( + SELECT type + FROM revlog + WHERE id = ( + SELECT min(id) + FROM revlog + WHERE id > cur.id + AND cid == cur.cid + ) + ) >= 4 + """ + ) + cnt = len(revlog_ids) + mw.col.db.execute(f"DELETE FROM revlog WHERE id IN {ids2str(revlog_ids)}") + col_set_modified() + tooltip(f"{cnt} review logs deleted.") + mw.reset()