Skip to content

Commit 3f4a6b5

Browse files
committed
Refactor config_flow to share schema between create and edit flows
Extracted the duplicated data schema into a shared build_schema() function that is used by both the initial setup flow and the options flow. Benefits: - Eliminates ~90 lines of duplicated code - Single source of truth for the configuration schema - Easier to maintain and modify in the future - Reduces risk of inconsistencies between flows The build_schema() function takes a dictionary of defaults and returns a vol.Schema with all the configuration fields properly configured.
1 parent e1a0779 commit 3f4a6b5

File tree

1 file changed

+98
-143
lines changed

1 file changed

+98
-143
lines changed

custom_components/monta/config_flow.py

Lines changed: 98 additions & 143 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,74 @@
3030
)
3131

3232

33+
def build_schema(defaults: dict) -> vol.Schema:
34+
"""Build the configuration schema with provided defaults."""
35+
return vol.Schema(
36+
{
37+
vol.Required(
38+
CONF_CLIENT_ID,
39+
default=defaults.get(CONF_CLIENT_ID),
40+
): selector.TextSelector(
41+
selector.TextSelectorConfig(
42+
type=selector.TextSelectorType.TEXT
43+
),
44+
),
45+
vol.Required(
46+
CONF_CLIENT_SECRET,
47+
default=defaults.get(CONF_CLIENT_SECRET),
48+
): selector.TextSelector(
49+
selector.TextSelectorConfig(
50+
type=selector.TextSelectorType.PASSWORD
51+
),
52+
),
53+
vol.Optional(
54+
CONF_SCAN_INTERVAL,
55+
default=defaults.get(CONF_SCAN_INTERVAL, DEFAULT_SCAN_INTERVAL),
56+
): selector.NumberSelector(
57+
selector.NumberSelectorConfig(
58+
min=30,
59+
max=3600,
60+
unit_of_measurement="seconds",
61+
mode=selector.NumberSelectorMode.BOX,
62+
),
63+
),
64+
vol.Optional(
65+
CONF_SCAN_INTERVAL_CHARGE_POINTS,
66+
default=defaults.get(CONF_SCAN_INTERVAL_CHARGE_POINTS, DEFAULT_SCAN_INTERVAL_CHARGE_POINTS),
67+
): selector.NumberSelector(
68+
selector.NumberSelectorConfig(
69+
min=30,
70+
max=3600,
71+
unit_of_measurement="seconds",
72+
mode=selector.NumberSelectorMode.BOX,
73+
),
74+
),
75+
vol.Optional(
76+
CONF_SCAN_INTERVAL_WALLET,
77+
default=defaults.get(CONF_SCAN_INTERVAL_WALLET, DEFAULT_SCAN_INTERVAL_WALLET),
78+
): selector.NumberSelector(
79+
selector.NumberSelectorConfig(
80+
min=30,
81+
max=7200,
82+
unit_of_measurement="seconds",
83+
mode=selector.NumberSelectorMode.BOX,
84+
),
85+
),
86+
vol.Optional(
87+
CONF_SCAN_INTERVAL_TRANSACTIONS,
88+
default=defaults.get(CONF_SCAN_INTERVAL_TRANSACTIONS, DEFAULT_SCAN_INTERVAL_TRANSACTIONS),
89+
): selector.NumberSelector(
90+
selector.NumberSelectorConfig(
91+
min=30,
92+
max=7200,
93+
unit_of_measurement="seconds",
94+
mode=selector.NumberSelectorMode.BOX,
95+
),
96+
),
97+
}
98+
)
99+
100+
33101
class MontaFlowHandler(config_entries.ConfigFlow, domain=DOMAIN):
34102
"""Config flow for Monta."""
35103

