das-cli 1.2.26__tar.gz → 1.2.28__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.
- {das_cli-1.2.26/das_cli.egg-info → das_cli-1.2.28}/PKG-INFO +1 -1
- {das_cli-1.2.26 → das_cli-1.2.28}/das/common/api.py +4 -4
- {das_cli-1.2.26 → das_cli-1.2.28}/das/managers/search_manager.py +19 -1
- {das_cli-1.2.26 → das_cli-1.2.28}/das/services/entries.py +16 -8
- {das_cli-1.2.26 → das_cli-1.2.28/das_cli.egg-info}/PKG-INFO +1 -1
- {das_cli-1.2.26 → das_cli-1.2.28}/pyproject.toml +1 -1
- {das_cli-1.2.26 → das_cli-1.2.28}/LICENSE +0 -0
- {das_cli-1.2.26 → das_cli-1.2.28}/MANIFEST.in +0 -0
- {das_cli-1.2.26 → das_cli-1.2.28}/README.md +0 -0
- {das_cli-1.2.26 → das_cli-1.2.28}/das/__init__.py +0 -0
- {das_cli-1.2.26 → das_cli-1.2.28}/das/ai/plugins/dasai.py +0 -0
- {das_cli-1.2.26 → das_cli-1.2.28}/das/ai/plugins/entries/entries_plugin.py +0 -0
- {das_cli-1.2.26 → das_cli-1.2.28}/das/app.py +0 -0
- {das_cli-1.2.26 → das_cli-1.2.28}/das/authentication/auth.py +0 -0
- {das_cli-1.2.26 → das_cli-1.2.28}/das/authentication/secure_input.py +0 -0
- {das_cli-1.2.26 → das_cli-1.2.28}/das/cli.py +0 -0
- {das_cli-1.2.26 → das_cli-1.2.28}/das/common/config.py +0 -0
- {das_cli-1.2.26 → das_cli-1.2.28}/das/common/entry_fields_constants.py +0 -0
- {das_cli-1.2.26 → das_cli-1.2.28}/das/common/enums.py +0 -0
- {das_cli-1.2.26 → das_cli-1.2.28}/das/common/file_utils.py +0 -0
- {das_cli-1.2.26 → das_cli-1.2.28}/das/managers/__init__.py +0 -0
- {das_cli-1.2.26 → das_cli-1.2.28}/das/managers/digital_objects_manager.py +0 -0
- {das_cli-1.2.26 → das_cli-1.2.28}/das/managers/download_manager.py +0 -0
- {das_cli-1.2.26 → das_cli-1.2.28}/das/managers/entries_manager.py +0 -0
- {das_cli-1.2.26 → das_cli-1.2.28}/das/services/attributes.py +0 -0
- {das_cli-1.2.26 → das_cli-1.2.28}/das/services/cache.py +0 -0
- {das_cli-1.2.26 → das_cli-1.2.28}/das/services/digital_objects.py +0 -0
- {das_cli-1.2.26 → das_cli-1.2.28}/das/services/downloads.py +0 -0
- {das_cli-1.2.26 → das_cli-1.2.28}/das/services/entry_fields.py +0 -0
- {das_cli-1.2.26 → das_cli-1.2.28}/das/services/hangfire.py +0 -0
- {das_cli-1.2.26 → das_cli-1.2.28}/das/services/search.py +0 -0
- {das_cli-1.2.26 → das_cli-1.2.28}/das/services/users.py +0 -0
- {das_cli-1.2.26 → das_cli-1.2.28}/das_cli.egg-info/SOURCES.txt +0 -0
- {das_cli-1.2.26 → das_cli-1.2.28}/das_cli.egg-info/dependency_links.txt +0 -0
- {das_cli-1.2.26 → das_cli-1.2.28}/das_cli.egg-info/entry_points.txt +0 -0
- {das_cli-1.2.26 → das_cli-1.2.28}/das_cli.egg-info/requires.txt +0 -0
- {das_cli-1.2.26 → das_cli-1.2.28}/das_cli.egg-info/top_level.txt +0 -0
- {das_cli-1.2.26 → das_cli-1.2.28}/setup.cfg +0 -0
|
@@ -17,10 +17,10 @@ def get_data(url, headers=None, params=None):
|
|
|
17
17
|
"""
|
|
18
18
|
try:
|
|
19
19
|
response = requests.get(url, headers=headers, params=params, verify=load_verify_ssl())
|
|
20
|
-
response.raise_for_status() # Raise an error for HTTP errors
|
|
21
20
|
try:
|
|
22
21
|
return response.json()
|
|
23
22
|
except json.JSONDecodeError as json_err:
|
|
23
|
+
response.raise_for_status()
|
|
24
24
|
print(f"Error decoding JSON response: {json_err}")
|
|
25
25
|
return {"error": f"Invalid JSON response: {json_err}", "raw_content": response.text[:200]}
|
|
26
26
|
except requests.RequestException as e:
|
|
@@ -61,10 +61,10 @@ def post_data(url, headers=None, data=None):
|
|
|
61
61
|
"""
|
|
62
62
|
try:
|
|
63
63
|
response = requests.post(url, headers=headers, json=data, verify=load_verify_ssl())
|
|
64
|
-
response.raise_for_status() # Raise an error for HTTP errors
|
|
65
64
|
try:
|
|
66
65
|
return response.json()
|
|
67
66
|
except json.JSONDecodeError as json_err:
|
|
67
|
+
response.raise_for_status()
|
|
68
68
|
print(f"Error decoding JSON response: {json_err}")
|
|
69
69
|
return {"error": f"Invalid JSON response: {json_err}", "raw_content": response.text[:200]}
|
|
70
70
|
except requests.RequestException as e:
|
|
@@ -85,10 +85,10 @@ def put_data(url, headers=None, data=None):
|
|
|
85
85
|
"""
|
|
86
86
|
try:
|
|
87
87
|
response = requests.put(url, headers=headers, json=data, verify=load_verify_ssl())
|
|
88
|
-
response.raise_for_status() # Raise an error for HTTP errors
|
|
89
88
|
try:
|
|
90
89
|
return response.json()
|
|
91
90
|
except json.JSONDecodeError as json_err:
|
|
91
|
+
response.raise_for_status()
|
|
92
92
|
print(f"Error decoding JSON response: {json_err}")
|
|
93
93
|
return {"error": f"Invalid JSON response: {json_err}", "raw_content": response.text[:200]}
|
|
94
94
|
except requests.RequestException as e:
|
|
@@ -109,10 +109,10 @@ def delete_data(url, headers=None, data=None):
|
|
|
109
109
|
"""
|
|
110
110
|
try:
|
|
111
111
|
response = requests.delete(url, headers=headers, json=data, verify=load_verify_ssl())
|
|
112
|
-
response.raise_for_status() # Raise an error for HTTP errors
|
|
113
112
|
try:
|
|
114
113
|
return response.json()
|
|
115
114
|
except json.JSONDecodeError as json_err:
|
|
115
|
+
response.raise_for_status()
|
|
116
116
|
print(f"Error decoding JSON response: {json_err}")
|
|
117
117
|
return {"error": f"Invalid JSON response: {json_err}", "raw_content": response.text[:200]}
|
|
118
118
|
except requests.RequestException as e:
|
|
@@ -2,7 +2,8 @@ from das.common.config import load_api_url
|
|
|
2
2
|
from das.services.attributes import AttributesService
|
|
3
3
|
from das.services.entry_fields import EntryFieldsService
|
|
4
4
|
from das.services.search import SearchService
|
|
5
|
-
|
|
5
|
+
from das.common.entry_fields_constants import DIGITAL_OBJECT_INPUT, GROUP_BOX_INPUT
|
|
6
|
+
import json
|
|
6
7
|
class SearchManager:
|
|
7
8
|
def __init__(self):
|
|
8
9
|
base_url = load_api_url()
|
|
@@ -12,6 +13,21 @@ class SearchManager:
|
|
|
12
13
|
self.attributes_service = AttributesService(base_url)
|
|
13
14
|
self.entry_fields = EntryFieldsService(base_url)
|
|
14
15
|
|
|
16
|
+
def __convert_group_box_filter(self, entry_fields: list, filter: str) -> str:
|
|
17
|
+
"""Converts user-friendly group box filter to API-compatible filter."""
|
|
18
|
+
for field in entry_fields:
|
|
19
|
+
if field.get('inputType') == GROUP_BOX_INPUT:
|
|
20
|
+
custom_data = field.get('customData', None)
|
|
21
|
+
if custom_data is not None:
|
|
22
|
+
custom_data = json.loads(custom_data)
|
|
23
|
+
if custom_data.get('fields') is not None:
|
|
24
|
+
for field in custom_data.get('fields'):
|
|
25
|
+
display_name = field.get('displayName')
|
|
26
|
+
column_name = field.get('column')
|
|
27
|
+
if display_name and column_name:
|
|
28
|
+
filter = filter.lower().replace(f"{display_name.lower()}(", f"{column_name.lower()}(")
|
|
29
|
+
return filter
|
|
30
|
+
|
|
15
31
|
def __convert_filter(self, entry_fields: list, filter: str) -> str:
|
|
16
32
|
"""Converts user-friendly filter to API-compatible filter."""
|
|
17
33
|
# The fileter will be in the format: name(*64*);Create at(>2023-01-01);Sampling Location(*North Sea*)
|
|
@@ -19,6 +35,8 @@ class SearchManager:
|
|
|
19
35
|
for field in entry_fields:
|
|
20
36
|
display_name = field.get('displayName')
|
|
21
37
|
column_name = field.get('column')
|
|
38
|
+
if field.get('inputType') == GROUP_BOX_INPUT:
|
|
39
|
+
filter = self.__convert_group_box_filter(entry_fields, filter)
|
|
22
40
|
if display_name and column_name:
|
|
23
41
|
filter = filter.lower().replace(f"{display_name.lower()}(", f"{column_name.lower()}(")
|
|
24
42
|
return filter
|
|
@@ -5,6 +5,14 @@ class EntriesService():
|
|
|
5
5
|
def __init__(self, base_url):
|
|
6
6
|
self.base_url = f"{base_url}/api/services/app/Entry"
|
|
7
7
|
|
|
8
|
+
def _raise_error(self, response: dict):
|
|
9
|
+
error = response.get('error') or {}
|
|
10
|
+
if isinstance(error, dict):
|
|
11
|
+
message = (error.get('message') or 'Unknown error occurred').strip()
|
|
12
|
+
else:
|
|
13
|
+
message = str(error).strip() or 'Unknown error occurred'
|
|
14
|
+
raise ValueError(message)
|
|
15
|
+
|
|
8
16
|
def get_entry(self, code: str):
|
|
9
17
|
"""Get an entry by its code (raw key values)."""
|
|
10
18
|
token = load_token()
|
|
@@ -23,7 +31,7 @@ class EntriesService():
|
|
|
23
31
|
if response.get('success') == True:
|
|
24
32
|
return response.get('result')
|
|
25
33
|
else:
|
|
26
|
-
|
|
34
|
+
self._raise_error(response)
|
|
27
35
|
|
|
28
36
|
def get(self, id: str = None, code: str = None):
|
|
29
37
|
token = load_token()
|
|
@@ -51,7 +59,7 @@ class EntriesService():
|
|
|
51
59
|
raw_content = response.get('raw_content', '')
|
|
52
60
|
raise ValueError(f"API returned invalid JSON: {response.get('error')}\nResponse content: {raw_content}")
|
|
53
61
|
else:
|
|
54
|
-
|
|
62
|
+
self._raise_error(response)
|
|
55
63
|
|
|
56
64
|
def delete_by_id(self, id: str) -> bool:
|
|
57
65
|
"""Delete an entry by its id."""
|
|
@@ -77,7 +85,7 @@ class EntriesService():
|
|
|
77
85
|
if response.get('success') == True:
|
|
78
86
|
return True
|
|
79
87
|
else:
|
|
80
|
-
|
|
88
|
+
self._raise_error(response)
|
|
81
89
|
|
|
82
90
|
def delete(self, code: str) -> bool:
|
|
83
91
|
"""Delete an entry by its code."""
|
|
@@ -102,7 +110,7 @@ class EntriesService():
|
|
|
102
110
|
if response.get('success') == True:
|
|
103
111
|
return True
|
|
104
112
|
else:
|
|
105
|
-
|
|
113
|
+
self._raise_error(response)
|
|
106
114
|
|
|
107
115
|
def create(self, attribute_id: int, entry: dict):
|
|
108
116
|
"""Create a new entry."""
|
|
@@ -128,7 +136,7 @@ class EntriesService():
|
|
|
128
136
|
if response.get('success') == True:
|
|
129
137
|
return response.get('result')
|
|
130
138
|
else:
|
|
131
|
-
|
|
139
|
+
self._raise_error(response)
|
|
132
140
|
|
|
133
141
|
def update(self, attribute_id: int, entry: dict):
|
|
134
142
|
"""Update an existing entry."""
|
|
@@ -154,7 +162,7 @@ class EntriesService():
|
|
|
154
162
|
if response.get('success') == True:
|
|
155
163
|
return response.get('result')
|
|
156
164
|
else:
|
|
157
|
-
|
|
165
|
+
self._raise_error(response)
|
|
158
166
|
|
|
159
167
|
def get_entry_logs(
|
|
160
168
|
self,
|
|
@@ -183,7 +191,7 @@ class EntriesService():
|
|
|
183
191
|
if response.get('success') == True:
|
|
184
192
|
return response.get('result')
|
|
185
193
|
else:
|
|
186
|
-
|
|
194
|
+
self._raise_error(response)
|
|
187
195
|
|
|
188
196
|
def chown(self, new_user_id: int, entry_list_ids: list[str]):
|
|
189
197
|
"""Change the owner of a list of entries."""
|
|
@@ -209,5 +217,5 @@ class EntriesService():
|
|
|
209
217
|
if response.get('success') == True:
|
|
210
218
|
return response.get('result')
|
|
211
219
|
else:
|
|
212
|
-
|
|
220
|
+
self._raise_error(response)
|
|
213
221
|
|
|
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
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|