From 60fe01d72a4399025897860d16f1e94308aeb5e7 Mon Sep 17 00:00:00 2001 From: Forrest Collman Date: Thu, 20 Nov 2025 13:41:35 -0800 Subject: [PATCH 1/7] add timestamp filter option --- annotationengine/api.py | 18 +++++++++++++++++- requirements.txt | 2 +- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/annotationengine/api.py b/annotationengine/api.py index 3138031..52086f8 100644 --- a/annotationengine/api.py +++ b/annotationengine/api.py @@ -100,6 +100,14 @@ def handle_invalid_usage(error): location="args", help="whether to only return valid items", ) +query_parser.add_argument( + "timestamp", + type=str, + default=None, + location="args", + required=False, + help="timestamp for filtering results (will default to now if not required)", +) def check_aligned_volume(aligned_volume): @@ -243,11 +251,19 @@ def put(self, aligned_volume_name: str) -> FullMetadataSchema: @api_bp.expect(query_parser) def get(self, aligned_volume_name: str): """Get list of annotation tables for a aligned_volume""" + args = query_parser.parse_args() + timestamp_str = args.get("timestamp", None) + if timestamp_str is None: + timestamp = datetime.datetime.now(datetime.timezone.utc)) + else: + timestamp = datetime.strptime(timestamp_str, '%Y-%m-%d %H:%M:%S.%f') + check_aligned_volume(aligned_volume_name) db = get_db(aligned_volume_name) args = query_parser.parse_args() tables = db.database._get_existing_table_names( - filter_valid=args.get("filter_valid", True) + filter_valid=args.get("filter_valid", True), + filter_timestamp=timestamp ) return tables, 200 diff --git a/requirements.txt b/requirements.txt index ede4846..f74bc14 100644 --- a/requirements.txt +++ b/requirements.txt @@ -29,7 +29,7 @@ decorator==5.1.1 # via ipython deprecated==1.2.13 # via redis -dynamicannotationdb==5.8.1 +dynamicannotationdb==5.14.0 # via -r requirements.in emannotationschemas==5.24.12 # via From 855b588650bc728d0e15601a6b6c354a2ffc6b5b Mon Sep 17 00:00:00 2001 From: Forrest Collman Date: Thu, 20 Nov 2025 13:46:40 -0800 Subject: [PATCH 2/7] bumping dadb version --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index f74bc14..ab77ef7 100644 --- a/requirements.txt +++ b/requirements.txt @@ -29,7 +29,7 @@ decorator==5.1.1 # via ipython deprecated==1.2.13 # via redis -dynamicannotationdb==5.14.0 +dynamicannotationdb==5.14.1 # via -r requirements.in emannotationschemas==5.24.12 # via From 45c428acfc5c9f17e6886b03115d57667130c1ea Mon Sep 17 00:00:00 2001 From: Forrest Collman Date: Thu, 20 Nov 2025 13:55:59 -0800 Subject: [PATCH 3/7] remove excess parentheses --- annotationengine/api.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/annotationengine/api.py b/annotationengine/api.py index 52086f8..4be41a9 100644 --- a/annotationengine/api.py +++ b/annotationengine/api.py @@ -254,7 +254,7 @@ def get(self, aligned_volume_name: str): args = query_parser.parse_args() timestamp_str = args.get("timestamp", None) if timestamp_str is None: - timestamp = datetime.datetime.now(datetime.timezone.utc)) + timestamp = datetime.datetime.now(datetime.timezone.utc) else: timestamp = datetime.strptime(timestamp_str, '%Y-%m-%d %H:%M:%S.%f') From 3077c260508aa6ff48ca9d5b68f28b92f8cba2a0 Mon Sep 17 00:00:00 2001 From: Forrest Collman Date: Thu, 4 Dec 2025 13:23:23 -0800 Subject: [PATCH 4/7] fix datetime import --- annotationengine/api.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/annotationengine/api.py b/annotationengine/api.py index 4be41a9..3b3e97b 100644 --- a/annotationengine/api.py +++ b/annotationengine/api.py @@ -16,6 +16,7 @@ from caveclient.auth import AuthClient import werkzeug import traceback +import datetime from annotationengine.aligned_volume import ( get_aligned_volumes, @@ -256,7 +257,7 @@ def get(self, aligned_volume_name: str): if timestamp_str is None: timestamp = datetime.datetime.now(datetime.timezone.utc) else: - timestamp = datetime.strptime(timestamp_str, '%Y-%m-%d %H:%M:%S.%f') + timestamp = datetime.datetime.strptime(timestamp_str, '%Y-%m-%d %H:%M:%S.%f') check_aligned_volume(aligned_volume_name) db = get_db(aligned_volume_name) From 01610c0aa750340313dc4cd020fae4380c1ff8bc Mon Sep 17 00:00:00 2001 From: Forrest Collman Date: Thu, 4 Dec 2025 13:30:04 -0800 Subject: [PATCH 5/7] remove duplicate get_args --- annotationengine/api.py | 1 - 1 file changed, 1 deletion(-) diff --git a/annotationengine/api.py b/annotationengine/api.py index 3b3e97b..e93f199 100644 --- a/annotationengine/api.py +++ b/annotationengine/api.py @@ -261,7 +261,6 @@ def get(self, aligned_volume_name: str): check_aligned_volume(aligned_volume_name) db = get_db(aligned_volume_name) - args = query_parser.parse_args() tables = db.database._get_existing_table_names( filter_valid=args.get("filter_valid", True), filter_timestamp=timestamp From 762bb9f023f951a1a5ff4c79b70dd822d9a729d4 Mon Sep 17 00:00:00 2001 From: Forrest Collman Date: Thu, 4 Dec 2025 13:32:09 -0800 Subject: [PATCH 6/7] fixing timestamp localization --- annotationengine/api.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/annotationengine/api.py b/annotationengine/api.py index e93f199..3277454 100644 --- a/annotationengine/api.py +++ b/annotationengine/api.py @@ -17,6 +17,7 @@ import werkzeug import traceback import datetime +import pytz from annotationengine.aligned_volume import ( get_aligned_volumes, @@ -258,6 +259,7 @@ def get(self, aligned_volume_name: str): timestamp = datetime.datetime.now(datetime.timezone.utc) else: timestamp = datetime.datetime.strptime(timestamp_str, '%Y-%m-%d %H:%M:%S.%f') + timestamp = pytz.utc.localize(timestamp) check_aligned_volume(aligned_volume_name) db = get_db(aligned_volume_name) From eac43d816606b565956bde4eeba1a9f176b69060 Mon Sep 17 00:00:00 2001 From: Forrest Collman Date: Thu, 4 Dec 2025 13:33:56 -0800 Subject: [PATCH 7/7] fixing timestamp parsing --- annotationengine/api.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/annotationengine/api.py b/annotationengine/api.py index 3277454..80a9f0c 100644 --- a/annotationengine/api.py +++ b/annotationengine/api.py @@ -258,7 +258,7 @@ def get(self, aligned_volume_name: str): if timestamp_str is None: timestamp = datetime.datetime.now(datetime.timezone.utc) else: - timestamp = datetime.datetime.strptime(timestamp_str, '%Y-%m-%d %H:%M:%S.%f') + timestamp = datetime.datetime.strptime(timestamp_str, '%Y-%m-%dT%H:%M:%S.%f') timestamp = pytz.utc.localize(timestamp) check_aligned_volume(aligned_volume_name)