@@ -64,67 +132,7 @@ async def async_step_user(
64132

65133
return self.async_show_form(
66134
step_id="user",
67-
data_schema=vol.Schema(
68-
{
69-
vol.Required(
70-
CONF_CLIENT_ID,
71-
default=(user_input or {}).get(CONF_CLIENT_ID),
72-
): selector.TextSelector(
73-
selector.TextSelectorConfig(
74-
type=selector.TextSelectorType.TEXT
75-
),
76-
),
77-
vol.Required(CONF_CLIENT_SECRET): selector.TextSelector(
78-
selector.TextSelectorConfig(
79-
type=selector.TextSelectorType.PASSWORD
80-
),
81-
),
82-
vol.Optional(
83-
CONF_SCAN_INTERVAL,
84-
default=(user_input or {}).get(CONF_SCAN_INTERVAL, DEFAULT_SCAN_INTERVAL),
85-
): selector.NumberSelector(
86-
selector.NumberSelectorConfig(
87-
min=30,
88-
max=3600,
89-
unit_of_measurement="seconds",
90-
mode=selector.NumberSelectorMode.BOX,
91-
),
92-
),
93-
vol.Optional(
94-
CONF_SCAN_INTERVAL_CHARGE_POINTS,
95-
default=(user_input or {}).get(CONF_SCAN_INTERVAL_CHARGE_POINTS, DEFAULT_SCAN_INTERVAL_CHARGE_POINTS),
96-
): selector.NumberSelector(
97-
selector.NumberSelectorConfig(
98-
min=30,
99-
max=3600,
100-
unit_of_measurement="seconds",
101-
mode=selector.NumberSelectorMode.BOX,
102-
),
103-
),
104-
vol.Optional(
105-
CONF_SCAN_INTERVAL_WALLET,
106-
default=(user_input or {}).get(CONF_SCAN_INTERVAL_WALLET, DEFAULT_SCAN_INTERVAL_WALLET),
107-
): selector.NumberSelector(
108-
selector.NumberSelectorConfig(
109-
min=30,
110-
max=7200,
111-
unit_of_measurement="seconds",
112-
mode=selector.NumberSelectorMode.BOX,
113-
),
114-
),
115-
vol.Optional(
116-
CONF_SCAN_INTERVAL_TRANSACTIONS,
117-
default=(user_input or {}).get(CONF_SCAN_INTERVAL_TRANSACTIONS, DEFAULT_SCAN_INTERVAL_TRANSACTIONS),
118-
): selector.NumberSelector(
119-
selector.NumberSelectorConfig(
120-
min=30,
121-
max=7200,
122-
unit_of_measurement="seconds",
123-
mode=selector.NumberSelectorMode.BOX,
124-
),
125-
),
126-
}
127-
),
135+
data_schema=build_schema(user_input or {}),
128136
errors=_errors,
129137
)
130138

@@ -198,90 +206,37 @@ async def async_step_init(
198206
)
199207
return self.async_create_entry(title="", data=user_input)
200208

209+
# Build defaults from user_input -> options -> data
210+
defaults = {
211+
CONF_CLIENT_ID: (user_input or {}).get(
212+
CONF_CLIENT_ID,
213+
self.config_entry.data.get(CONF_CLIENT_ID),
214+
),
215+
CONF_CLIENT_SECRET: (user_input or {}).get(
216+
CONF_CLIENT_SECRET,
217+
self.config_entry.data.get(CONF_CLIENT_SECRET),
218+
),
219+
CONF_SCAN_INTERVAL: self.config_entry.options.get(
220+
CONF_SCAN_INTERVAL,
221+
self.config_entry.data.get(CONF_SCAN_INTERVAL, DEFAULT_SCAN_INTERVAL),
222+
),
223+
CONF_SCAN_INTERVAL_CHARGE_POINTS: self.config_entry.options.get(
224+
CONF_SCAN_INTERVAL_CHARGE_POINTS,
225+
self.config_entry.data.get(CONF_SCAN_INTERVAL_CHARGE_POINTS, DEFAULT_SCAN_INTERVAL_CHARGE_POINTS),
226+
),
227+
CONF_SCAN_INTERVAL_WALLET: self.config_entry.options.get(
228+
CONF_SCAN_INTERVAL_WALLET,
229+
self.config_entry.data.get(CONF_SCAN_INTERVAL_WALLET, DEFAULT_SCAN_INTERVAL_WALLET),
230+
),
231+
CONF_SCAN_INTERVAL_TRANSACTIONS: self.config_entry.options.get(
232+
CONF_SCAN_INTERVAL_TRANSACTIONS,
233+
self.config_entry.data.get(CONF_SCAN_INTERVAL_TRANSACTIONS, DEFAULT_SCAN_INTERVAL_TRANSACTIONS),
234+
),
235+
}
236+
201237
return self.async_show_form(
202238
step_id="init",
203-
data_schema=vol.Schema(
204-
{
205-
vol.Required(
206-
CONF_CLIENT_ID,
207-
default=(user_input or {}).get(
208-
CONF_CLIENT_ID,
209-
self.config_entry.data.get(CONF_CLIENT_ID),
210-
),
211-
): selector.TextSelector(
212-
selector.TextSelectorConfig(
213-
type=selector.TextSelectorType.TEXT
214-
),
215-
),
216-
vol.Required(
217-
CONF_CLIENT_SECRET,
218-
default=(user_input or {}).get(
219-
CONF_CLIENT_SECRET,
220-
self.config_entry.data.get(CONF_CLIENT_SECRET),
221-
),
222-
): selector.TextSelector(
223-
selector.TextSelectorConfig(
224-
type=selector.TextSelectorType.PASSWORD
225-
),
226-
),
227-
vol.Optional(
228-
CONF_SCAN_INTERVAL,
229-
default=self.config_entry.options.get(
230-
CONF_SCAN_INTERVAL,
231-
self.config_entry.data.get(CONF_SCAN_INTERVAL, DEFAULT_SCAN_INTERVAL),
232-
),
233-
): selector.NumberSelector(
234-
selector.NumberSelectorConfig(
235-
min=30,
236-
max=3600,
237-
unit_of_measurement="seconds",
238-
mode=selector.NumberSelectorMode.BOX,
239-
),
240-
),
241-
vol.Optional(
242-
CONF_SCAN_INTERVAL_CHARGE_POINTS,
243-
default=self.config_entry.options.get(
244-
CONF_SCAN_INTERVAL_CHARGE_POINTS,
245-
self.config_entry.data.get(CONF_SCAN_INTERVAL_CHARGE_POINTS, DEFAULT_SCAN_INTERVAL_CHARGE_POINTS),
246-
),
247-
): selector.NumberSelector(
248-
selector.NumberSelectorConfig(
249-
min=30,
250-
max=3600,
251-
unit_of_measurement="seconds",
252-
mode=selector.NumberSelectorMode.BOX,
253-
),
254-
),
255-
vol.Optional(
256-
CONF_SCAN_INTERVAL_WALLET,
257-
default=self.config_entry.options.get(
258-
CONF_SCAN_INTERVAL_WALLET,
259-
self.config_entry.data.get(CONF_SCAN_INTERVAL_WALLET, DEFAULT_SCAN_INTERVAL_WALLET),
260-
),
261-
): selector.NumberSelector(
262-
selector.NumberSelectorConfig(
263-
min=30,
264-
max=7200,
265-
unit_of_measurement="seconds",
266-
mode=selector.NumberSelectorMode.BOX,
267-
),
268-
),
269-
vol.Optional(
270-
CONF_SCAN_INTERVAL_TRANSACTIONS,
271-
default=self.config_entry.options.get(
272-
CONF_SCAN_INTERVAL_TRANSACTIONS,
273-
self.config_entry.data.get(CONF_SCAN_INTERVAL_TRANSACTIONS, DEFAULT_SCAN_INTERVAL_TRANSACTIONS),
274-
),
275-
): selector.NumberSelector(
276-
selector.NumberSelectorConfig(
277-
min=30,
278-
max=7200,
279-
unit_of_measurement="seconds",
280-
mode=selector.NumberSelectorMode.BOX,
281-
),
282-
),
283-
}
284-
),
239+
data_schema=build_schema(defaults),
285240
errors=_errors,
286241
)
287242

0 commit comments

Comments
 (0)