From 1db6c7a47332ba5c6c74cdf5b924be22bad52782 Mon Sep 17 00:00:00 2001 From: William Moore Date: Tue, 30 Jun 2026 22:11:48 +0100 Subject: [PATCH 1/2] Initial support for JSON api /annotaions endpoint --- omeroweb/api/urls.py | 11 +++++++++++ omeroweb/api/views.py | 26 ++++++++++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/omeroweb/api/urls.py b/omeroweb/api/urls.py index 8e6cfbb136..43adf4a288 100644 --- a/omeroweb/api/urls.py +++ b/omeroweb/api/urls.py @@ -400,6 +400,16 @@ GET Groups that an Experimenter is in, using omero-marshal to generate json """ +api_annotations = re_path( + r"^v(?P%s)/m/annotations/$" % versions, + views.AnnotationsView.as_view(), + name="api_annotations", +) +""" +GET Annotations, using omero-marshal to generate json +""" + + urlpatterns = [ api_versions, api_base, @@ -443,4 +453,5 @@ api_groups, api_group, api_experimenter_groups, + api_annotations, ] diff --git a/omeroweb/api/views.py b/omeroweb/api/views.py index e465945607..6b21d7fe74 100644 --- a/omeroweb/api/views.py +++ b/omeroweb/api/views.py @@ -86,6 +86,7 @@ def api_base(request, api_version=None, **kwargs): "url:screens": build_url(request, "api_screens", v), "url:plates": build_url(request, "api_plates", v), "url:rois": build_url(request, "api_rois", v), + "url:annotations": build_url(request, "api_annotations", v), "url:token": build_url(request, "api_token", v), "url:servers": build_url(request, "api_servers", v), "url:login": build_url(request, "api_login", v), @@ -786,6 +787,31 @@ def add_data(self, marshalled, request, conn, urls=None, **kwargs): return marshalled +class AnnotationsView(ObjectsView): + """Handles GET for /annotations/ to list available Annotations.""" + + OMERO_TYPE = "Annotation" + + def get_opts(self, request, **kwargs): + """Add extra parameters to the opts dict.""" + opts = super(AnnotationsView, self).get_opts(request, **kwargs) + + # TODO: add more types? + for key in ["image", "dataset", "project", "screen", "plate", "well", + "plateacquisition", "roi"]: + ids = request.GET.getlist(key) + if len(ids) > 0: + opts["parent_type"] = key + opts["parent_ids"] = [int(i) for i in ids] + break + if request.GET.get("ns") is not None: + opts["ns"] = request.GET.get("ns") + ann_type = request.GET.get("type") + if ann_type in ("file", "map", "tag", "rating", "long", "comment"): + opts["ann_type"] = ann_type + + return opts + class ExperimentersView(ObjectsView): """Handles GET for /experimenters/ to list Experimenters.""" From 674eca6d5a4002712f342e720977e3d0a4f65023 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 30 Jun 2026 21:19:57 +0000 Subject: [PATCH 2/2] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- omeroweb/api/views.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/omeroweb/api/views.py b/omeroweb/api/views.py index 6b21d7fe74..204df38f11 100644 --- a/omeroweb/api/views.py +++ b/omeroweb/api/views.py @@ -787,6 +787,7 @@ def add_data(self, marshalled, request, conn, urls=None, **kwargs): return marshalled + class AnnotationsView(ObjectsView): """Handles GET for /annotations/ to list available Annotations.""" @@ -797,8 +798,16 @@ def get_opts(self, request, **kwargs): opts = super(AnnotationsView, self).get_opts(request, **kwargs) # TODO: add more types? - for key in ["image", "dataset", "project", "screen", "plate", "well", - "plateacquisition", "roi"]: + for key in [ + "image", + "dataset", + "project", + "screen", + "plate", + "well", + "plateacquisition", + "roi", + ]: ids = request.GET.getlist(key) if len(ids) > 0: opts["parent_type"] = key