From ba7e13041ba52d063879689a0b22d92748aaa49f Mon Sep 17 00:00:00 2001 From: Travis Abendshien <46939827+CyanVoxel@users.noreply.github.com> Date: Tue, 28 Jan 2025 01:57:01 -0800 Subject: [PATCH] feat: add date columns to the entries table (#740) * feat: add date_created, date_modified, and date_added columns to entries table * feat: start storing date_added dates --- tagstudio/src/core/enums.py | 2 +- tagstudio/src/core/library/alchemy/library.py | 1 + tagstudio/src/core/library/alchemy/models.py | 15 +++++++++++++++ tagstudio/src/core/utils/refresh_dir.py | 2 ++ .../.TagStudio/ts_library.sqlite | Bin 98304 -> 98304 bytes 5 files changed, 19 insertions(+), 1 deletion(-) diff --git a/tagstudio/src/core/enums.py b/tagstudio/src/core/enums.py index dee651e5..50608968 100644 --- a/tagstudio/src/core/enums.py +++ b/tagstudio/src/core/enums.py @@ -71,4 +71,4 @@ class LibraryPrefs(DefaultEnum): IS_EXCLUDE_LIST = True EXTENSION_LIST: list[str] = [".json", ".xmp", ".aae"] PAGE_SIZE: int = 500 - DB_VERSION: int = 4 + DB_VERSION: int = 5 diff --git a/tagstudio/src/core/library/alchemy/library.py b/tagstudio/src/core/library/alchemy/library.py index b51646d6..f2d1c7b5 100644 --- a/tagstudio/src/core/library/alchemy/library.py +++ b/tagstudio/src/core/library/alchemy/library.py @@ -230,6 +230,7 @@ class Library: folder=folder, fields=[], id=entry.id + 1, # JSON IDs start at 0 instead of 1 + date_added=datetime.now(), ) for entry in json_lib.entries ] diff --git a/tagstudio/src/core/library/alchemy/models.py b/tagstudio/src/core/library/alchemy/models.py index 9d8f3a1b..6f77b1a4 100644 --- a/tagstudio/src/core/library/alchemy/models.py +++ b/tagstudio/src/core/library/alchemy/models.py @@ -2,6 +2,7 @@ # Licensed under the GPL-3.0 License. # Created for TagStudio: https://github.com/CyanVoxel/TagStudio +import datetime as dt from pathlib import Path from sqlalchemy import JSON, ForeignKey, ForeignKeyConstraint, Integer, event @@ -181,6 +182,9 @@ class Entry(Base): path: Mapped[Path] = mapped_column(PathType, unique=True) suffix: Mapped[str] = mapped_column() + date_created: Mapped[dt.datetime | None] + date_modified: Mapped[dt.datetime | None] + date_added: Mapped[dt.datetime | None] tags: Mapped[set[Tag]] = relationship(secondary="tag_entries") @@ -215,12 +219,23 @@ class Entry(Base): folder: Folder, fields: list[BaseField], id: int | None = None, + date_created: dt.datetime | None = None, + date_modified: dt.datetime | None = None, + date_added: dt.datetime | None = None, ) -> None: self.path = path self.folder = folder self.id = id self.suffix = path.suffix.lstrip(".").lower() + # The date the file associated with this entry was created. + # st_birthtime on Windows and Mac, st_ctime on Linux. + self.date_created = date_created + # The date the file associated with this entry was last modified: st_mtime. + self.date_modified = date_modified + # The date this entry was added to the library. + self.date_added = date_added + for field in fields: if isinstance(field, TextField): self.text_fields.append(field) diff --git a/tagstudio/src/core/utils/refresh_dir.py b/tagstudio/src/core/utils/refresh_dir.py index a398f06f..43f8cfef 100644 --- a/tagstudio/src/core/utils/refresh_dir.py +++ b/tagstudio/src/core/utils/refresh_dir.py @@ -1,3 +1,4 @@ +import datetime as dt from collections.abc import Iterator from dataclasses import dataclass, field from pathlib import Path @@ -41,6 +42,7 @@ class RefreshDirTracker: path=entry_path, folder=self.library.folder, fields=[], + date_added=dt.datetime.now(), ) for entry_path in self.files_not_in_library ] diff --git a/tagstudio/tests/fixtures/search_library/.TagStudio/ts_library.sqlite b/tagstudio/tests/fixtures/search_library/.TagStudio/ts_library.sqlite index e4626219362ec5f23136a5f0b24c9a3499ea2069..6d6d85c60ad56066150ba80f410fb4a3e2b57a09 100644 GIT binary patch delta 1074 zcma*jOK8(z902g7OS|MtzNCBBtsQM$Cv#nG`WWpHWgFXMNOkDM7qZ1BtsShZT{hfK zMa7GVmf*#M4@5j{2U!muL}3aZ?6wNRP`1&FI|+JL@$seYx|Dek0!e=V$M^sKsgxm= zGTa&G35@e|Z`f8&&#plZer1N4kKi|BrqUos_E%H-*Tgl#qx)6$1JCK+;zat ziv(8>GSw!t8NVJk?x4g6NrQZK0XlUFGd!7Hmv`bI5zLb^_hj+ z=lDK5#;tKrIGO9?jO-S>$lhR2vR3#7zJh5e!XPA=_snA^&h#)Wy-q)+lk_2)1RubC z5Cg*?0PGpN@e_5TejkZZ);bKsq=|$)dms^yqQ}&Rv`y9NxGY4YlDHjk>8xqt`>0<%(s!pvkcCQDOP6@fM2AxRc=P)A@b Wg-_dv5Y^E*ftktPWcX5SM*0hN3@U2? delta 944 zcmZo@U~6b#n~-JT$G~sGf0$31pOx<#FF)@)o&cU3T>p5aId5~F=jdY(X5(Qw%Tmqk z&f>x($t=L=H(60&%VrkFUJkCtLLPQ;X=%o0%gM7jr%vu?Q`kI<%gI#5BFVxa)yyJQ zHzg_2RM#Zc*htsXJTXN#(LBZ6#L&b%DaqVolfxZ(;uI#V)@Nkdyrw_Oz^Rde|0e%x z{#t%NetEv{e8>6b@#XQ^^6~IK;@!d9$D7J)!pqEalV>?k4UaF6EcYAkUECeqVcaTQ zpSTWit>T)()wo$vz>>>NP>q#=Q(ibVx1gj_uOKfSh(uI@LaM^0c_oSI>8U9&Q596t zl8O=_GEfGJ#tKi~a9d__|0#ZU10@81{%syEpm7F@Fd+>vR{_SAnXGpjs6!sk7fXsS zE-XzfN`+c!AOn%wcv@`ohcoPxXP)L`*Ovy0MGH^fcv_2HPYTG61hK^?8=PmIbcT;z zR}v@`E?2*$-#f z_@FM*7X=D~Z3nqXgk4_*na@61`z$ZJx-d}88>02}T~3gnHG~kRy}!!^77~ODiJ*8| zLjW!TbQi*AexNYaW}tIX_2}~Vg@Qs|1*AoX3C5M0 zd=e