fix(zot): match the models to Zotero's migrated schema
The Zotero app in the zotero container migrated its database (userdata 130): clientVersion on items, collections, libraries and savedSearches (INT NOT NULL DEFAULT 0); nullable *Normalized text columns on creators, tags, itemDataValues and itemAnnotations; savedSearchConditions lost `required`; fulltextWords and fulltextItemWords are gone. The live-DB schema tests failed on every full-suite commit. New fields default to what the DB fills in when a column is omitted, so inserts behave as before. The two models for dropped tables are removed.
This commit is contained in:
@@ -68,6 +68,8 @@ class ItemAnnotations(SQLTable):
|
|||||||
sortIndex: str | None = None
|
sortIndex: str | None = None
|
||||||
position: str | None = None
|
position: str | None = None
|
||||||
isExternal: int | None = None
|
isExternal: int | None = None
|
||||||
|
textNormalized: str | None = None
|
||||||
|
commentNormalized: str | None = None
|
||||||
|
|
||||||
|
|
||||||
class RetractedItems(SQLTable):
|
class RetractedItems(SQLTable):
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ class Collections(SQLTable):
|
|||||||
key: str
|
key: str
|
||||||
version: int = 0
|
version: int = 0
|
||||||
synced: int = 0
|
synced: int = 0
|
||||||
|
clientVersion: int = 0
|
||||||
|
|
||||||
|
|
||||||
class CollectionItems(SQLTable):
|
class CollectionItems(SQLTable):
|
||||||
|
|||||||
@@ -32,6 +32,7 @@ class Libraries(SQLTable):
|
|||||||
lastSync: int = 0
|
lastSync: int = 0
|
||||||
archived: int = 0
|
archived: int = 0
|
||||||
isAdmin: int = 0
|
isAdmin: int = 0
|
||||||
|
clientVersion: int = 0
|
||||||
|
|
||||||
|
|
||||||
class Items(SQLTable):
|
class Items(SQLTable):
|
||||||
@@ -48,6 +49,7 @@ class Items(SQLTable):
|
|||||||
key: str
|
key: str
|
||||||
version: int = 0
|
version: int = 0
|
||||||
synced: int = 0
|
synced: int = 0
|
||||||
|
clientVersion: int = 0
|
||||||
|
|
||||||
|
|
||||||
class ItemTypes(SQLTable):
|
class ItemTypes(SQLTable):
|
||||||
|
|||||||
@@ -21,6 +21,8 @@ class Creators(SQLTable):
|
|||||||
firstName: str | None = None
|
firstName: str | None = None
|
||||||
lastName: str | None = None
|
lastName: str | None = None
|
||||||
fieldMode: int | None = None
|
fieldMode: int | None = None
|
||||||
|
firstNameNormalized: str | None = None
|
||||||
|
lastNameNormalized: str | None = None
|
||||||
|
|
||||||
|
|
||||||
class CreatorTypes(SQLTable):
|
class CreatorTypes(SQLTable):
|
||||||
|
|||||||
@@ -70,6 +70,7 @@ class ItemDataValues(SQLTable):
|
|||||||
|
|
||||||
valueID: int | None = None
|
valueID: int | None = None
|
||||||
value: str | int | float | None = None
|
value: str | int | float | None = None
|
||||||
|
valueNormalized: str | None = None
|
||||||
|
|
||||||
|
|
||||||
class ItemTypeFields(SQLTable):
|
class ItemTypeFields(SQLTable):
|
||||||
|
|||||||
@@ -5,9 +5,7 @@ from __future__ import annotations
|
|||||||
from conf.table_base import SQLTable
|
from conf.table_base import SQLTable
|
||||||
|
|
||||||
__all__ = [
|
__all__ = [
|
||||||
"FulltextWords",
|
|
||||||
"FulltextItems",
|
"FulltextItems",
|
||||||
"FulltextItemWords",
|
|
||||||
"SavedSearches",
|
"SavedSearches",
|
||||||
"SavedSearchConditions",
|
"SavedSearchConditions",
|
||||||
"FileTypes",
|
"FileTypes",
|
||||||
@@ -16,15 +14,6 @@ __all__ = [
|
|||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
class FulltextWords(SQLTable):
|
|
||||||
"""Zotero table ``fulltextWords`` (98,514 rows in host DB)."""
|
|
||||||
|
|
||||||
__tablename__ = "fulltextWords"
|
|
||||||
|
|
||||||
wordID: int | None = None
|
|
||||||
word: str | None = None
|
|
||||||
|
|
||||||
|
|
||||||
class FulltextItems(SQLTable):
|
class FulltextItems(SQLTable):
|
||||||
"""Zotero table ``fulltextItems`` (2,083 rows in host DB)."""
|
"""Zotero table ``fulltextItems`` (2,083 rows in host DB)."""
|
||||||
|
|
||||||
@@ -39,15 +28,6 @@ class FulltextItems(SQLTable):
|
|||||||
synced: int = 0
|
synced: int = 0
|
||||||
|
|
||||||
|
|
||||||
class FulltextItemWords(SQLTable):
|
|
||||||
"""Zotero table ``fulltextItemWords`` (2,048,235 rows in host DB)."""
|
|
||||||
|
|
||||||
__tablename__ = "fulltextItemWords"
|
|
||||||
|
|
||||||
wordID: int | None = None
|
|
||||||
itemID: int | None = None
|
|
||||||
|
|
||||||
|
|
||||||
class SavedSearches(SQLTable):
|
class SavedSearches(SQLTable):
|
||||||
"""Zotero table ``savedSearches`` (3 rows in host DB)."""
|
"""Zotero table ``savedSearches`` (3 rows in host DB)."""
|
||||||
|
|
||||||
@@ -60,6 +40,7 @@ class SavedSearches(SQLTable):
|
|||||||
key: str
|
key: str
|
||||||
version: int = 0
|
version: int = 0
|
||||||
synced: int = 0
|
synced: int = 0
|
||||||
|
clientVersion: int = 0
|
||||||
|
|
||||||
|
|
||||||
class SavedSearchConditions(SQLTable):
|
class SavedSearchConditions(SQLTable):
|
||||||
@@ -72,7 +53,6 @@ class SavedSearchConditions(SQLTable):
|
|||||||
condition: str
|
condition: str
|
||||||
operator: str | None = None
|
operator: str | None = None
|
||||||
value: str | None = None
|
value: str | None = None
|
||||||
required: str | int | float | None = None
|
|
||||||
|
|
||||||
|
|
||||||
class FileTypes(SQLTable):
|
class FileTypes(SQLTable):
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ class Tags(SQLTable):
|
|||||||
|
|
||||||
tagID: int | None = None
|
tagID: int | None = None
|
||||||
name: str
|
name: str
|
||||||
|
nameNormalized: str | None = None
|
||||||
|
|
||||||
|
|
||||||
class ItemTags(SQLTable):
|
class ItemTags(SQLTable):
|
||||||
|
|||||||
@@ -62,9 +62,8 @@ class TestImports:
|
|||||||
assert issubclass(ItemAnnotations, SQLTable)
|
assert issubclass(ItemAnnotations, SQLTable)
|
||||||
|
|
||||||
def test_search(self):
|
def test_search(self):
|
||||||
from zot.table.search import FulltextItems, FulltextWords, SavedSearches
|
from zot.table.search import FulltextItems, SavedSearches
|
||||||
|
|
||||||
assert issubclass(FulltextWords, SQLTable)
|
|
||||||
assert issubclass(FulltextItems, SQLTable)
|
assert issubclass(FulltextItems, SQLTable)
|
||||||
assert issubclass(SavedSearches, SQLTable)
|
assert issubclass(SavedSearches, SQLTable)
|
||||||
|
|
||||||
@@ -87,7 +86,7 @@ class TestImports:
|
|||||||
and issubclass(getattr(zt, name), SQLTable)
|
and issubclass(getattr(zt, name), SQLTable)
|
||||||
and getattr(zt, name) is not SQLTable
|
and getattr(zt, name) is not SQLTable
|
||||||
]
|
]
|
||||||
assert len(models) == 61
|
assert len(models) == 59
|
||||||
|
|
||||||
|
|
||||||
# ── Model correctness ───────────────────────────────────────────────
|
# ── Model correctness ───────────────────────────────────────────────
|
||||||
|
|||||||
Reference in New Issue
Block a user