Skip to content

Commit ed4ef9d

Browse files
author
Joel Collins
committed
Improved Action schema and removed old Task schema
1 parent 4e9c120 commit ed4ef9d

File tree

1 file changed

+23
-66
lines changed

1 file changed

+23
-66
lines changed

src/labthings/schema.py

Lines changed: 23 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -63,61 +63,36 @@ def dump(self, value):
6363
"""
6464
return self.serialize(value)
6565

66-
67-
class TaskSchema(Schema):
68-
"""Legacy schema for background actions. Will eventually be replaced by ActionSchema,"""
69-
70-
_ID = fields.String(data_key="id")
71-
target_string = fields.String(data_key="function")
72-
_status = fields.String(data_key="status")
73-
progress = fields.String()
74-
data = fields.Raw()
75-
_return_value = fields.Raw(data_key="return")
76-
_start_time = fields.DateTime(data_key="start_time")
77-
_end_time = fields.DateTime(data_key="end_time")
78-
log = fields.List(fields.Dict())
79-
80-
links = fields.Dict()
66+
class LogRecordSchema(Schema):
67+
name = fields.String()
68+
message = fields.String()
69+
levelname = fields.String()
70+
levelno = fields.Integer()
71+
lineno = fields.Integer()
72+
filename = fields.String()
73+
created = fields.DateTime()
8174

8275
@pre_dump
83-
def generate_links(self, data, **kwargs):
84-
"""
85-
86-
:param data:
87-
:param **kwargs:
88-
89-
"""
90-
try:
91-
url = url_for(TASK_ENDPOINT, task_id=data.id, _external=True)
92-
except BuildError:
93-
url = None
94-
data.links = {
95-
"self": {
96-
"href": url,
97-
"mimetype": "application/json",
98-
**description_from_view(view_class_from_endpoint(TASK_ENDPOINT)),
99-
}
100-
}
76+
def preprocess(self, data, **kwargs):
77+
data.message = data.getMessage()
78+
if not isinstance(data.created, datetime):
79+
data.created = datetime.fromtimestamp(data.created)
10180
return data
10281

10382

10483
class ActionSchema(Schema):
10584
""" """
10685

10786
_ID = fields.String(data_key="id")
108-
_status = fields.String(data_key="status")
109-
progress = fields.String()
87+
_status = fields.String(
88+
data_key="status",
89+
OneOf=["pending", "running", "completed", "cancelled", "error"],
90+
)
91+
progress = fields.Integer()
11092
data = fields.Raw()
111-
# _return_value = fields.Raw(data_key="output")
11293
_request_time = fields.DateTime(data_key="timeRequested")
11394
_end_time = fields.DateTime(data_key="timeCompleted")
114-
# TODO: Make a proper log schema
115-
log = fields.List(fields.Dict())
116-
117-
# Dump unformatted input and output
118-
# Function-level marshal_with will handle formatting
119-
output = fields.Field()
120-
input = fields.Field()
95+
log = fields.List(fields.Nested(LogRecordSchema()))
12196

12297
href = fields.String()
12398
links = fields.Dict()
@@ -165,22 +140,21 @@ def build_action_schema(output_schema: Schema, input_schema: Schema, name: str =
165140
if not name.endswith("Action"):
166141
name = f"{name}Action"
167142

168-
class_attrs = {"output": None, "input": None}
143+
class_attrs = {}
169144

170145
for key, schema in {"output": output_schema, "input": input_schema}.items():
171-
146+
# If no schema is given, move on
147+
if schema is None:
148+
pass
172149
# If a real schema, nest it
173-
if isinstance(schema, Schema):
150+
elif isinstance(schema, Schema):
174151
class_attrs[key] = fields.Nested(schema)
175152
# If a dictionary schema, build a real schema then nest it
176153
elif isinstance(schema, Mapping):
177154
class_attrs[key] = fields.Nested(Schema.from_dict(schema))
178155
# If a single field, set it as the output Field, and override its data_key
179156
elif isinstance(schema, fields.Field):
180157
class_attrs[key] = schema
181-
# Otherwise allow any
182-
elif schema is None:
183-
class_attrs[key] = fields.Raw()
184158
else:
185159
raise TypeError(
186160
f"Unsupported schema type {schema}. "
@@ -239,20 +213,3 @@ def generate_links(self, data, **kwargs):
239213
data.links = d
240214

241215
return data
242-
243-
244-
class LogRecordSchema(Schema):
245-
name = fields.String()
246-
message = fields.String()
247-
levelname = fields.String()
248-
levelno = fields.Integer()
249-
lineno = fields.Integer()
250-
filename = fields.String()
251-
created = fields.DateTime()
252-
253-
@pre_dump
254-
def preprocess(self, data, **kwargs):
255-
data.message = data.getMessage()
256-
if not isinstance(data.created, datetime):
257-
data.created = datetime.fromtimestamp(data.created)
258-
return data

0 commit comments

Comments
 (0)