Hook to decide whether a note should be added.
This commit is contained in:
parent
e3a57a4193
commit
e4ae41340f
@ -167,8 +167,12 @@ class AddCards(QDialog):
|
||||
def addNote(self, note) -> Optional[Note]:
|
||||
note.model()["did"] = self.deckChooser.selectedId()
|
||||
ret = note.dupeOrEmpty()
|
||||
rejection = None
|
||||
if ret == 1:
|
||||
showWarning(_("The first field is empty."), help="AddItems#AddError")
|
||||
rejection = _("The first field is empty.")
|
||||
rejection = gui_hooks.add_card_accepts(rejection, note)
|
||||
if rejection is not None:
|
||||
showWarning(rejection, help="AddItems#AddError")
|
||||
return None
|
||||
if "{{cloze:" in note.model()["tmpls"][0]["qfmt"]:
|
||||
if not self.mw.col.models._availClozeOrds(
|
||||
|
@ -23,6 +23,45 @@ from aqt.qt import QDialog, QMenu
|
||||
# @@AUTOGEN@@
|
||||
|
||||
|
||||
class _AddCardAcceptsFilter:
|
||||
"""Decides whether the note should be added to the collection or
|
||||
not. It is assumed to come from the addCards window.
|
||||
|
||||
reason_to_already_reject is the first reason to reject that
|
||||
was found, or None. If your filter wants to reject, it should
|
||||
replace return the reason to reject. Otherwise return the
|
||||
input."""
|
||||
|
||||
_hooks: List[Callable[[Optional[str], "anki.notes.Note"], Optional[str]]] = []
|
||||
|
||||
def append(
|
||||
self, cb: Callable[[Optional[str], "anki.notes.Note"], Optional[str]]
|
||||
) -> None:
|
||||
"""(reason_to_already_reject: Optional[str], note: anki.notes.Note)"""
|
||||
self._hooks.append(cb)
|
||||
|
||||
def remove(
|
||||
self, cb: Callable[[Optional[str], "anki.notes.Note"], Optional[str]]
|
||||
) -> None:
|
||||
if cb in self._hooks:
|
||||
self._hooks.remove(cb)
|
||||
|
||||
def __call__(
|
||||
self, reason_to_already_reject: Optional[str], note: anki.notes.Note
|
||||
) -> Optional[str]:
|
||||
for filter in self._hooks:
|
||||
try:
|
||||
reason_to_already_reject = filter(reason_to_already_reject, note)
|
||||
except:
|
||||
# if the hook fails, remove it
|
||||
self._hooks.remove(filter)
|
||||
raise
|
||||
return reason_to_already_reject
|
||||
|
||||
|
||||
add_card_accepts = _AddCardAcceptsFilter()
|
||||
|
||||
|
||||
class _AddCardsDidAddNoteHook:
|
||||
_hooks: List[Callable[["anki.notes.Note"], None]] = []
|
||||
|
||||
|
@ -412,6 +412,18 @@ def emptyNewCard():
|
||||
args=["note: anki.notes.Note"],
|
||||
legacy_hook="AddCards.noteAdded",
|
||||
),
|
||||
Hook(
|
||||
name="add_card_accepts",
|
||||
args=["reason_to_already_reject: Optional[str]", "note: anki.notes.Note"],
|
||||
return_type="Optional[str]",
|
||||
doc="""Decides whether the note should be added to the collection or
|
||||
not. It is assumed to come from the addCards window.
|
||||
|
||||
reason_to_already_reject is the first reason to reject that
|
||||
was found, or None. If your filter wants to reject, it should
|
||||
replace return the reason to reject. Otherwise return the
|
||||
input.""",
|
||||
),
|
||||
# Editing
|
||||
###################
|
||||
Hook(
|
||||
|
Loading…
Reference in New Issue
Block a user