changeset 54:b931dabc2b47

fix detection of volview and wsi
author Sebastien Jodogne <s.jodogne@gmail.com>
date Wed, 22 Oct 2025 13:22:08 +0200
parents a5d238852e69
children e33cb0f03dc9 b62242c540db
files Resources/IntegrationTests/Run.py Sources/OrthancDatabase.cpp
diffstat 2 files changed, 76 insertions(+), 32 deletions(-) [+]
line wrap: on
line diff
--- a/Resources/IntegrationTests/Run.py	Wed Oct 22 12:27:20 2025 +0200
+++ b/Resources/IntegrationTests/Run.py	Wed Oct 22 13:22:08 2025 +0200
@@ -967,6 +967,12 @@
 
 
     def test_create_free_link(self):
+        def Link(project, data):
+            requests.post(URL + '/education/api/link', json.dumps({
+                'data' : data,
+                'project' : project,
+            }), headers = AdministratorHeaders()).raise_for_status()
+
         def CheckNoResource(project):
             lst = requests.get(URL + '/education/api/user-projects', headers = AdministratorHeaders()).json()
             self.assertEqual(0, len(lst['projects'][project]['resources']))
@@ -1002,11 +1008,7 @@
 
         CheckNoResource(project)
 
-        requests.post(URL + '/education/api/link', json.dumps({
-            'data' : study,
-            'project' : project,
-        }), headers = AdministratorHeaders()).raise_for_status()
-
+        Link(project, study)
         resource = CheckHasResource(project, 'Study', study)
         self.assertEqual('TEST - MY^STUDY', resource['title'])
         self.assertEqual([ project ], resource['projects'])
@@ -1016,11 +1018,7 @@
         self.assertEqual('../api/preview-study/%s' % study, resource['preview_url'])
         Unlink(project)
 
-        requests.post(URL + '/education/api/link', json.dumps({
-            'data' : series,
-            'project' : project,
-        }), headers = AdministratorHeaders()).raise_for_status()
-
+        Link(project, series)
         resource = CheckHasResource(project, 'Series', series)
         self.assertEqual('TEST - MY^STUDY', resource['title'])
         self.assertEqual([ project ], resource['projects'])
@@ -1030,11 +1028,7 @@
         self.assertEqual('../api/preview-series/%s' % series, resource['preview_url'])
         Unlink(project)
 
-        requests.post(URL + '/education/api/link', json.dumps({
-            'data' : instance,
-            'project' : project,
-        }), headers = AdministratorHeaders()).raise_for_status()
-
+        Link(project, instance)
         resource = CheckHasResource(project, 'Instance', instance)
         self.assertEqual('TEST - MY^STUDY', resource['title'])
         self.assertEqual([ project ], resource['projects'])
@@ -1044,29 +1038,79 @@
         self.assertEqual('../api/preview-instance/%s' % instance, resource['preview_url'])
         Unlink(project)
 
-        requests.post(URL + '/education/api/link', json.dumps({
-            'data' : tags['0020,000d'],
-            'project' : project,
-        }), headers = AdministratorHeaders()).raise_for_status()
+        Link(project, tags['0020,000d'])
+        CheckHasResource(project, 'Study', study)
+        Unlink(project)
+
+        Link(project, tags['0020,000e'])
+        CheckHasResource(project, 'Series', series)
+        Unlink(project)
+
+        Link(project, tags['0008,0018'])
+        CheckHasResource(project, 'Instance', instance)
+        Unlink(project)
+
+        Link(project, 'http://my-public/stone-webviewer/index.html?study=%s' % tags['0020,000d'])
+        CheckHasResource(project, 'Study', study)
+        Unlink(project)
 
