das-cli 1.2.21__tar.gz → 1.2.24__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 (38) hide show
  1. {das_cli-1.2.21/das_cli.egg-info → das_cli-1.2.24}/PKG-INFO +1 -1
  2. {das_cli-1.2.21 → das_cli-1.2.24}/das/managers/entries_manager.py +73 -35
  3. {das_cli-1.2.21 → das_cli-1.2.24/das_cli.egg-info}/PKG-INFO +1 -1
  4. {das_cli-1.2.21 → das_cli-1.2.24}/pyproject.toml +1 -1
  5. {das_cli-1.2.21 → das_cli-1.2.24}/LICENSE +0 -0
  6. {das_cli-1.2.21 → das_cli-1.2.24}/MANIFEST.in +0 -0
  7. {das_cli-1.2.21 → das_cli-1.2.24}/README.md +0 -0
  8. {das_cli-1.2.21 → das_cli-1.2.24}/das/__init__.py +0 -0
  9. {das_cli-1.2.21 → das_cli-1.2.24}/das/ai/plugins/dasai.py +0 -0
  10. {das_cli-1.2.21 → das_cli-1.2.24}/das/ai/plugins/entries/entries_plugin.py +0 -0
  11. {das_cli-1.2.21 → das_cli-1.2.24}/das/app.py +0 -0
  12. {das_cli-1.2.21 → das_cli-1.2.24}/das/authentication/auth.py +0 -0
  13. {das_cli-1.2.21 → das_cli-1.2.24}/das/authentication/secure_input.py +0 -0
  14. {das_cli-1.2.21 → das_cli-1.2.24}/das/cli.py +0 -0
  15. {das_cli-1.2.21 → das_cli-1.2.24}/das/common/api.py +0 -0
  16. {das_cli-1.2.21 → das_cli-1.2.24}/das/common/config.py +0 -0
  17. {das_cli-1.2.21 → das_cli-1.2.24}/das/common/entry_fields_constants.py +0 -0
  18. {das_cli-1.2.21 → das_cli-1.2.24}/das/common/enums.py +0 -0
  19. {das_cli-1.2.21 → das_cli-1.2.24}/das/common/file_utils.py +0 -0
  20. {das_cli-1.2.21 → das_cli-1.2.24}/das/managers/__init__.py +0 -0
  21. {das_cli-1.2.21 → das_cli-1.2.24}/das/managers/digital_objects_manager.py +0 -0
  22. {das_cli-1.2.21 → das_cli-1.2.24}/das/managers/download_manager.py +0 -0
  23. {das_cli-1.2.21 → das_cli-1.2.24}/das/managers/search_manager.py +0 -0
  24. {das_cli-1.2.21 → das_cli-1.2.24}/das/services/attributes.py +0 -0
  25. {das_cli-1.2.21 → das_cli-1.2.24}/das/services/cache.py +0 -0
  26. {das_cli-1.2.21 → das_cli-1.2.24}/das/services/digital_objects.py +0 -0
  27. {das_cli-1.2.21 → das_cli-1.2.24}/das/services/downloads.py +0 -0
  28. {das_cli-1.2.21 → das_cli-1.2.24}/das/services/entries.py +0 -0
  29. {das_cli-1.2.21 → das_cli-1.2.24}/das/services/entry_fields.py +0 -0
  30. {das_cli-1.2.21 → das_cli-1.2.24}/das/services/hangfire.py +0 -0
  31. {das_cli-1.2.21 → das_cli-1.2.24}/das/services/search.py +0 -0
  32. {das_cli-1.2.21 → das_cli-1.2.24}/das/services/users.py +0 -0
  33. {das_cli-1.2.21 → das_cli-1.2.24}/das_cli.egg-info/SOURCES.txt +0 -0
  34. {das_cli-1.2.21 → das_cli-1.2.24}/das_cli.egg-info/dependency_links.txt +0 -0
  35. {das_cli-1.2.21 → das_cli-1.2.24}/das_cli.egg-info/entry_points.txt +0 -0
  36. {das_cli-1.2.21 → das_cli-1.2.24}/das_cli.egg-info/requires.txt +0 -0
  37. {das_cli-1.2.21 → das_cli-1.2.24}/das_cli.egg-info/top_level.txt +0 -0
  38. {das_cli-1.2.21 → das_cli-1.2.24}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: das-cli
3
- Version: 1.2.21
3
+ Version: 1.2.24
4
4
  Summary: DAS api client.
5
5
  Author: Royal Netherlands Institute for Sea Research
6
6
  License-Expression: MIT
@@ -350,64 +350,102 @@ class EntryManager:
350
350
  else:
351
351
  return source
352
352
 
353
- def __get_select_combobox_field_value(self, field, source: str) -> str:
353
+ def __get_select_combobox_field_value(self, field, source: str | list | dict) -> str | list | dict:
354
354
  """Helper method to get select combobox field value."""
355
355
 
356
356
  if not source:
357
357
  return None
358
358
 
359
+ # if is a dict return source as is
360
+ if isinstance(source, dict):
361
+ return source
362
+ elif isinstance(source, list):
363
+ return source
364
+
359
365
  attribute_id = -1
360
366
 
367
+ # convert all keys to lowercase
368
+ field = {str(k).lower(): v for k, v in field.items()}
369
+
361
370
  if field.get('column').isdigit():
362
371
  attribute_id = int(field.get('column'))
363
372
  elif field.get('column')[0].isalpha() and field.get('column')[1:].isdigit():
