1
1
import uuid
2
+ import types
3
+ import functools
2
4
3
5
from labthings .server .quick import create_app
4
6
from labthings .server .view import View
8
10
use_args ,
9
11
)
10
12
11
- from labthings .server .types import value_to_field
13
+ from labthings .server .types import value_to_field , data_dict_to_schema
12
14
13
15
from components .pdf_component import PdfComponent
14
16
15
17
18
+ def copy_func (f ):
19
+ """Based on http://stackoverflow.com/a/6528148/190597 (Glenn Maynard)"""
20
+ g = types .FunctionType (
21
+ f .__code__ ,
22
+ f .__globals__ ,
23
+ name = f .__name__ ,
24
+ argdefs = f .__defaults__ ,
25
+ closure = f .__closure__ ,
26
+ )
27
+ g = functools .update_wrapper (g , f )
28
+ g .__kwdefaults__ = f .__kwdefaults__
29
+ return g
30
+
31
+
16
32
class BasePropertyResource (View ):
17
33
def __init__ (self ):
18
34
super ().__init__ ()
@@ -22,13 +38,19 @@ def __init__(self):
22
38
property_name: String name of property of object
23
39
"""
24
40
25
- def get (self ):
41
+ def _get (self ):
26
42
return getattr (self .property_object , self .property_name )
27
43
28
- def post (self , args ):
44
+ def _post (self , args ):
29
45
setattr (self .property_object , self .property_name , args )
30
46
return getattr (self .property_object , self .property_name )
31
47
48
+ def _put (self , args ):
49
+ if type (getattr (self .property_object , self .property_name )) != dict :
50
+ raise TypeError ("Cannot PUT to a property that isn't an object/dictionary" )
51
+ getattr (self .property_object , self .property_name ).update (args )
52
+ return getattr (self .property_object , self .property_name )
53
+
32
54
33
55
def gen_property (property_object , property_name , name : str = None , post = True ):
34
56
@@ -40,18 +62,29 @@ def gen_property(property_object, property_name, name: str = None, post=True):
40
62
generated_class = type (
41
63
name ,
42
64
(BasePropertyResource , object ),
43
- {"property_object" : property_object , "property_name" : property_name ,},
65
+ {
66
+ "property_object" : property_object ,
67
+ "property_name" : property_name ,
68
+ "get" : copy_func (BasePropertyResource ._get ),
69
+ },
44
70
)
45
71
72
+ # Enable PUT requests for dictionaries
73
+ if type (getattr (property_object , property_name )) == dict :
74
+ generated_class .put = copy_func (BasePropertyResource ._put )
75
+
46
76
# Override read-write capabilities
47
- if not post :
48
- generated_class .post = None
77
+ if post :
78
+ generated_class .post = copy_func ( BasePropertyResource . _post )
49
79
50
80
# Add decorators for arguments etc
51
81
initial_property_value = getattr (property_object , property_name )
52
- generated_class = PropertySchema (value_to_field (initial_property_value ))(
53
- generated_class
54
- )
82
+ if type (initial_property_value ) == dict :
83
+ property_schema = data_dict_to_schema (initial_property_value )
84
+ else :
85
+ property_schema = value_to_field (initial_property_value )
86
+
87
+ generated_class = PropertySchema (property_schema )(generated_class )
55
88
generated_class = ThingProperty (generated_class )
56
89
57
90
return generated_class
@@ -72,7 +105,8 @@ def gen_property(property_object, property_name, name: str = None, post=True):
72
105
73
106
# Add routes for the API views we created
74
107
labthing .add_view (gen_property (my_component , "magic_denoise" ), "/denoise" )
108
+ labthing .add_view (gen_property (my_component , "magic_dictionary" ), "/dictionary" )
75
109
76
110
# Start the app
77
- if __name__ == "__main__" :
78
- app .run (host = "0.0.0.0" , port = "5000" , threaded = True , debug = True , use_reloader = False )
111
+ # if __name__ == "__main__":
112
+ # app.run(host="0.0.0.0", port="5000", threaded=True, debug=True, use_reloader=False)
0 commit comments