-        resource = CheckHasResource(project, 'Study', study)
+        Link(project, 'http://my-public/stone-webviewer/index.html?series=%s' % tags['0020,000e'])
+        CheckHasResource(project, 'Series', series)
+        Unlink(project)
+
+        Link(project, 'http://my-public/volview/index.html?names=[archive.zip]&urls=[../studies/%s/archive]' % study)
+        CheckHasResource(project, 'Study', study)
+        Unlink(project)
+
+        Link(project, 'http://my-public/volview/index.html?names=[archive.zip]&urls=[../series/%s/archive]' % series)
+        CheckHasResource(project, 'Series', series)
+        Unlink(project)
+
+        Link(project, 'http://my-public/ohif/viewer?StudyInstanceUIDs=%s' % tags['0020,000d'])
+        CheckHasResource(project, 'Study', study)
+        Unlink(project)
+
+        Link(project, 'http://my-public/ohif/viewer?hangingprotocolId=mprAnd3DVolumeViewport&StudyInstanceUIDs=%s' % tags['0020,000d'])
+        CheckHasResource(project, 'Study', study)
         Unlink(project)
 
-        requests.post(URL + '/education/api/link', json.dumps({
-            'data' : tags['0020,000e'],
-            'project' : project,
-        }), headers = AdministratorHeaders()).raise_for_status()
+        Link(project, 'http://my-public/ohif/tmtv?StudyInstanceUIDs=%s' % tags['0020,000d'])
+        CheckHasResource(project, 'Study', study)
+        Unlink(project)
 
-        resource = CheckHasResource(project, 'Series', series)
+        Link(project, 'http://my-public/ohif/segmentation?StudyInstanceUIDs=%s' % tags['0020,000d'])
+        CheckHasResource(project, 'Study', study)
+        Unlink(project)
+
+        Link(project, 'http://my-public/ohif/microscopy?StudyInstanceUIDs=%s' % tags['0020,000d'])
+        CheckHasResource(project, 'Study', study)
+        Unlink(project)
+
+        Link(project, 'http://my-public/wsi/app/viewer.html?series=%s' % series)
+        CheckHasResource(project, 'Series', series)
         Unlink(project)
 
-        requests.post(URL + '/education/api/link', json.dumps({
-            'data' : tags['0008,0018'],
+        Link(project, 'http://my-public/wsi/app/viewer.html?instance=%s' % instance)
+        CheckHasResource(project, 'Instance', instance)
+        Unlink(project)
+
+        Link(project, 'http://my-public/app/explorer.html#study?uuid=%s' % study)
+        CheckHasResource(project, 'Study', study)
+        Unlink(project)
+
+        Link(project, 'http://my-public/app/explorer.html#series?uuid=%s' % series)
+        CheckHasResource(project, 'Series', series)
+        Unlink(project)
+
+        Link(project, 'http://my-public/app/explorer.html#instance?uuid=%s' % instance)
+        CheckHasResource(project, 'Instance', instance)
+        Unlink(project)
+
+        self.assertEqual(400, requests.post(URL + '/education/api/link', json.dumps({
+            'data' : 'nope',
             'project' : project,
-        }), headers = AdministratorHeaders()).raise_for_status()
+        }), headers = AdministratorHeaders()).status_code)
 
-        resource = CheckHasResource(project, 'Instance', instance)
-        Unlink(project)
 
 try:
     print('\nStarting the tests...')
--- a/Sources/OrthancDatabase.cpp	Wed Oct 22 12:27:20 2025 +0200
+++ b/Sources/OrthancDatabase.cpp	Wed Oct 22 13:22:08 2025 +0200
@@ -902,7 +902,7 @@
       Json::Value v;
 
       {
-        boost::regex pattern("/volview/index.html?.*(/(studies|series)/[0-9a-z-]+)/archive.*");
+        boost::regex pattern("/volview/index.html?.*(/(studies|series)/([0-9a-z-]+))/archive.*");
 
         boost::smatch what;
         if (regex_match(base, what, pattern) &&
@@ -957,7 +957,7 @@
             OrthancPlugins::RestApiGet(v, "/series/" + what[1], false))
         {
           resourceId = what[1];
-          level = Orthanc::ResourceType_Study;
+          level = Orthanc::ResourceType_Series;
           return true;
         }
       }