364
373
  attribute_id = int(field.get('column')[1:])
365
374
 
366
- if attribute_id == -1:
367
- # then we need to check if the field has the property customdata
368
- if not field.get('customdata', None) is None:
369
- try:
370
- customdata = json.loads(field.get('customdata'))
371
- if (customdata is not None and isinstance(customdata, dict) and "datasource" in customdata):
372
- datasource = customdata.get("datasource")
373
- if (datasource is not None and isinstance(datasource, dict) and "attributeid" in datasource):
375
+ customdata = None
376
+ is_multiselect = False
377
+
378
+ if not field.get('customdata', None) is None and field.get('customdata') != "":
379
+ try:
380
+ customdata_string = field.get('customdata').lower()
381
+ customdata = json.loads(customdata_string)
382
+ if (customdata is not None and isinstance(customdata, dict) and "datasource" in customdata):
383
+ datasource = customdata.get("datasource")
384
+ if datasource is not None and isinstance(datasource, dict):
385
+ if "attributeid" in datasource:
374
386
  attribute_id = datasource.get("attributeid")
375
- except json.JSONDecodeError:
376
- raise ValueError(f"Invalid customdata JSON: {field.get('customdata')}")
387
+ if "ismultiselect" in datasource:
388
+ is_multiselect = datasource.get("ismultiselect")
389
+ except json.JSONDecodeError:
390
+ raise ValueError(f"Invalid customdata JSON: {field.get('customdata')}")
391
+
392
+ expected_max_result_count = 1
393
+ if is_multiselect:
394
+ expected_max_result_count = len(source.split(','))
377
395
 
378
396
  search_params = {
379
397
  "attributeId": attribute_id,
380
- "queryString": f"displayname({source});",
381
- "maxResultCount": 1,
398
+ "queryString": self.__get_query_string(source, is_multiselect),
399
+ "maxResultCount": expected_max_result_count,
382
400
  "skipCount": 0
383
401
  }
402
+
403
+ search_response = self.search_service.search_entries(**search_params)
384
404
 
385
- # checks if source is GUID, if so, than we search by id
386
- if self.is_guid(source):
387
- search_params['queryString'] = f"id({source});"
388
- search_response = self.search_service.search_entries(**search_params)
405
+ if search_response.get('totalCount', 0) == 0:
406
+ raise ValueError(f"No results found for {field.get('displayName')}: {source}. Attribute ID: {attribute_id}")
407
+ result_list = []
408
+ if search_response and 'items' in search_response and len(search_response['items']) > 0:
409
+ for item in search_response['items']:
410
+ result = {}
411
+ result['id'] = item.get('entry', {}).get('id')
412
+ result['name'] = item.get('entry', {}).get('displayname')
413
+ result['code'] = item.get('entry', {}).get('code')
414
+ result['alias'] = item.get('entry', {}).get('alias', None)
415
+ result['attributeid'] = attribute_id
416
+ result = {k: v for k, v in result.items() if v is not None}
417
+ result_list.append(result)
418
+ return json.dumps(result_list)
389
419
  else:
390
- search_params['queryString'] = f"displayname({source});"
391
- search_response = self.search_service.search_entries(**search_params)
420
+ return source
421
+
422
+ def __get_query_string(self, source: str, is_multiselect: bool) -> str:
423
+
424
+ if not source:
425
+ return None
426
+
427
+ if not is_multiselect:
428
+ if self.is_guid(source):
429
+ return f"id({source});"
430
+ else:
431
+ return f"displayname({source}) or code({source});"
432
+ else:
433
+ values = source.split(',')
434
+ query_strings = []
435
+ for value in values:
436
+ if self.is_guid(value):
437
+ query_string = f"id({value}) "
438
+ else:
439
+ query_string = f"displayname({value}) or code({value}) "
440
+ query_strings.append(query_string)
441
+ return f"{' or '.join(query_strings)}"
442
+
443
+
444
+
445
+
392
446
 
393
- search_response = self.search_service.search_entries(**search_params)
394
447
 
395
- if search_response.get('totalCount', 0) == 0:
396
- search_params['queryString'] = f"code({source});"
397
- search_response = self.search_service.search_entries(**search_params)
398
448
 
399
- if search_response and 'items' in search_response and len(search_response['items']) > 0:
400
- result = {}
401
- result['id'] = search_response['items'][0].get('entry', {}).get('id')
402
- result['name'] = search_response['items'][0].get('entry', {}).get('displayname')
403
- result['code'] = search_response['items'][0].get('entry', {}).get('code')
404
- result['alias'] = search_response['items'][0].get('entry', {}).get('alias', None)
405
- result['attributeid'] = attribute_id
406
- # Filter out None values from the result dictionary
407
- result = {k: v for k, v in result.items() if v is not None}
408
- return json.dumps([result])
409
- else:
410
- return source
411
449
 
412
450
  def is_guid(self, source: str) -> bool:
413
451
  """Helper method to check if a string is a GUID."""
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: das-cli
3
- Version: 1.2.21
3
+ Version: 1.2.24
4
4
  Summary: DAS api client.
5
5
  Author: Royal Netherlands Institute for Sea Research
6
6
  License-Expression: MIT
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "das-cli"
7
- version = "1.2.21"
7
+ version = "1.2.24"
8
8
  authors = [
9
9
  { name="Royal Netherlands Institute for Sea Research" },
10
10
  ]
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes