large-image-source-dicom 1.28.2.dev16__tar.gz → 1.28.2.dev28__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. {large-image-source-dicom-1.28.2.dev16 → large-image-source-dicom-1.28.2.dev28}/PKG-INFO +4 -3
  2. {large-image-source-dicom-1.28.2.dev16 → large-image-source-dicom-1.28.2.dev28}/large_image_source_dicom/assetstore/dicomweb_assetstore_adapter.py +63 -23
  3. {large-image-source-dicom-1.28.2.dev16 → large-image-source-dicom-1.28.2.dev28}/large_image_source_dicom/assetstore/rest.py +4 -30
  4. {large-image-source-dicom-1.28.2.dev16 → large-image-source-dicom-1.28.2.dev28}/large_image_source_dicom/web_client/main.js +1 -2
  5. {large-image-source-dicom-1.28.2.dev16 → large-image-source-dicom-1.28.2.dev28}/large_image_source_dicom/web_client/templates/dicomwebAssetstoreImportButton.pug +1 -1
  6. {large-image-source-dicom-1.28.2.dev16 → large-image-source-dicom-1.28.2.dev28}/large_image_source_dicom/web_client/views/DICOMwebImportView.js +10 -4
  7. {large-image-source-dicom-1.28.2.dev16 → large-image-source-dicom-1.28.2.dev28}/large_image_source_dicom.egg-info/PKG-INFO +4 -3
  8. {large-image-source-dicom-1.28.2.dev16 → large-image-source-dicom-1.28.2.dev28}/large_image_source_dicom.egg-info/SOURCES.txt +0 -2
  9. large-image-source-dicom-1.28.2.dev28/large_image_source_dicom.egg-info/requires.txt +6 -0
  10. {large-image-source-dicom-1.28.2.dev16 → large-image-source-dicom-1.28.2.dev28}/setup.py +4 -1
  11. {large-image-source-dicom-1.28.2.dev16 → large-image-source-dicom-1.28.2.dev28}/test_dicom/web_client_specs/dicomWebSpec.js +2 -2
  12. large-image-source-dicom-1.28.2.dev16/large_image_source_dicom/web_client/models/AssetstoreModel.js +0 -20
  13. large-image-source-dicom-1.28.2.dev16/large_image_source_dicom/web_client/routes.js +0 -17
  14. large-image-source-dicom-1.28.2.dev16/large_image_source_dicom.egg-info/requires.txt +0 -5
  15. {large-image-source-dicom-1.28.2.dev16 → large-image-source-dicom-1.28.2.dev28}/LICENSE +0 -0
  16. {large-image-source-dicom-1.28.2.dev16 → large-image-source-dicom-1.28.2.dev28}/README.rst +0 -0
  17. {large-image-source-dicom-1.28.2.dev16 → large-image-source-dicom-1.28.2.dev28}/large_image_source_dicom/__init__.py +0 -0
  18. {large-image-source-dicom-1.28.2.dev16 → large-image-source-dicom-1.28.2.dev28}/large_image_source_dicom/assetstore/__init__.py +0 -0
  19. {large-image-source-dicom-1.28.2.dev16 → large-image-source-dicom-1.28.2.dev28}/large_image_source_dicom/dicom_metadata.py +0 -0
  20. {large-image-source-dicom-1.28.2.dev16 → large-image-source-dicom-1.28.2.dev28}/large_image_source_dicom/dicom_tags.py +0 -0
  21. {large-image-source-dicom-1.28.2.dev16 → large-image-source-dicom-1.28.2.dev28}/large_image_source_dicom/dicomweb_utils.py +0 -0
  22. {large-image-source-dicom-1.28.2.dev16 → large-image-source-dicom-1.28.2.dev28}/large_image_source_dicom/girder_plugin.py +0 -0
  23. {large-image-source-dicom-1.28.2.dev16 → large-image-source-dicom-1.28.2.dev28}/large_image_source_dicom/girder_source.py +0 -0
  24. {large-image-source-dicom-1.28.2.dev16 → large-image-source-dicom-1.28.2.dev28}/large_image_source_dicom/web_client/constants.js +0 -0
  25. {large-image-source-dicom-1.28.2.dev16 → large-image-source-dicom-1.28.2.dev28}/large_image_source_dicom/web_client/package.json +0 -0
  26. {large-image-source-dicom-1.28.2.dev16 → large-image-source-dicom-1.28.2.dev28}/large_image_source_dicom/web_client/templates/assetstoreImport.pug +0 -0
  27. {large-image-source-dicom-1.28.2.dev16 → large-image-source-dicom-1.28.2.dev28}/large_image_source_dicom/web_client/templates/dicomwebAssetstoreCreate.pug +0 -0
  28. {large-image-source-dicom-1.28.2.dev16 → large-image-source-dicom-1.28.2.dev28}/large_image_source_dicom/web_client/templates/dicomwebAssetstoreEditFields.pug +0 -0
  29. {large-image-source-dicom-1.28.2.dev16 → large-image-source-dicom-1.28.2.dev28}/large_image_source_dicom/web_client/templates/dicomwebAssetstoreMixins.pug +0 -0
  30. {large-image-source-dicom-1.28.2.dev16 → large-image-source-dicom-1.28.2.dev28}/large_image_source_dicom/web_client/views/AssetstoresView.js +0 -0
  31. {large-image-source-dicom-1.28.2.dev16 → large-image-source-dicom-1.28.2.dev28}/large_image_source_dicom/web_client/views/AuthOptions.js +0 -0
  32. {large-image-source-dicom-1.28.2.dev16 → large-image-source-dicom-1.28.2.dev28}/large_image_source_dicom/web_client/views/EditAssetstoreWidget.js +0 -0
  33. {large-image-source-dicom-1.28.2.dev16 → large-image-source-dicom-1.28.2.dev28}/large_image_source_dicom/web_client/views/NewAssetstoreWidget.js +0 -0
  34. {large-image-source-dicom-1.28.2.dev16 → large-image-source-dicom-1.28.2.dev28}/large_image_source_dicom.egg-info/dependency_links.txt +0 -0
  35. {large-image-source-dicom-1.28.2.dev16 → large-image-source-dicom-1.28.2.dev28}/large_image_source_dicom.egg-info/entry_points.txt +0 -0
  36. {large-image-source-dicom-1.28.2.dev16 → large-image-source-dicom-1.28.2.dev28}/large_image_source_dicom.egg-info/top_level.txt +0 -0
  37. {large-image-source-dicom-1.28.2.dev16 → large-image-source-dicom-1.28.2.dev28}/pyproject.toml +0 -0
  38. {large-image-source-dicom-1.28.2.dev16 → large-image-source-dicom-1.28.2.dev28}/setup.cfg +0 -0
  39. {large-image-source-dicom-1.28.2.dev16 → large-image-source-dicom-1.28.2.dev28}/test_dicom/__init__.py +0 -0
  40. {large-image-source-dicom-1.28.2.dev16 → large-image-source-dicom-1.28.2.dev28}/test_dicom/test_web_client.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: large-image-source-dicom
