|
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