pinexq-client 0.4.2.20241009.1__py3-none-any.whl → 0.5.0.20241018.1__py3-none-any.whl
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.
- pinexq_client/core/hco/action_hco.py +6 -2
- pinexq_client/core/hco/action_with_parameters_hco.py +6 -2
- pinexq_client/core/hco/link_hco.py +7 -2
- pinexq_client/core/hco/unavailable.py +21 -2
- pinexq_client/core/model/error.py +3 -0
- pinexq_client/core/sirenaccess.py +3 -3
- pinexq_client/job_management/__init__.py +1 -1
- pinexq_client/job_management/hcos/job_hco.py +134 -120
- pinexq_client/job_management/hcos/jobsroot_hco.py +54 -39
- pinexq_client/job_management/model/open_api_generated.py +22 -1
- pinexq_client/job_management/tool/job.py +10 -0
- {pinexq_client-0.4.2.20241009.1.dist-info → pinexq_client-0.5.0.20241018.1.dist-info}/METADATA +1 -1
- {pinexq_client-0.4.2.20241009.1.dist-info → pinexq_client-0.5.0.20241018.1.dist-info}/RECORD +16 -16
- {pinexq_client-0.4.2.20241009.1.dist-info → pinexq_client-0.5.0.20241018.1.dist-info}/WHEEL +1 -1
- {pinexq_client-0.4.2.20241009.1.dist-info → pinexq_client-0.5.0.20241018.1.dist-info}/entry_points.txt +0 -0
- {pinexq_client-0.4.2.20241009.1.dist-info → pinexq_client-0.5.0.20241018.1.dist-info}/licenses/LICENSE +0 -0
|
@@ -5,13 +5,13 @@ from httpx import URL
|
|
|
5
5
|
|
|
6
6
|
from pinexq_client.core import Entity, Action, execute_action, raise_exception_on_error, ClientException
|
|
7
7
|
from pinexq_client.core.hco.hco_base import ClientContainer
|
|
8
|
-
from pinexq_client.core.hco.unavailable import UnavailableAction
|
|
8
|
+
from pinexq_client.core.hco.unavailable import UnavailableAction, HypermediaAvailability
|
|
9
9
|
|
|
10
10
|
TEntity = TypeVar('TEntity', bound=Entity)
|
|
11
11
|
THcoEntity = TypeVar('THcoEntity', bound=Entity)
|
|
12
12
|
|
|
13
13
|
|
|
14
|
-
class ActionHco(ClientContainer):
|
|
14
|
+
class ActionHco(ClientContainer, HypermediaAvailability):
|
|
15
15
|
_client: httpx.Client
|
|
16
16
|
_action: Action
|
|
17
17
|
|
|
@@ -51,6 +51,10 @@ class ActionHco(ClientContainer):
|
|
|
51
51
|
f"Error while mapping mandatory action {name}: does not exist")
|
|
52
52
|
return result
|
|
53
53
|
|
|
54
|
+
@staticmethod
|
|
55
|
+
def is_available() -> bool:
|
|
56
|
+
return True
|
|
57
|
+
|
|
54
58
|
def _execute_internal(self) -> None | URL:
|
|
55
59
|
response = execute_action(self._client, self._action)
|
|
56
60
|
raise_exception_on_error(f"Error while executing action, unexpected response", response)
|
|
@@ -6,12 +6,12 @@ from pydantic import BaseModel
|
|
|
6
6
|
|
|
7
7
|
from pinexq_client.core import Entity, Action, execute_action, raise_exception_on_error, ClientException
|
|
8
8
|
from pinexq_client.core.hco.hco_base import ClientContainer
|
|
9
|
-
from pinexq_client.core.hco.unavailable import UnavailableAction
|
|
9
|
+
from pinexq_client.core.hco.unavailable import UnavailableAction, HypermediaAvailability
|
|
10
10
|
|
|
11
11
|
TParameters = TypeVar('TParameters', bound=BaseModel)
|
|
12
12
|
|
|
13
13
|
|
|
14
|
-
class ActionWithParametersHco(ClientContainer, Generic[TParameters]):
|
|
14
|
+
class ActionWithParametersHco(ClientContainer, Generic[TParameters], HypermediaAvailability):
|
|
15
15
|
_client: httpx.Client
|
|
16
16
|
_action: Action
|
|
17
17
|
|
|
@@ -52,6 +52,10 @@ class ActionWithParametersHco(ClientContainer, Generic[TParameters]):
|
|
|
52
52
|
f"Error while mapping mandatory action {name}: action does not exist")
|
|
53
53
|
return result
|
|
54
54
|
|
|
55
|
+
@staticmethod
|
|
56
|
+
def is_available() -> bool:
|
|
57
|
+
return True
|
|
58
|
+
|
|
55
59
|
def _execute_internal(self, parameters: BaseModel) -> None | URL:
|
|
56
60
|
if parameters is None:
|
|
57
61
|
raise ClientException(f"Error while executing action: action requires parameters")
|
|
@@ -5,10 +5,11 @@ from httpx import URL
|
|
|
5
5
|
|
|
6
6
|
from pinexq_client.core import Link, Entity, navigate, ensure_siren_response, ClientException
|
|
7
7
|
from pinexq_client.core.hco.hco_base import ClientContainer, TEntity
|
|
8
|
-
from pinexq_client.core.hco.unavailable import UnavailableLink
|
|
8
|
+
from pinexq_client.core.hco.unavailable import UnavailableLink, HypermediaAvailability
|
|
9
9
|
|
|
10
10
|
|
|
11
|
-
class LinkHco(ClientContainer):
|
|
11
|
+
class LinkHco(ClientContainer, HypermediaAvailability):
|
|
12
|
+
|
|
12
13
|
_client: httpx.Client
|
|
13
14
|
_link: Link
|
|
14
15
|
|
|
@@ -46,6 +47,10 @@ class LinkHco(ClientContainer):
|
|
|
46
47
|
|
|
47
48
|
return result
|
|
48
49
|
|
|
50
|
+
@staticmethod
|
|
51
|
+
def is_available() -> bool:
|
|
52
|
+
return True
|
|
53
|
+
|
|
49
54
|
def _navigate_internal(self, parse_type: Type[TEntity] = Entity) -> TEntity:
|
|
50
55
|
response = navigate(self._client, self._link, parse_type)
|
|
51
56
|
return ensure_siren_response(response)
|
|
@@ -1,17 +1,36 @@
|
|
|
1
|
+
from abc import ABC, ABCMeta, abstractmethod
|
|
2
|
+
|
|
1
3
|
from pinexq_client.core import NotAvailableException
|
|
2
4
|
|
|
3
5
|
|
|
4
|
-
class
|
|
6
|
+
class HypermediaAvailability(ABC):
|
|
7
|
+
def __bool__(self) -> bool:
|
|
8
|
+
return self.is_available()
|
|
9
|
+
|
|
10
|
+
@staticmethod
|
|
11
|
+
@abstractmethod
|
|
12
|
+
def is_available() -> bool:
|
|
13
|
+
...
|
|
14
|
+
|
|
15
|
+
class UnavailableAction(HypermediaAvailability):
|
|
5
16
|
"""This class is used to represent an action that is not available. It is used to avoid None
|
|
6
17
|
checks in the code."""
|
|
7
18
|
|
|
8
19
|
def execute(self, *args, **kwargs):
|
|
9
20
|
raise NotAvailableException(f"Error while executing action: action is not available")
|
|
10
21
|
|
|
22
|
+
@staticmethod
|
|
23
|
+
def is_available() -> bool:
|
|
24
|
+
return False
|
|
11
25
|
|
|
12
|
-
|
|
26
|
+
|
|
27
|
+
class UnavailableLink(HypermediaAvailability):
|
|
13
28
|
"""This class is used to represent a link that is not available. It is used to avoid None
|
|
14
29
|
checks in the code."""
|
|
15
30
|
|
|
16
31
|
def navigate(self):
|
|
17
32
|
raise NotAvailableException(f"Error while navigating: link is not available")
|
|
33
|
+
|
|
34
|
+
@staticmethod
|
|
35
|
+
def is_available() -> bool:
|
|
36
|
+
return False
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
from typing import Any
|
|
2
|
+
|
|
1
3
|
from pydantic import BaseModel, Field, ConfigDict
|
|
2
4
|
|
|
3
5
|
|
|
@@ -7,6 +9,7 @@ class ProblemDetails(BaseModel):
|
|
|
7
9
|
status: int | None = None
|
|
8
10
|
detail: str | None = None
|
|
9
11
|
instance: str | None = None
|
|
12
|
+
errors: Any = None
|
|
10
13
|
|
|
11
14
|
def __str__(self):
|
|
12
15
|
message = [f" {key}: {value}" for key, value in self.model_dump().items() if value]
|
|
@@ -22,7 +22,7 @@ def get_resource(client: httpx.Client, href: str, media_type: str = MediaTypes.S
|
|
|
22
22
|
# assume get for links
|
|
23
23
|
response = client.get(href)
|
|
24
24
|
except (httpx.ConnectTimeout, httpx.ConnectError) as exc:
|
|
25
|
-
raise ClientException(f"Http-client error requesting resource: {href}") from exc
|
|
25
|
+
raise ClientException(f"Http-client error requesting resource: {href}\nMessage:{exc}\nCurrent client timeout:{client.timeout}") from exc
|
|
26
26
|
expected_type = media_type or MediaTypes.SIREN # if not specified expect siren
|
|
27
27
|
|
|
28
28
|
if response.status_code == httpx.codes.OK:
|
|
@@ -84,7 +84,7 @@ def upload_file(client: httpx.Client, action: Action, file: BinaryIO, filename:
|
|
|
84
84
|
try:
|
|
85
85
|
response = client.request(method=action.method, url=action.href, files=files)
|
|
86
86
|
except httpx.RequestError as exc:
|
|
87
|
-
raise ClientException(f"Error from httpx while uploading data to: {action.href}") from exc
|
|
87
|
+
raise ClientException(f"Error from httpx while uploading data to: {action.href}\nMessage:{exc}\nCurrent client timeout:{client.timeout}") from exc
|
|
88
88
|
return handle_action_result(response)
|
|
89
89
|
|
|
90
90
|
|
|
@@ -119,7 +119,7 @@ def execute_action(client: httpx.Client, action: Action,
|
|
|
119
119
|
headers={Headers.CONTENT_TYPE.value: MediaTypes.APPLICATION_JSON.value}
|
|
120
120
|
)
|
|
121
121
|
except httpx.RequestError as exc:
|
|
122
|
-
raise ClientException(f"Error from httpx while executing action: {action.href}") from exc
|
|
122
|
+
raise ClientException(f"Error from httpx while executing action: {action.href}\nMessage:{exc}\nCurrent client timeout:{client.timeout}") from exc
|
|
123
123
|
|
|
124
124
|
return handle_action_result(response)
|
|
125
125
|
|
|
@@ -13,171 +13,185 @@ from pinexq_client.job_management.hcos import InputDataSlotHco
|
|
|
13
13
|
from pinexq_client.job_management.hcos.output_dataslot_hco import OutputDataSlotHco
|
|
14
14
|
from pinexq_client.job_management.hcos.processing_step_hco import ProcessingStepLink
|
|
15
15
|
from pinexq_client.job_management.known_relations import Relations
|
|
16
|
+
from pinexq_client.job_management.model import SetJobErrorStateParameters
|
|
16
17
|
from pinexq_client.job_management.model.open_api_generated import JobStates, ProcessingView, RenameJobParameters, \
|
|
17
|
-
|
|
18
|
+
SelectProcessingParameters, SetJobTagsParameters
|
|
18
19
|
from pinexq_client.job_management.model.sirenentities import JobEntity, InputDataSlotEntity, OutputDataSlotEntity
|
|
19
20
|
|
|
20
21
|
|
|
21
22
|
class JobRenameAction(ActionWithParametersHco[RenameJobParameters]):
|
|
22
|
-
|
|
23
|
-
|
|
23
|
+
def execute(self, parameters: RenameJobParameters):
|
|
24
|
+
self._execute(parameters)
|
|
24
25
|
|
|
25
|
-
|
|
26
|
-
|
|
26
|
+
def default_parameters(self) -> RenameJobParameters:
|
|
27
|
+
return self._get_default_parameters(RenameJobParameters, RenameJobParameters())
|
|
27
28
|
|
|
28
29
|
|
|
29
30
|
class JobSelectProcessingAction(ActionWithParametersHco[SelectProcessingParameters]):
|
|
30
|
-
|
|
31
|
-
|
|
31
|
+
def execute(self, parameters: SelectProcessingParameters):
|
|
32
|
+
self._execute(parameters)
|
|
32
33
|
|
|
33
|
-
|
|
34
|
-
|
|
34
|
+
def default_parameters(self) -> SelectProcessingParameters:
|
|
35
|
+
return self._get_default_parameters(SelectProcessingParameters, SelectProcessingParameters())
|
|
35
36
|
|
|
36
37
|
|
|
37
38
|
class JobHideAction(ActionHco):
|
|
38
|
-
|
|
39
|
-
|
|
39
|
+
def execute(self):
|
|
40
|
+
self._execute_internal()
|
|
40
41
|
|
|
41
42
|
|
|
42
43
|
class JobUnHideAction(ActionHco):
|
|
43
|
-
|
|
44
|
-
|
|
44
|
+
def execute(self):
|
|
45
|
+
self._execute_internal()
|
|
45
46
|
|
|
46
47
|
|
|
47
48
|
class JobDeleteAction(ActionHco):
|
|
48
|
-
|
|
49
|
-
|
|
49
|
+
def execute(self):
|
|
50
|
+
self._execute_internal()
|
|
50
51
|
|
|
51
52
|
|
|
52
53
|
class JobAllowOutputDataDeletionAction(ActionHco):
|
|
53
|
-
|
|
54
|
-
|
|
54
|
+
def execute(self):
|
|
55
|
+
self._execute_internal()
|
|
55
56
|
|
|
56
57
|
|
|
57
58
|
class JobDisAllowOutputDataDeletionAction(ActionHco):
|
|
58
|
-
|
|
59
|
-
|
|
59
|
+
def execute(self):
|
|
60
|
+
self._execute_internal()
|
|
60
61
|
|
|
61
62
|
|
|
62
63
|
class GenericProcessingConfigureParameters(BaseModel):
|
|
63
|
-
|
|
64
|
-
|
|
64
|
+
"""Generic parameter model, that can be set with any dictionary"""
|
|
65
|
+
model_config = ConfigDict(extra='allow')
|
|
65
66
|
|
|
66
67
|
|
|
67
68
|
class JobConfigureProcessingAction(ActionWithParametersHco[GenericProcessingConfigureParameters]):
|
|
68
|
-
|
|
69
|
-
|
|
69
|
+
def execute(self, parameters: GenericProcessingConfigureParameters):
|
|
70
|
+
self._execute(parameters)
|
|
70
71
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
72
|
+
def default_parameters(self) -> GenericProcessingConfigureParameters:
|
|
73
|
+
return self._get_default_parameters(GenericProcessingConfigureParameters,
|
|
74
|
+
GenericProcessingConfigureParameters())
|
|
74
75
|
|
|
75
76
|
|
|
76
77
|
class JobStartProcessingAction(ActionHco):
|
|
77
|
-
|
|
78
|
-
|
|
78
|
+
def execute(self):
|
|
79
|
+
self._execute_internal()
|
|
79
80
|
|
|
80
81
|
|
|
81
82
|
class JobLink(LinkHco):
|
|
82
|
-
|
|
83
|
-
|
|
83
|
+
def navigate(self) -> 'JobHco':
|
|
84
|
+
return JobHco.from_entity(self._navigate_internal(JobEntity), self._client)
|
|
84
85
|
|
|
85
86
|
|
|
86
87
|
class ParentJobLink(LinkHco):
|
|
87
|
-
|
|
88
|
-
|
|
88
|
+
def navigate(self) -> 'JobHco':
|
|
89
|
+
return JobHco.from_entity(self._navigate_internal(JobEntity), self._client)
|
|
89
90
|
|
|
90
91
|
|
|
91
92
|
class JobEditTagsAction(ActionWithParametersHco[SetJobTagsParameters]):
|
|
92
|
-
|
|
93
|
-
|
|
93
|
+
def execute(self, parameters: SetJobTagsParameters):
|
|
94
|
+
self._execute(parameters)
|
|
94
95
|
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
96
|
+
def default_parameters(self) -> SetJobTagsParameters:
|
|
97
|
+
# todo check why we have to manually set tags
|
|
98
|
+
return self._get_default_parameters(SetJobTagsParameters, SetJobTagsParameters(tags=[]))
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
class JobSetToErrorStateAction(ActionWithParametersHco[SetJobErrorStateParameters]):
|
|
102
|
+
def execute(self, parameters: SetJobErrorStateParameters):
|
|
103
|
+
self._execute(parameters)
|
|
104
|
+
|
|
105
|
+
def default_parameters(self) -> SetJobErrorStateParameters:
|
|
106
|
+
return self._get_default_parameters(SetJobErrorStateParameters, SetJobErrorStateParameters(
|
|
107
|
+
message='Manually set to error state by admin'
|
|
108
|
+
))
|
|
98
109
|
|
|
99
110
|
|
|
100
111
|
class JobHco(Hco[JobEntity]):
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
112
|
+
name: str = Property()
|
|
113
|
+
state: JobStates = Property()
|
|
114
|
+
hidden: bool = Property()
|
|
115
|
+
tags: list[str] | None = Property()
|
|
116
|
+
output_is_deletable: bool = Property()
|
|
117
|
+
created_at: datetime = Property()
|
|
118
|
+
completed_at: datetime = Property()
|
|
119
|
+
error_description: str = Property()
|
|
120
|
+
processing: ProcessingView = Property()
|
|
121
|
+
result: str = Property()
|
|
122
|
+
|
|
123
|
+
self_link: JobLink
|
|
124
|
+
parent_link: ParentJobLink | UnavailableLink
|
|
125
|
+
selected_processing_step_link: ProcessingStepLink | UnavailableLink
|
|
126
|
+
|
|
127
|
+
rename_action: JobRenameAction | UnavailableAction
|
|
128
|
+
select_processing_action: JobSelectProcessingAction | UnavailableAction
|
|
129
|
+
configure_processing_action: JobConfigureProcessingAction | UnavailableAction
|
|
130
|
+
start_processing_action: JobStartProcessingAction | UnavailableAction
|
|
131
|
+
hide_action: JobHideAction | UnavailableAction
|
|
132
|
+
unhide_action: JobUnHideAction | UnavailableAction
|
|
133
|
+
delete_action: JobDeleteAction | UnavailableAction
|
|
134
|
+
allow_output_data_deletion_action: JobAllowOutputDataDeletionAction | UnavailableAction
|
|
135
|
+
disallow_output_data_deletion_action: JobDisAllowOutputDataDeletionAction | UnavailableAction
|
|
136
|
+
edit_tags_action: JobEditTagsAction | UnavailableAction
|
|
137
|
+
set_to_error_state_action: JobSetToErrorStateAction | UnavailableAction
|
|
138
|
+
|
|
139
|
+
input_dataslots: List[InputDataSlotHco]
|
|
140
|
+
output_dataslots: List[OutputDataSlotHco]
|
|
141
|
+
|
|
142
|
+
@classmethod
|
|
143
|
+
def from_entity(cls, entity: JobEntity, client: httpx.Client) -> Self:
|
|
144
|
+
instance = cls(client, entity)
|
|
145
|
+
|
|
146
|
+
Hco.check_classes(instance._entity.class_, ["Job"])
|
|
147
|
+
|
|
148
|
+
instance.self_link = JobLink.from_entity(
|
|
149
|
+
instance._client, instance._entity, Relations.SELF)
|
|
150
|
+
instance.parent_link = ParentJobLink.from_entity_optional(
|
|
151
|
+
instance._client, instance._entity, Relations.PARENT_JOB)
|
|
152
|
+
instance.selected_processing_step_link = ProcessingStepLink.from_entity_optional(
|
|
153
|
+
instance._client, instance._entity, Relations.SELECTED_PROCESSING_STEP)
|
|
154
|
+
|
|
155
|
+
# actions
|
|
156
|
+
instance.hide_action = JobHideAction.from_entity_optional(
|
|
157
|
+
client, instance._entity, "Hide")
|
|
158
|
+
instance.unhide_action = JobUnHideAction.from_entity_optional(
|
|
159
|
+
client, instance._entity, "UnHide")
|
|
160
|
+
instance.delete_action = JobDeleteAction.from_entity_optional(
|
|
161
|
+
client, instance._entity, "Delete")
|
|
162
|
+
instance.rename_action = JobRenameAction.from_entity_optional(
|
|
163
|
+
client, instance._entity, "Rename")
|
|
164
|
+
instance.select_processing_action = JobSelectProcessingAction.from_entity_optional(
|
|
165
|
+
client, instance._entity, "SelectProcessing")
|
|
166
|
+
instance.configure_processing_action = JobConfigureProcessingAction.from_entity_optional(
|
|
167
|
+
client, instance._entity, "ConfigureProcessing")
|
|
168
|
+
instance.start_processing_action = JobStartProcessingAction.from_entity_optional(
|
|
169
|
+
client, instance._entity, "StartProcessing")
|
|
170
|
+
instance.allow_output_data_deletion_action = JobAllowOutputDataDeletionAction.from_entity_optional(
|
|
171
|
+
client, instance._entity, "AllowOutputDataDeletion")
|
|
172
|
+
instance.disallow_output_data_deletion_action = JobDisAllowOutputDataDeletionAction.from_entity_optional(
|
|
173
|
+
client, instance._entity, "DisallowOutputDataDeletion")
|
|
174
|
+
instance.set_to_error_state_action = JobSetToErrorStateAction.from_entity_optional(
|
|
175
|
+
client, instance._entity, "SetJobToErrorState")
|
|
176
|
+
instance.edit_tags_action = JobEditTagsAction.from_entity_optional(
|
|
177
|
+
client, instance._entity, "EditTags")
|
|
178
|
+
|
|
179
|
+
# entities
|
|
180
|
+
instance._extract_input_dataslots()
|
|
181
|
+
instance._extract_output_dataslots()
|
|
182
|
+
|
|
183
|
+
return instance
|
|
184
|
+
|
|
185
|
+
def _extract_input_dataslots(self):
|
|
186
|
+
self.input_dataslots = []
|
|
187
|
+
input_dataslots = self._entity.find_all_entities_with_relation(Relations.INPUT_DATASLOT, InputDataSlotEntity)
|
|
188
|
+
for input_dataslot in input_dataslots:
|
|
189
|
+
input_dataslot_hco: InputDataSlotHco = InputDataSlotHco.from_entity(input_dataslot, self._client)
|
|
190
|
+
self.input_dataslots.append(input_dataslot_hco)
|
|
191
|
+
|
|
192
|
+
def _extract_output_dataslots(self):
|
|
193
|
+
self.output_dataslots = []
|
|
194
|
+
output_dataslots = self._entity.find_all_entities_with_relation(Relations.OUTPUT_DATASLOT, OutputDataSlotEntity)
|
|
195
|
+
for output_dataslot in output_dataslots:
|
|
196
|
+
output_dataslot_hco: OutputDataSlotHco = OutputDataSlotHco.from_entity(output_dataslot, self._client)
|
|
197
|
+
self.output_dataslots.append(output_dataslot_hco)
|
|
@@ -18,65 +18,80 @@ from pinexq_client.job_management.known_relations import Relations
|
|
|
18
18
|
from pinexq_client.job_management.model.open_api_generated import (
|
|
19
19
|
CreateJobParameters,
|
|
20
20
|
JobQueryParameters,
|
|
21
|
-
CreateSubJobParameters
|
|
21
|
+
CreateSubJobParameters, SetJobsErrorStateParameters
|
|
22
22
|
)
|
|
23
23
|
from pinexq_client.job_management.model.sirenentities import JobsRootEntity
|
|
24
24
|
|
|
25
25
|
|
|
26
26
|
class CreateJobAction(ActionWithParametersHco[CreateJobParameters]):
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
27
|
+
def execute(self, parameters: CreateJobParameters) -> JobLink:
|
|
28
|
+
url: URL = self._execute_returns_url(parameters)
|
|
29
|
+
link = Link.from_url(url, [str(Relations.CREATED_RESSOURCE)], "Created job", MediaTypes.SIREN)
|
|
30
|
+
return JobLink.from_link(self._client, link)
|
|
31
31
|
|
|
32
|
-
|
|
33
|
-
|
|
32
|
+
def default_parameters(self) -> CreateJobParameters:
|
|
33
|
+
return self._get_default_parameters(CreateJobParameters, CreateJobParameters())
|
|
34
34
|
|
|
35
35
|
|
|
36
36
|
class CreateSubJobAction(ActionWithParametersHco[CreateSubJobParameters]):
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
37
|
+
def execute(self, parameters: CreateSubJobParameters) -> JobLink:
|
|
38
|
+
url = self._execute_returns_url(parameters)
|
|
39
|
+
link = Link.from_url(url, [str(Relations.CREATED_RESSOURCE)], "Created sub-job", MediaTypes.SIREN)
|
|
40
|
+
return JobLink.from_link(self._client, link)
|
|
41
41
|
|
|
42
|
-
|
|
43
|
-
|
|
42
|
+
def default_parameters(self) -> CreateSubJobParameters:
|
|
43
|
+
return self._get_default_parameters(CreateSubJobParameters, CreateSubJobParameters())
|
|
44
44
|
|
|
45
45
|
|
|
46
46
|
class JobQueryAction(ActionWithParametersHco):
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
47
|
+
def execute(self, parameters: JobQueryParameters) -> JobQueryResultHco:
|
|
48
|
+
url = self._execute_returns_url(parameters)
|
|
49
|
+
link = Link.from_url(url, [str(Relations.CREATED_RESSOURCE)], "Created job query", MediaTypes.SIREN)
|
|
50
|
+
# resolve link immediately
|
|
51
|
+
return JobQueryResultLink.from_link(self._client, link).navigate()
|
|
52
52
|
|
|
53
|
-
|
|
54
|
-
|
|
53
|
+
def default_parameters(self) -> JobQueryParameters:
|
|
54
|
+
return self._get_default_parameters(JobQueryParameters, JobQueryParameters())
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
class JobSetToErrorStateAction(ActionWithParametersHco[SetJobsErrorStateParameters]):
|
|
58
|
+
def execute(self, parameters: SetJobsErrorStateParameters):
|
|
59
|
+
self._execute(parameters)
|
|
60
|
+
|
|
61
|
+
def default_parameters(self) -> SetJobsErrorStateParameters:
|
|
62
|
+
return self._get_default_parameters(SetJobsErrorStateParameters, SetJobsErrorStateParameters(
|
|
63
|
+
message='Manually set to error state by admin',
|
|
64
|
+
created_this_many_hours_ago=0,
|
|
65
|
+
))
|
|
55
66
|
|
|
56
67
|
|
|
57
68
|
class JobsRootHco(Hco[JobsRootEntity]):
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
69
|
+
create_job_action: CreateJobAction | UnavailableAction
|
|
70
|
+
job_query_action: JobQueryAction | UnavailableAction
|
|
71
|
+
create_subjob_action: CreateSubJobAction | UnavailableAction
|
|
72
|
+
used_tags_link: JobUsedTagsLink | UnavailableLink
|
|
73
|
+
set_jobs_to_error_state: JobSetToErrorStateAction | UnavailableAction
|
|
74
|
+
|
|
75
|
+
self_link: 'JobsRootLink'
|
|
62
76
|
|
|
63
|
-
|
|
77
|
+
@classmethod
|
|
78
|
+
def from_entity(cls, entity: JobsRootEntity, client: httpx.Client) -> Self:
|
|
79
|
+
instance = cls(client, entity)
|
|
64
80
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
81
|
+
Hco.check_classes(instance._entity.class_, ["JobsRoot"])
|
|
82
|
+
instance.create_job_action = CreateJobAction.from_entity_optional(client, instance._entity, "CreateJob")
|
|
83
|
+
instance.create_subjob_action = CreateSubJobAction.from_entity_optional(client, instance._entity,
|
|
84
|
+
"CreateSubJob")
|
|
85
|
+
instance.job_query_action = JobQueryAction.from_entity_optional(client, instance._entity, "CreateJobQuery")
|
|
86
|
+
instance.used_tags_link = JobUsedTagsLink.from_entity_optional(
|
|
87
|
+
instance._client, instance._entity, Relations.USED_TAGS)
|
|
88
|
+
instance.self_link = JobsRootLink.from_entity(instance._client, instance._entity, Relations.SELF)
|
|
89
|
+
instance.set_jobs_to_error_state = JobSetToErrorStateAction.from_entity_optional(instance._client, instance._entity,
|
|
90
|
+
"SetJobsToErrorState")
|
|
68
91
|
|
|
69
|
-
|
|
70
|
-
instance.create_job_action = CreateJobAction.from_entity_optional(client, instance._entity, "CreateJob")
|
|
71
|
-
instance.create_subjob_action = CreateSubJobAction.from_entity_optional(client, instance._entity,
|
|
72
|
-
"CreateSubJob")
|
|
73
|
-
instance.job_query_action = JobQueryAction.from_entity_optional(client, instance._entity, "CreateJobQuery")
|
|
74
|
-
instance.used_tags_link = JobUsedTagsLink.from_entity_optional(
|
|
75
|
-
instance._client, instance._entity, Relations.USED_TAGS)
|
|
76
|
-
instance.self_link = JobsRootLink.from_entity(instance._client, instance._entity, Relations.SELF)
|
|
77
|
-
return instance
|
|
92
|
+
return instance
|
|
78
93
|
|
|
79
94
|
|
|
80
95
|
class JobsRootLink(LinkHco):
|
|
81
|
-
|
|
82
|
-
|
|
96
|
+
def navigate(self) -> JobsRootHco:
|
|
97
|
+
return JobsRootHco.from_entity(self._navigate_internal(JobsRootEntity), self._client)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# generated by datamodel-codegen:
|
|
2
2
|
# filename: openapi.json
|
|
3
|
-
# timestamp: 2024-
|
|
3
|
+
# timestamp: 2024-10-18T08:23:13+00:00
|
|
4
4
|
|
|
5
5
|
from __future__ import annotations
|
|
6
6
|
|
|
@@ -356,6 +356,14 @@ class SetCommentWorkDataParameters(BaseModel):
|
|
|
356
356
|
comment: str | None = Field(None, alias='Comment')
|
|
357
357
|
|
|
358
358
|
|
|
359
|
+
class SetJobErrorStateParameters(BaseModel):
|
|
360
|
+
model_config = ConfigDict(
|
|
361
|
+
extra='allow',
|
|
362
|
+
populate_by_name=True,
|
|
363
|
+
)
|
|
364
|
+
message: constr(min_length=1) = Field(..., alias='Message')
|
|
365
|
+
|
|
366
|
+
|
|
359
367
|
class SetJobTagsParameters(BaseModel):
|
|
360
368
|
model_config = ConfigDict(
|
|
361
369
|
extra='allow',
|
|
@@ -364,6 +372,15 @@ class SetJobTagsParameters(BaseModel):
|
|
|
364
372
|
tags: List[str] = Field(..., alias='Tags')
|
|
365
373
|
|
|
366
374
|
|
|
375
|
+
class SetJobsErrorStateParameters(BaseModel):
|
|
376
|
+
model_config = ConfigDict(
|
|
377
|
+
extra='allow',
|
|
378
|
+
populate_by_name=True,
|
|
379
|
+
)
|
|
380
|
+
message: constr(min_length=1) = Field(..., alias='Message')
|
|
381
|
+
created_before: AwareDatetime = Field(..., alias='CreatedBefore')
|
|
382
|
+
|
|
383
|
+
|
|
367
384
|
class SetNameWorkDataParameters(BaseModel):
|
|
368
385
|
model_config = ConfigDict(
|
|
369
386
|
extra='allow',
|
|
@@ -486,6 +503,8 @@ class AdminJobFilterParameter(BaseModel):
|
|
|
486
503
|
state: JobStates | None = Field(None, alias='State')
|
|
487
504
|
show_hidden: bool | None = Field(None, alias='ShowHidden')
|
|
488
505
|
parent_job_url: str | None = Field(None, alias='ParentJobUrl')
|
|
506
|
+
created_before: AwareDatetime | None = Field(None, alias='CreatedBefore')
|
|
507
|
+
created_after: AwareDatetime | None = Field(None, alias='CreatedAfter')
|
|
489
508
|
tags_by_and: List[str] | None = Field(None, alias='TagsByAnd')
|
|
490
509
|
tags_by_or: List[str] | None = Field(None, alias='TagsByOr')
|
|
491
510
|
user_url: str | None = Field(None, alias='UserUrl')
|
|
@@ -611,6 +630,8 @@ class JobFilterParameter(BaseModel):
|
|
|
611
630
|
name: str | None = Field(None, alias='Name')
|
|
612
631
|
show_hidden: bool | None = Field(None, alias='ShowHidden')
|
|
613
632
|
processing_step_url: str | None = Field(None, alias='ProcessingStepUrl')
|
|
633
|
+
created_before: AwareDatetime | None = Field(None, alias='CreatedBefore')
|
|
634
|
+
created_after: AwareDatetime | None = Field(None, alias='CreatedAfter')
|
|
614
635
|
tags_by_and: List[str] | None = Field(None, alias='TagsByAnd')
|
|
615
636
|
tags_by_or: List[str] | None = Field(None, alias='TagsByOr')
|
|
616
637
|
parent_job_url: str | None = Field(None, alias='ParentJobUrl')
|
|
@@ -40,6 +40,7 @@ from pinexq_client.job_management.model import (
|
|
|
40
40
|
from pinexq_client.job_management.tool.processing_step import ProcessingStep
|
|
41
41
|
from pinexq_client.job_management.tool.workdata import WorkData
|
|
42
42
|
|
|
43
|
+
|
|
43
44
|
class Job:
|
|
44
45
|
"""Convenience wrapper for handling JobHcos in the JobManagement-Api.
|
|
45
46
|
|
|
@@ -615,3 +616,12 @@ class Job:
|
|
|
615
616
|
|
|
616
617
|
def self_link(self) -> JobLink:
|
|
617
618
|
return self._job.self_link
|
|
619
|
+
|
|
620
|
+
def set_to_error_state(self) -> Self:
|
|
621
|
+
"""Set this job to error state.
|
|
622
|
+
|
|
623
|
+
Returns:
|
|
624
|
+
This `Job` object
|
|
625
|
+
"""
|
|
626
|
+
self._job.set_to_error_state_action.execute()
|
|
627
|
+
return self
|
{pinexq_client-0.4.2.20241009.1.dist-info → pinexq_client-0.5.0.20241018.1.dist-info}/METADATA
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: pinexq-client
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.5.0.20241018.1
|
|
4
4
|
Summary: A hypermedia-based client for the DataCybernetics PinexQ platform.
|
|
5
5
|
Author-Email: =?utf-8?q?Sebastian_H=C3=B6fer?= <hoefer@data-cybernetics.com>, Mathias Reichardt <reichardt@data-cybernetics.com>, Jasim Ahmed <ahmed@data-cybernetics.com>, Pratik Poudel <poudel@data-cybernetics.com>
|
|
6
6
|
Maintainer-Email: Mathias Reichardt <reichardt@data-cybernetics.com>, =?utf-8?q?Sebastian_H=C3=B6fer?= <hoefer@data-cybernetics.com>, Carsten Blank <blank@data-cybernetics.com>
|
{pinexq_client-0.4.2.20241009.1.dist-info → pinexq_client-0.5.0.20241018.1.dist-info}/RECORD
RENAMED
|
@@ -1,36 +1,36 @@
|
|
|
1
|
-
pinexq_client-0.
|
|
2
|
-
pinexq_client-0.
|
|
3
|
-
pinexq_client-0.
|
|
4
|
-
pinexq_client-0.
|
|
1
|
+
pinexq_client-0.5.0.20241018.1.dist-info/METADATA,sha256=iPZaVcmKxfXwSxywFo5dj9iyfOnBo_igmxoWRHo-PJU,3278
|
|
2
|
+
pinexq_client-0.5.0.20241018.1.dist-info/WHEEL,sha256=pM0IBB6ZwH3nkEPhtcp50KvKNX-07jYtnb1g1m6Z4Co,90
|
|
3
|
+
pinexq_client-0.5.0.20241018.1.dist-info/entry_points.txt,sha256=6OYgBcLyFCUgeqLgnvMyOJxPCWzgy7se4rLPKtNonMs,34
|
|
4
|
+
pinexq_client-0.5.0.20241018.1.dist-info/licenses/LICENSE,sha256=3oz3tAhM7kOgRukkRe7wmh5T_HihZY77ZtJDJm91ZN8,1072
|
|
5
5
|
pinexq_client/core/__init__.py,sha256=8SVD_PRgJtpUCOtVjdR6fRrv6KPNk7HD6UQrn0FKR04,235
|
|
6
6
|
pinexq_client/core/base_relations.py,sha256=oIUS58pkbMDdqm-3YOdsenhL1smtzeAk4fp7-U595MY,162
|
|
7
7
|
pinexq_client/core/enterapi.py,sha256=sL9TmF1L5LaDJnre1l_tiHDUo9vTbZ8cvPSov3Q1UTs,671
|
|
8
8
|
pinexq_client/core/exceptions.py,sha256=NqB3y1ufjOfG3kv7Rz4ppXqJRAugt2zlgxkto2nIVQU,2228
|
|
9
9
|
pinexq_client/core/hco/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
10
|
-
pinexq_client/core/hco/action_hco.py,sha256=
|
|
11
|
-
pinexq_client/core/hco/action_with_parameters_hco.py,sha256=
|
|
10
|
+
pinexq_client/core/hco/action_hco.py,sha256=6bWea-SkFjn52m5sYywkZeNOe74Nxmsvj338jSB6RZo,2338
|
|
11
|
+
pinexq_client/core/hco/action_with_parameters_hco.py,sha256=qvtoqTfDHddxB0ALanWXNDobSpazCmK2_ulTuvax2A4,3280
|
|
12
12
|
pinexq_client/core/hco/download_link_hco.py,sha256=_ijLtRfzy0qKG_QXpsWBZ8FJfp60o5Lw7QVv4_EpgPY,1335
|
|
13
13
|
pinexq_client/core/hco/hco_base.py,sha256=NglQuS6p1EimgtIx55G8ngBDGXc4lzyq08jsXzztE1I,3367
|
|
14
|
-
pinexq_client/core/hco/link_hco.py,sha256=
|
|
15
|
-
pinexq_client/core/hco/unavailable.py,sha256=
|
|
14
|
+
pinexq_client/core/hco/link_hco.py,sha256=LamrK6XyD6Gf_pl1tnNO_aIphPqcklPMjrxx8jx9HVw,2183
|
|
15
|
+
pinexq_client/core/hco/unavailable.py,sha256=CBJN_YnQRPPTwYr-3MIXQIgYXIDLw9ozIM2TNo0uewY,942
|
|
16
16
|
pinexq_client/core/hco/upload_action_hco.py,sha256=oOGw0Z_nx67CbqJ-QkQJbffdXajBgKmBAfSfFtyq8wk,4690
|
|
17
17
|
pinexq_client/core/http_headers.py,sha256=tY4h3DKVDMkjw9DLFn57HdEnwR1NAixMF8Yjgy3gjQY,183
|
|
18
18
|
pinexq_client/core/media_types.py,sha256=qU-Jd92H5HKczWDk51EstFHadO6A_QJL4lLXHRlfgjQ,600
|
|
19
19
|
pinexq_client/core/model/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
20
|
-
pinexq_client/core/model/error.py,sha256=
|
|
20
|
+
pinexq_client/core/model/error.py,sha256=MZHma9zCxcTCUp21KZeD22EXK0xhcrKWDQVTEk7WAn4,437
|
|
21
21
|
pinexq_client/core/model/sirenmodels.py,sha256=vGRQlhM2cSa2caxQel91Jr48KWqM-vMYX32iaQCzIds,5547
|
|
22
22
|
pinexq_client/core/polling.py,sha256=Z6VXn-PCGk4XX-4tQWZG59qJyCIS0eIrpPUORQDIGrs,1077
|
|
23
|
-
pinexq_client/core/sirenaccess.py,sha256=
|
|
24
|
-
pinexq_client/job_management/__init__.py,sha256=
|
|
23
|
+
pinexq_client/core/sirenaccess.py,sha256=moZQz2ujFsl8_WP_jfl8eM6lOzTHD6CK0dXBD8Wrg2g,6939
|
|
24
|
+
pinexq_client/job_management/__init__.py,sha256=kvOmgq1qw5ksPm9tbEg1p1XiiZRrwsdKBEgDR_qsk08,164
|
|
25
25
|
pinexq_client/job_management/enterjma.py,sha256=Ivl_jVPw_gaLyU5nKbywM-bbVGpn0MoCrZ0DMbJYf3s,1411
|
|
26
26
|
pinexq_client/job_management/hcos/__init__.py,sha256=vMIdxGHBsVcKYKrVkCzD4a_VaheKSNxCimospFn5N88,396
|
|
27
27
|
pinexq_client/job_management/hcos/entrypoint_hco.py,sha256=qodjAwO_MtawUuhmaYjhGXHV-uW1k94V9gKRYZRkhn4,2234
|
|
28
28
|
pinexq_client/job_management/hcos/info_hco.py,sha256=zWjR63SCEO_sUcZ9ha_aIoC_qUzAWLf50Xu4AHddAn8,1328
|
|
29
29
|
pinexq_client/job_management/hcos/input_dataslot_hco.py,sha256=SDflhyW8kjpcTUfKAXnJxNR-etPzAHfoTqlYUcJZrxs,3442
|
|
30
|
-
pinexq_client/job_management/hcos/job_hco.py,sha256=
|
|
30
|
+
pinexq_client/job_management/hcos/job_hco.py,sha256=CwF0eD07pd88iZPQUb_10iDtotiemy48BJ5exYN5gRc,8649
|
|
31
31
|
pinexq_client/job_management/hcos/job_query_result_hco.py,sha256=I0G8YIlYDhTahLz8n06L8BywlcsMGNWUEsmEr4Sk0GU,3315
|
|
32
32
|
pinexq_client/job_management/hcos/job_used_tags_hco.py,sha256=nys6E97NNXATdnvX6KZ46JR9qEb2lnqol9ZvJVEiNpQ,944
|
|
33
|
-
pinexq_client/job_management/hcos/jobsroot_hco.py,sha256=
|
|
33
|
+
pinexq_client/job_management/hcos/jobsroot_hco.py,sha256=_mHEw_gVvWDZ_LcD7T6zLajl-TrmS1x4ULrBk6AmknY,4637
|
|
34
34
|
pinexq_client/job_management/hcos/output_dataslot_hco.py,sha256=zxpo-fI9eHcp_pMKcf2l-gRoPHX1RzQO53auHMRB_T8,1549
|
|
35
35
|
pinexq_client/job_management/hcos/processing_step_hco.py,sha256=MykmFssysIc8fIUoPyNOLEGLGQNoC4zFgjIAIjf0v7U,5190
|
|
36
36
|
pinexq_client/job_management/hcos/processing_step_used_tags_hco.py,sha256=90-2IWlYTcYX62NzmAPnmcUCwMDhmMZyBrNs_G3yigs,1067
|
|
@@ -43,11 +43,11 @@ pinexq_client/job_management/hcos/workdata_used_tags_query_result_hco.py,sha256=
|
|
|
43
43
|
pinexq_client/job_management/hcos/workdataroot_hco.py,sha256=LdEPW2JJTqAWi-6zj-40lfREhthcDL6nPXQk_nfMtCA,3936
|
|
44
44
|
pinexq_client/job_management/known_relations.py,sha256=UlOF-sua8SyOPNNKzT_j6JVG8T-aewHIzn7S2ajXBhI,593
|
|
45
45
|
pinexq_client/job_management/model/__init__.py,sha256=ApHhNfjx4bPuz10sQnyBA2zajYbU7loDTZSKC5H_jBY,34
|
|
46
|
-
pinexq_client/job_management/model/open_api_generated.py,sha256
|
|
46
|
+
pinexq_client/job_management/model/open_api_generated.py,sha256=-7TWWzqSeaNld3w_a5sSQWAGZvqY6Oq5c-b_RkL9RrE,31137
|
|
47
47
|
pinexq_client/job_management/model/sirenentities.py,sha256=OInvxHpC6mnnYQjOMM2xAw7uLtvWwj9E2EQSRJe2jDo,3202
|
|
48
48
|
pinexq_client/job_management/tool/__init__.py,sha256=58CRDcP8ifSx9eA2uyTLEg0_fX3FUuNUogY_lirx9AY,96
|
|
49
|
-
pinexq_client/job_management/tool/job.py,sha256=
|
|
49
|
+
pinexq_client/job_management/tool/job.py,sha256=aUa03aZ8rYPJA1SPAbCmdYS65G1s2xIPC9kEhzEnw08,22427
|
|
50
50
|
pinexq_client/job_management/tool/job_group.py,sha256=4zW_SEbQMLVNqu_zLUP57epkypBbRc5gxjPLp_FZgZo,4515
|
|
51
51
|
pinexq_client/job_management/tool/processing_step.py,sha256=0qq64JOESPFAgpUpmM9hWndh21BnCB95EExd21ZHYOg,9730
|
|
52
52
|
pinexq_client/job_management/tool/workdata.py,sha256=8DwvzcjefKL-wBuCxy9ziaUC7gTf0TMXAa1WoCmHvZM,4903
|
|
53
|
-
pinexq_client-0.
|
|
53
|
+
pinexq_client-0.5.0.20241018.1.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|