3
- Version: 1.28.2.dev16
3
+ Version: 1.28.2.dev28
4
4
  Summary: A DICOM tilesource for large_image.
5
5
  Home-page: https://github.com/girder/large_image
6
6
  Author: Kitware, Inc.
@@ -17,10 +17,11 @@ Classifier: Programming Language :: Python :: 3.11
17
17
  Classifier: Programming Language :: Python :: 3.12
18
18
  Requires-Python: >=3.8
19
19
  License-File: LICENSE
20
- Requires-Dist: large-image>=1.28.2.dev16
20
+ Requires-Dist: large-image>=1.28.2.dev28
21
21
  Requires-Dist: wsidicom>=0.9.0
22
22
  Provides-Extra: girder
23
- Requires-Dist: girder-large-image>=1.28.2.dev16; extra == "girder"
23
+ Requires-Dist: girder-large-image>=1.28.2.dev28; extra == "girder"
24
+ Requires-Dist: girder>=3.2.3; extra == "girder"
24
25
 
25
26
  A DICOM tilesource for large_image.
26
27
 
@@ -1,3 +1,5 @@
1
+ import json
2
+
1
3
  import cherrypy
2
4
  import requests
3
5
  from large_image_source_dicom.dicom_tags import dicom_key_to_tag
@@ -394,31 +396,10 @@ class DICOMwebAssetstoreAdapter(AbstractAssetstoreAdapter):
394
396
  except ValueError:
