|
1 | 1 | """Setup routes for admin app.""" |
2 | 2 |
|
| 3 | +import copy |
3 | 4 | from pathlib import Path |
4 | 5 |
|
5 | 6 | from aiohttp import web |
@@ -29,18 +30,26 @@ def setup_resources(admin: web.Application, schema: Schema) -> None: |
29 | 30 |
|
30 | 31 | repr_field = r.get("repr", m.primary_key) |
31 | 32 |
|
32 | | - for k, v in m.inputs.items(): |
33 | | - if k not in omit_fields: |
34 | | - v["props"]["alwaysOn"] = "alwaysOn" # Always display filter |
| 33 | + # Don't modify the resource. |
| 34 | + fields = copy.deepcopy(m.fields) |
| 35 | + inputs = copy.deepcopy(m.inputs) |
35 | 36 |
|
36 | | - inputs = m.inputs.copy() # Don't modify the resource. |
37 | 37 | for name, validators in r.get("validators", {}).items(): |
38 | 38 | if not all(v[0] in _VALIDATORS for v in validators): |
39 | 39 | raise ValueError(f"First value in validators must be one of {_VALIDATORS}") |
40 | 40 | inputs[name] = inputs[name].copy() |
41 | 41 | inputs[name]["validators"] = tuple(inputs[name]["validators"]) + tuple(validators) |
42 | 42 |
|
43 | | - state = {"fields": m.fields, "inputs": inputs, "list_omit": tuple(omit_fields), |
| 43 | + input_props = r.get("input_props", {}) |
| 44 | + for k, v in inputs.items(): |
| 45 | + if k not in omit_fields: |
| 46 | + v["props"]["alwaysOn"] = "alwaysOn" # Always display filter |
| 47 | + v["props"].update(input_props.get(k, {})) |
| 48 | + |
| 49 | + for name, props in r.get("field_props", {}).items(): |
| 50 | + fields[name]["props"].update(props) |
| 51 | + |
| 52 | + state = {"fields": fields, "inputs": inputs, "list_omit": tuple(omit_fields), |
44 | 53 | "repr": repr_field, "label": r.get("label"), "icon": r.get("icon"), |
45 | 54 | "bulk_update": r.get("bulk_update", {})} |
46 | 55 | admin["state"]["resources"][m.name] = state |
|
0 commit comments