Skip to content

Commit 60aa0ce

Browse files
committed
Handle missing broker/result backend errors
1 parent 3f4113e commit 60aa0ce

2 files changed

Lines changed: 32 additions & 2 deletions

File tree

fastapi_forge/dtos.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -330,6 +330,18 @@ def _validate_models(self) -> Self:
330330
msg = "Only one model can be an auth user."
331331
raise ValueError(msg)
332332

333+
if self.use_taskiq and not (self.use_redis and self.use_rabbitmq):
334+
missing = []
335+
if not self.use_rabbitmq:
336+
missing.append("RabbitMQ")
337+
if not self.use_redis:
338+
missing.append("Redis")
339+
340+
if missing:
341+
raise ValueError(
342+
"TaskIQ is enabled, but the following are missing and required "
343+
f"for its operation: {', '.join(missing)}."
344+
)
333345
return self
334346

335347
@model_validator(mode="after")

fastapi_forge/frontend/panels/project_config_panel.py

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ def __init__(self):
2222
super().__init__(value=True, elevated=False, bottom_corner=True)
2323
self._build()
2424
self._bind_state_to_ui()
25+
self._update_taskiq_state()
2526

2627
def _build(self) -> None:
2728
with (
@@ -83,13 +84,15 @@ def _build(self) -> None:
8384
self.use_rabbitmq = ui.checkbox(
8485
"RabbitMQ",
8586
value=state.use_rabbitmq,
87+
on_change=self._update_taskiq_state,
8688
).classes("w-full")
8789

8890
with ui.column().classes("w-full gap-2"):
8991
ui.label("Task Queues").classes("text-lg font-bold")
9092
self.use_taskiq = ui.checkbox(
9193
"Taskiq",
9294
value=state.use_taskiq,
95+
on_change=self._update_taskiq_state,
9396
).classes("w-full")
9497
self.use_celery = (
9598
ui.checkbox("Celery")
@@ -121,6 +124,7 @@ def _build(self) -> None:
121124
self.use_redis = ui.checkbox(
122125
"Redis",
123126
value=state.use_redis,
127+
on_change=self._update_taskiq_state,
124128
).classes("w-full")
125129

126130
with ui.column().classes("w-full gap-2"):
@@ -139,10 +143,24 @@ def _bind_state_to_ui(self) -> None:
139143
self.use_postgres.bind_value_to(state, "use_postgres")
140144
self.use_alembic.bind_value_to(state, "use_alembic")
141145
self.use_builtin_auth.bind_value_to(state, "use_builtin_auth")
142-
self.use_rabbitmq.bind_value_to(state, "use_rabbitmq")
143-
self.use_redis.bind_value_to(state, "use_redis")
146+
self.use_rabbitmq.bind_value_to(state, "use_rabbitmq").on(
147+
"change", self._update_taskiq_state
148+
)
149+
self.use_redis.bind_value_to(state, "use_redis").on(
150+
"change", self._update_taskiq_state
151+
)
144152
self.use_taskiq.bind_value_to(state, "use_taskiq")
145153

154+
def _update_taskiq_state(self, *_) -> None:
155+
"""Enable or disable Taskiq based on Redis and RabbitMQ."""
156+
self.use_taskiq.set_enabled(self.use_redis.value and self.use_rabbitmq.value)
157+
if (
158+
not (self.use_redis.value and self.use_rabbitmq.value)
159+
and self.use_taskiq.value
160+
):
161+
self.use_taskiq.value = False
162+
state.use_taskiq = False
163+
146164
def _handle_builtin_auth_change(self, event: ValueChangeEventArguments) -> None:
147165
"""Handle JWT Auth checkbox changes"""
148166
enabled = event.value

0 commit comments

Comments
 (0)