395
397
  return
396
398
 
397
- def importData(self, parent, parentType, params, progress, user, **kwargs):
398
- """
399
- Import DICOMweb WSI instances from a DICOMweb server.
400
-
401
- :param parent: The parent object to import into.
402
- :param parentType: The model type of the parent object.
403
- :type parentType: str
404
- :param params: Additional parameters required for the import process.
405
- This dictionary may include the following keys:
406
-
407
- :limit: (optional) limit the number of studies imported.
408
- :search_filters: (optional) a dictionary of additional search
409
- filters to use with dicomweb_client's `search_for_series()`
410
- function.
411
-
412
- :type params: dict
413
- :param progress: Object on which to record progress if possible.
414
- :type progress: :py:class:`girder.utility.progress.ProgressContext`
415
- :param user: The Girder user performing the import.
416
- :type user: dict or None
417
- :return: a list of items that were created
418
- """
399
+ def _importData(self, parent, parentType, params, progress, user):
419
400
  if parentType not in ('folder', 'user', 'collection'):
420
401
  msg = f'Invalid parent type: {parentType}'
421
- raise RuntimeError(msg)
402
+ raise ValidationException(msg)
422
403
 
423
404
  limit = params.get('limit')
424
405
  search_filters = params.get('search_filters', {})
@@ -512,6 +493,65 @@ class DICOMwebAssetstoreAdapter(AbstractAssetstoreAdapter):
512
493
 
513
494
  return items
514
495
 
496
+ def importData(self, parent, parentType, params, progress, user, **kwargs):
497
+ """
498
+ Import DICOMweb WSI instances from a DICOMweb server.
499
+
500
+ :param parent: The parent object to import into.
501
+ :param parentType: The model type of the parent object.
502
+ :type parentType: str
503
+ :param params: Additional parameters required for the import process.
504
+ This dictionary may include the following keys:
505
+
506
+ :limit: (optional) limit the number of studies imported.
507
+ :filters: (optional) a dictionary/JSON string of additional search
508
+ filters to use with dicomweb_client's `search_for_series()`
509
+ function.
510
+
511
+ :type params: dict
512
+ :param progress: Object on which to record progress if possible.
513
+ :type progress: :py:class:`girder.utility.progress.ProgressContext`
514
+ :param user: The Girder user performing the import.
515
+ :type user: dict or None
516
+ :return: a list of items that were created
517
+ """
518
+ # Validate the parameters
519
+ limit = params.get('limit') or None
520
+ if limit is not None:
521
+ error_msg = f'Invalid limit: {limit}'
522
+ try:
523
+ limit = int(limit)
524
+ except ValueError:
525
+ raise ValidationException(error_msg)
526
+
527
+ if limit < 1:
528
+ raise ValidationException(error_msg)
529
+
530
+ search_filters = params.get('filters', {})
531
+ if isinstance(search_filters, str):
532
+ try:
533
+ search_filters = json.loads(search_filters)
534
+ except json.JSONDecodeError as e:
535
+ msg = f'Invalid filters: "{params.get("filters")}". {e}'
536
+ raise ValidationException(msg)
537
+
538
+ items = self._importData(
539
+ parent,
540
+ parentType,
541
+ {
542
+ 'limit': limit,
543
+ 'search_filters': search_filters,
544
+ },
545
+ progress,
546
+ user,
547
+ )
548
+
549
+ if not items:
550
+ msg = 'No studies matching the search filters were found'
551
+ raise ValidationException(msg)
552
+
553
+ return items
554
+
515
555
  @property
