diff --git a/config.json b/config.json index 8471b3b..dd183ef 100644 --- a/config.json +++ b/config.json @@ -1,6 +1,7 @@ { "load_balance": false, "easy_days": [], + "easy_dates": [], "easy_days_review_ratio": 0, "days_to_reschedule": 7, "auto_reschedule_after_sync": false, diff --git a/configuration.py b/configuration.py index 01b3d84..9b8c1dc 100644 --- a/configuration.py +++ b/configuration.py @@ -4,6 +4,7 @@ LOAD_BALANCE = "load_balance" EASY_DAYS = "easy_days" +EASY_DATES = "easy_dates" EASY_DAYS_REVIEW_RATIO = "easy_days_review_ratio" DAYS_TO_RESCHEDULE = "days_to_reschedule" AUTO_RESCHEDULE_AFTER_SYNC = "auto_reschedule_after_sync" @@ -47,7 +48,7 @@ def load_balance(self, value): self.save() @property - def easy_days(self): + def easy_days(self) -> list[int]: return self.data[EASY_DAYS] @easy_days.setter @@ -60,6 +61,15 @@ def easy_days(self, day_enable): self.data[EASY_DAYS].remove(day) self.save() + @property + def easy_dates(self) -> list[str]: + return self.data[EASY_DATES] + + @easy_dates.setter + def easy_dates(self, value): + self.data[EASY_DATES] = value + self.save() + @property def easy_days_review_ratio(self): return max(0, min(self.data[EASY_DAYS_REVIEW_RATIO], 0.9)) diff --git a/schedule/easy_days.py b/schedule/easy_days.py index 90aee78..e1c4135 100644 --- a/schedule/easy_days.py +++ b/schedule/easy_days.py @@ -78,7 +78,21 @@ class EasySpecificDateManagerWidget(QWidget): def __init__(self): super().__init__() self.initUi() - self.specific_dates = [] + self.config = Config() + self.config.load() + current_date = sched_current_date() + self.config.easy_dates = [ + date + for date in self.config.easy_dates + if datetime.strptime(date, "%Y-%m-%d").date() >= current_date + ] + self.specific_dates = [ + datetime.strptime(date, "%Y-%m-%d").date() + for date in self.config.easy_dates + ] + for specific_date in self.specific_dates: + deckWidget = DateLabelWidget(specific_date, self) + self.layout.insertWidget(self.layout.count() - 2, deckWidget) def initUi(self): self.layout = QVBoxLayout() @@ -113,6 +127,9 @@ def addEventFunc(self): tooltip("Easy days can't be applied on past dates.") return self.specific_dates.append(specific_date) + self.config.easy_dates = [ + date.strftime("%Y-%m-%d") for date in self.specific_dates + ] deckWidget = DateLabelWidget(specific_date, self) self.layout.insertWidget(self.layout.count() - 2, deckWidget) mw.deckBrowser.refresh() @@ -179,6 +196,11 @@ def __init__(self, date, manager): layout.addWidget(self.deleteButton) def deleteEvent(self): + config = Config() + config.load() + config.easy_dates = list( + filter(lambda x: x != self.date.strftime("%Y-%m-%d"), config.easy_dates) + ) self.manager.specific_dates.remove(self.date) self.setParent(None) mw.deckBrowser.refresh() diff --git a/schedule/reschedule.py b/schedule/reschedule.py index fd70256..8e6162c 100644 --- a/schedule/reschedule.py +++ b/schedule/reschedule.py @@ -1,3 +1,4 @@ +from typing import Set from aqt import QAction, browser from .disperse_siblings import disperse_siblings @@ -212,6 +213,15 @@ def reschedule_background( len(fsrs.easy_days), fsrs.easy_days_review_ratio ) fsrs.easy_specific_due_dates = easy_specific_due_dates + + current_date = sched_current_date() + today = mw.col.sched.today + for easy_date_str in config.easy_dates: + easy_date = datetime.strptime(easy_date_str, "%Y-%m-%d").date() + specific_due = today + (easy_date - current_date).days + if specific_due not in fsrs.easy_specific_due_dates: + fsrs.easy_specific_due_dates.append(specific_due) + fsrs.p_obey_specific_due_dates = obey_specific_due_dates( len(fsrs.easy_specific_due_dates), fsrs.easy_days_review_ratio )