Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 20 additions & 10 deletions src/tagstudio/core/library/alchemy/constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,13 +39,23 @@
""")


DEFAULT_FIELD_TEMPLATES = (
TextFieldTemplate(name="Title"),
TextFieldTemplate(name="Author"),
TextFieldTemplate(name="Artist"),
TextFieldTemplate(name="URL"),
TextFieldTemplate(name="Description", is_multiline=True),
TextFieldTemplate(name="Notes", is_multiline=True),
TextFieldTemplate(name="Comments", is_multiline=True),
DatetimeFieldTemplate(name="Date"),
)
def default_field_templates() -> tuple[TextFieldTemplate | DatetimeFieldTemplate, ...]:
"""Build a fresh set of default field template instances.

These must be constructed anew on every call rather than shared as module-level
singletons. SQLAlchemy instances remember their persistent identity once they've been
added and flushed to a session; reusing the same instances across multiple `Library`
(and therefore multiple database engines/sessions) causes every `Library` after the
first to silently skip inserting these rows, since SQLAlchemy assumes they already
exist.
"""
return (
TextFieldTemplate(name="Title"),
TextFieldTemplate(name="Author"),
TextFieldTemplate(name="Artist"),
TextFieldTemplate(name="URL"),
TextFieldTemplate(name="Description", is_multiline=True),
TextFieldTemplate(name="Notes", is_multiline=True),
TextFieldTemplate(name="Comments", is_multiline=True),
DatetimeFieldTemplate(name="Date"),
)
4 changes: 2 additions & 2 deletions src/tagstudio/core/library/alchemy/library.py
Original file line number Diff line number Diff line change
Expand Up @@ -65,10 +65,10 @@
DB_VERSION,
DB_VERSION_CURRENT_KEY,
DB_VERSION_INITIAL_KEY,
DEFAULT_FIELD_TEMPLATES,
JSON_FILENAME,
SQL_FILENAME,
TAG_CHILDREN_QUERY,
default_field_templates,
)
from tagstudio.core.library.alchemy.db import Base as ModelBase
from tagstudio.core.library.alchemy.enums import MAX_SQL_VARIABLES, BrowsingState, SortingModeEnum
Expand Down Expand Up @@ -461,7 +461,7 @@ def create_sqlite_library(
session.flush()

# Add default field templates
for template in DEFAULT_FIELD_TEMPLATES:
for template in default_field_templates():
session.add(template)
session.flush()

Expand Down
4 changes: 2 additions & 2 deletions src/tagstudio/core/library/alchemy/migrations.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
DB_VERSION,
DB_VERSION_CURRENT_KEY,
DB_VERSION_INITIAL_KEY,
DEFAULT_FIELD_TEMPLATES,
default_field_templates,
)
from tagstudio.core.library.alchemy.fields import LEGACY_FIELD_MAP, DatetimeField, TextField
from tagstudio.core.library.alchemy.joins import TagParent
Expand Down Expand Up @@ -468,7 +468,7 @@ def run(cls, session: Session, library_dir: Path, fmt_log: LoggingMethod):

# Add default field templates
logger.info(fmt_log("Adding default field templates..."))
for template in DEFAULT_FIELD_TEMPLATES:
for template in default_field_templates():
session.add(template)
session.flush()

Expand Down