|
4 | 4 |
|
5 | 5 | from labthings.server.quick import create_app |
6 | 6 | from labthings.server.view import View |
7 | | -from labthings.server.decorators import ( |
8 | | - ThingProperty, |
9 | | - PropertySchema, |
10 | | - use_args, |
11 | | -) |
| 7 | +from labthings.server.decorators import ThingProperty, PropertySchema, use_args |
12 | 8 |
|
13 | 9 | from labthings.server.types import value_to_field, data_dict_to_schema |
14 | 10 |
|
15 | 11 | from components.pdf_component import PdfComponent |
16 | 12 |
|
17 | 13 |
|
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 | | - |
| 14 | +def gen_property(property_object, property_name, name: str = None, readonly=False): |
31 | 15 |
|
32 | | -class BasePropertyResource(View): |
33 | | - def __init__(self): |
34 | | - super().__init__() |
35 | | - """ |
36 | | - Properties to be added by constructor function: |
37 | | - property_object: Object containing the property |
38 | | - property_name: String name of property of object |
39 | | - """ |
| 16 | + # Create a class name |
| 17 | + if not name: |
| 18 | + name = type(property_object).__name__ + f"_{property_name}" |
40 | 19 |
|
| 20 | + # Create inner functions |
41 | 21 | def _get(self): |
42 | | - return getattr(self.property_object, self.property_name) |
| 22 | + return getattr(property_object, property_name) |
43 | 23 |
|
44 | 24 | def _post(self, args): |
45 | | - setattr(self.property_object, self.property_name, args) |
46 | | - return getattr(self.property_object, self.property_name) |
| 25 | + setattr(property_object, property_name, args) |
| 26 | + return getattr(property_object, property_name) |
47 | 27 |
|
48 | 28 | 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 | | - |
54 | | - |
55 | | -def gen_property(property_object, property_name, name: str = None, post=True): |
56 | | - |
57 | | - # Create a class name |
58 | | - if not name: |
59 | | - name = type(property_object).__name__ + f"_{property_name}" |
| 29 | + getattr(property_object, property_name).update(args) |
| 30 | + return getattr(property_object, property_name) |
60 | 31 |
|
61 | 32 | # Generate a basic property class |
62 | 33 | generated_class = type( |
63 | 34 | name, |
64 | | - (BasePropertyResource, object), |
| 35 | + (View, object), |
65 | 36 | { |
66 | 37 | "property_object": property_object, |
67 | 38 | "property_name": property_name, |
68 | | - "get": copy_func(BasePropertyResource._get), |
| 39 | + "get": _get, |
69 | 40 | }, |
70 | 41 | ) |
71 | 42 |
|
72 | | - # Enable PUT requests for dictionaries |
73 | | - if type(getattr(property_object, property_name)) == dict: |
74 | | - generated_class.put = copy_func(BasePropertyResource._put) |
75 | | - |
76 | 43 | # Override read-write capabilities |
77 | | - if post: |
78 | | - generated_class.post = copy_func(BasePropertyResource._post) |
| 44 | + if not readonly: |
| 45 | + generated_class.post = _post |
| 46 | + # Enable PUT requests for dictionaries |
| 47 | + if type(getattr(property_object, property_name)) == dict: |
| 48 | + generated_class.put = _put |
79 | 49 |
|
80 | 50 | # Add decorators for arguments etc |
81 | 51 | initial_property_value = getattr(property_object, property_name) |
|
0 commit comments