516
556
  def auth_session(self):
517
557
  return _create_auth_session(self.assetstore_meta)
@@ -1,15 +1,14 @@
1
- import json
2
-
3
1
  from girder.api import access
4
2
  from girder.api.describe import Description, autoDescribeRoute
5
3
  from girder.api.rest import Resource
6
4
  from girder.constants import TokenScope
7
5
  from girder.exceptions import RestException
8
6
  from girder.models.assetstore import Assetstore
9
- from girder.utility import assetstore_utilities
10
7
  from girder.utility.model_importer import ModelImporter
11
8
  from girder.utility.progress import ProgressContext
12
9
 
10
+ from .dicomweb_assetstore_adapter import DICOMwebAssetstoreAdapter
11
+
13
12
 
14
13
  class DICOMwebAssetstoreResource(Resource):
15
14
  def __init__(self):
@@ -34,39 +33,14 @@ class DICOMwebAssetstoreResource(Resource):
34
33
  parent = ModelImporter.model(destinationType).load(params['destinationId'], force=True,
35
34
  exc=True)
36
35
 
37
- limit = params.get('limit') or None
38
- if limit is not None:
39
- error_msg = 'Invalid limit'
40
- try:
41
- limit = int(limit)
42
- except ValueError:
43
- raise RestException(error_msg)
44
-
45
- if limit < 1:
46
- raise RestException(error_msg)
47
-
48
- try:
49
- search_filters = json.loads(params.get('filters') or '{}')
50
- except json.JSONDecodeError as e:
51
- msg = f'Invalid filters: {e}'
52
- raise RestException(msg)
53
-
54
- adapter = assetstore_utilities.getAssetstoreAdapter(assetstore)
55
- items = adapter.importData(
36
+ return DICOMwebAssetstoreAdapter(assetstore).importData(
56
37
  parent,
57
38
  destinationType,
58
- {
59
- 'limit': limit,
60
- 'search_filters': search_filters,
61
- },
39
+ params,
62
40
  progress,
63
41
  user,
64
42
  )
65
43
 
66
- if not items:
67
- msg = 'No studies matching the search filters were found'
68
- raise RestException(msg)
69
-
70
44
  @access.admin(scope=TokenScope.DATA_WRITE)
71
45
  @autoDescribeRoute(
72
46
  Description('Import references to DICOM objects from a DICOMweb server')
@@ -1,7 +1,6 @@
1
- import './routes';
2
-
3
1
  // Extends and overrides API
4
2
  import './constants';
3
+ import './views/DICOMwebImportView';
5
4
  import './views/AssetstoresView';
6
5
  import './views/EditAssetstoreWidget';
7
6
  import './views/NewAssetstoreWidget';
@@ -1,6 +1,6 @@
1
1
  .g-assetstore-import-button-container
2
2
  a.g-dwas-import-button.btn.btn-sm.btn-success(
3
- href=`#dicomweb_assetstore/${assetstore.get('_id')}/import`,
3
+ href=`#assetstore/${assetstore.get('_id')}/import`,
4
4
  title="Import references to DICOM objects from a DICOMweb server")
5
5
  i.icon-link-ext
6
6
  | Import data
@@ -5,6 +5,9 @@ import router from '@girder/core/router';
5
5
  import View from '@girder/core/views/View';
6
6
  import { restRequest } from '@girder/core/rest';
7
7
 
8
+ import { assetstoreImportViewMap } from '@girder/core/views/body/AssetstoresView';
9
+ import { AssetstoreType } from '@girder/core/constants';
10
+
8
11
  import DWASImportTemplate from '../templates/assetstoreImport.pug';
9
12
 
10
13
  const DICOMwebImportView = View.extend({
@@ -24,12 +27,12 @@ const DICOMwebImportView = View.extend({
24
27
  }
25
28
 
26
29
  this.$('.g-submit-dwas-import').addClass('disabled');
27
- this.model.off().on('g:imported', function () {
30
+ this.assetstore.off().on('g:imported', function () {
28
31
  router.navigate(destinationType + '/' + destinationId, { trigger: true });
29
32
  }, this).on('g:error', function (err) {
30
33
  this.$('.g-submit-dwas-import').removeClass('disabled');
31
34
  this.$('.g-validation-failed-message').html(err.responseJSON.message);
32
- }, this).dicomwebImport({
35
+ }, this).import({
33
36
  destinationId,
34
37
  destinationType,
35
38
  limit,
@@ -40,7 +43,7 @@ const DICOMwebImportView = View.extend({
40
43
  'click .g-open-browser': '_openBrowser'
41
44
  },
42
45
 
43
- initialize: function () {
46
+ initialize: function (settings) {
44
47
  this._browserWidgetView = new BrowserWidget({
45
48
  parentView: this,
46
49
  titleText: 'Destination',
@@ -75,12 +78,13 @@ const DICOMwebImportView = View.extend({
75
78
  }
76
79
  });
77
80
  });
81
+ this.assetstore = settings.assetstore;
78
82
  this.render();
79
83
  },
80
84
 
81
85
  render: function () {
82
86
  this.$el.html(DWASImportTemplate({
83
- assetstore: this.model
87
+ assetstore: this.assetstore
84
88
  }));
85
89
 
86
90
  return this;
@@ -91,4 +95,6 @@ const DICOMwebImportView = View.extend({
91
95
  }
92
96
  });
93
97
 
98
+ assetstoreImportViewMap[AssetstoreType.DICOMWEB] = DICOMwebImportView;
99
+
94
100
  export default DICOMwebImportView;
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: large-image-source-dicom
3
- Version: 1.28.2.dev16
3
+ Version: 1.28.2.dev28
4
4
  Summary: A DICOM tilesource for large_image.
5
5
  Home-page: https://github.com/girder/large_image
6
6
  Author: Kitware, Inc.
@@ -17,10 +17,11 @@ Classifier: Programming Language :: Python :: 3.11
17
17
  Classifier: Programming Language :: Python :: 3.12
18
18
  Requires-Python: >=3.8
19
19
  License-File: LICENSE
20
- Requires-Dist: large-image>=1.28.2.dev16
20
+ Requires-Dist: large-image>=1.28.2.dev28
21
21
  Requires-Dist: wsidicom>=0.9.0
22
22
  Provides-Extra: girder
23
- Requires-Dist: girder-large-image>=1.28.2.dev16; extra == "girder"
23
+ Requires-Dist: girder-large-image>=1.28.2.dev28; extra == "girder"
24
+ Requires-Dist: girder>=3.2.3; extra == "girder"
24
25
 
25
26
  A DICOM tilesource for large_image.
26
27
 
@@ -20,8 +20,6 @@ large_image_source_dicom/assetstore/rest.py
20
20
  large_image_source_dicom/web_client/constants.js
21
21
  large_image_source_dicom/web_client/main.js
22
22
  large_image_source_dicom/web_client/package.json
23
- large_image_source_dicom/web_client/routes.js
24
- large_image_source_dicom/web_client/models/AssetstoreModel.js
25
23
  large_image_source_dicom/web_client/templates/assetstoreImport.pug
26
24
  large_image_source_dicom/web_client/templates/dicomwebAssetstoreCreate.pug
27
25
  large_image_source_dicom/web_client/templates/dicomwebAssetstoreEditFields.pug
@@ -0,0 +1,6 @@
1
+ large-image>=1.28.2.dev28
2
+ wsidicom>=0.9.0
3
+
4
+ [girder]
5
+ girder-large-image>=1.28.2.dev28
6
+ girder>=3.2.3
@@ -41,11 +41,14 @@ entry_points = {
41
41
  ],
42
42
  }
43
43
 
44
+ girder_extras = [f'girder-large-image{limit_version}']
45
+
44
46
  if sys.version_info >= (3, 9):
45
47
  # For Python >= 3.9, include the DICOMweb plugin
46
48
  entry_points['girder.plugin'] = [
47
49
  'dicomweb = large_image_source_dicom.girder_plugin:DICOMwebPlugin',
48
50
  ]
51
+ girder_extras.append('girder>=3.2.3')
49
52
 
50
53
  setup(
51
54
  name='large-image-source-dicom',
@@ -71,7 +74,7 @@ setup(
71
74
  'wsidicom>=0.9.0',
72
75
  ],
73
76
  extras_require={
74
- 'girder': f'girder-large-image{limit_version}',
77
+ 'girder': girder_extras,
75
78
  },
76
79
  include_package_data=True,
77
80
  keywords='large_image, tile source',
@@ -143,7 +143,7 @@ describe('DICOMWeb assetstore', function () {
143
143
  });
144
144
 
145
145
  waitsFor(function () {
146
- return $('.g-validation-failed-message').html() === 'Invalid limit';
146
+ return $('.g-validation-failed-message').html() === 'Invalid limit: 1.3';
147
147
  }, 'Invalid limit check (float)');
148
148
 
149
149
  runs(function () {
@@ -156,7 +156,7 @@ describe('DICOMWeb assetstore', function () {
156
156
  });
157
157
 
158
158
  waitsFor(function () {
159
- return $('.g-validation-failed-message').html() === 'Invalid limit';
159
+ return $('.g-validation-failed-message').html() === 'Invalid limit: -1';
160
160
  }, 'Invalid limit check (negative)');
161
161
 
162
162
  runs(function () {
@@ -1,20 +0,0 @@
1
- import AssetstoreModel from '@girder/core/models/AssetstoreModel';
2
- import { restRequest } from '@girder/core/rest';
3
-
4
- /**
5
- * Extends the core assetstore model to add DICOMweb-specific functionality.
6
- */
7
- AssetstoreModel.prototype.dicomwebImport = function (params) {
8
- return restRequest({
9
- url: 'dicomweb_assetstore/' + this.get('_id') + '/import',
10
- type: 'POST',
11
- data: params,
12
- error: null
13
- }).done(() => {
14
- this.trigger('g:imported');
15
- }).fail((err) => {
16
- this.trigger('g:error', err);
17
- });
18
- };
19
-
20
- export default AssetstoreModel;
@@ -1,17 +0,0 @@
1
- import router from '@girder/core/router';
2
- import events from '@girder/core/events';
3
-
4
- import AssetstoreModel from './models/AssetstoreModel';
5
- import DICOMwebImportView from './views/DICOMwebImportView';
6
-
7
- router.route('dicomweb_assetstore/:id/import', 'dwasImport', function (id) {
8
- // Fetch the assetstore by id, then render the view.
9
- const assetstore = new AssetstoreModel({ _id: id });
10
- assetstore.once('g:fetched', function () {
11
- events.trigger('g:navigateTo', DICOMwebImportView, {
12
- model: assetstore
13
- });
14
- }).once('g:error', function () {
15
- router.navigate('assetstores', { trigger: true });
16
- }).fetch();
17
- });
@@ -1,5 +0,0 @@
1
- large-image>=1.28.2.dev16
2
- wsidicom>=0.9.0
3
-
4
- [girder]
5
- girder-large-image>=1.28.2.dev16