@@ -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
10483class 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