reuse stock basic type for default field/notetype/etc

Could add extra methods in the backend to allocate these in the
future, but as this is not a hot path, this should do for now.
This commit is contained in:
Damien Elmes 2020-05-15 17:35:00 +10:00
parent 2ac33500eb
commit e44b3bf93c

View file

@ -12,6 +12,7 @@ import anki.backend_pb2 as pb
from anki import hooks from anki import hooks
from anki.consts import * from anki.consts import *
from anki.lang import _ from anki.lang import _
from anki.rsbackend import StockNoteType
from anki.utils import checksum, ids2str, intTime, joinFields, splitFields from anki.utils import checksum, ids2str, intTime, joinFields, splitFields
# types # types
@ -19,69 +20,8 @@ NoteType = Dict[str, Any]
Field = Dict[str, Any] Field = Dict[str, Any]
Template = Dict[str, Union[str, int, None]] Template = Dict[str, Union[str, int, None]]
# fixme: memory leaks
# fixme: syncing, beforeUpload # fixme: syncing, beforeUpload
# Models
##########################################################################
# - careful not to add any lists/dicts/etc here, as they aren't deep copied
defaultModel: NoteType = {
"id": 0,
"sortf": 0,
"did": 1,
"latexPre": """\
\\documentclass[12pt]{article}
\\special{papersize=3in,5in}
\\usepackage[utf8]{inputenc}
\\usepackage{amssymb,amsmath}
\\pagestyle{empty}
\\setlength{\\parindent}{0in}
\\begin{document}
""",
"latexPost": "\\end{document}",
"mod": 0,
"usn": 0,
"req": [],
"type": MODEL_STD,
"css": """\
.card {
font-family: arial;
font-size: 20px;
text-align: center;
color: black;
background-color: white;
}
""",
}
defaultField: Field = {
"name": "",
"ord": None,
"sticky": False,
# the following alter editing, and are used as defaults for the
# template wizard
"rtl": False,
"font": "Arial",
"size": 20,
# reserved for future use
"media": [],
}
defaultTemplate: Template = {
"name": "",
"ord": None,
"qfmt": "",
"afmt": "",
"did": None,
"bqfmt": "",
"bafmt": "",
# we don't define these so that we pick up system font size until set
#'bfont': "Arial",
#'bsize': 12,
}
class ModelsDictProxy: class ModelsDictProxy:
def __init__(self, col: anki.storage._Collection): def __init__(self, col: anki.storage._Collection):
@ -150,15 +90,6 @@ class ModelManager:
def flush(self) -> None: def flush(self) -> None:
pass pass
# fixme: enforce at lower level
def ensureNotEmpty(self) -> Optional[bool]:
if not self.all_names_and_ids():
from anki.stdmodels import addBasicModel
addBasicModel(self.col)
return True
return None
# Caching # Caching
############################################################# #############################################################
# A lot of existing code expects to be able to quickly and # A lot of existing code expects to be able to quickly and
@ -256,14 +187,13 @@ class ModelManager:
def new(self, name: str) -> NoteType: def new(self, name: str) -> NoteType:
"Create a new model, and return it." "Create a new model, and return it."
# caller should call save() after modifying # caller should call save() after modifying
m = defaultModel.copy() nt = self.col.backend.get_stock_notetype_legacy(
m["name"] = name StockNoteType.StockNoteTypeBasic
m["mod"] = intTime() )
m["flds"] = [] nt["flds"] = []
m["tmpls"] = [] nt["tmpls"] = []
m["tags"] = [] nt["name"] = name
m["id"] = 0 return nt
return m
def rem(self, m: NoteType) -> None: def rem(self, m: NoteType) -> None:
"Delete model, and all its cards/notes." "Delete model, and all its cards/notes."
@ -349,9 +279,13 @@ class ModelManager:
def new_field(self, name: str) -> Field: def new_field(self, name: str) -> Field:
assert isinstance(name, str) assert isinstance(name, str)
f = defaultField.copy() nt = self.col.backend.get_stock_notetype_legacy(
f["name"] = name StockNoteType.StockNoteTypeBasic
return f )
field = nt["flds"][0]
field["name"] = name
field["ord"] = None
return field
def add_field(self, m: NoteType, field: Field) -> None: def add_field(self, m: NoteType, field: Field) -> None:
"Modifies schema." "Modifies schema."
@ -404,9 +338,15 @@ class ModelManager:
################################################## ##################################################
def new_template(self, name: str) -> Template: def new_template(self, name: str) -> Template:
t = defaultTemplate.copy() nt = self.col.backend.get_stock_notetype_legacy(
t["name"] = name StockNoteType.StockNoteTypeBasic
return t )
template = nt["tmpls"][0]
template["name"] = name
template["qfmt"] = ""
template["afmt"] = ""
template["ord"] = None
return template
def add_template(self, m: NoteType, template: Template) -> None: def add_template(self, m: NoteType, template: Template) -> None:
"Modifies schema." "Modifies schema."