Timestamp: 2026-04-03T09:38:16.831Z
Environment: production

Emails are not enabled

ValueError:Emails are not enabled
mountaineer_auth/controllers/forgot_password_controller.py:87
82
83
84
85
86
87
88
89
90
91
92
        success: bool = False,
        config: AuthConfig = Depends(CoreDependencies.get_config_with_type(AuthConfig)),
    ) -> ForgotPasswordRender:
        # We require emails to support password resets
        if not config.AUTH_EMAIL_ENABLED:
            raise ValueError("Emails are not enabled")

        return ForgotPasswordRender(
            success=success,
            metadata=Metadata(
                title="Forgot Password",
mountaineer/app.py:514
509
510
511
512
513
514
515
516
517
518
519
            render_values = self._get_value_mask_for_signature(
                signature(node.controller.render), kwargs
            )
            server_data = node.controller.render(**render_values)
            if isawaitable(server_data):
                server_data = await server_data
            if server_data is None:
                server_data = RenderNull()
            render_overhead_by_controller[node.controller.__class__.__name__] = (
                monotonic_ns() - time
            )
fastapi/routing.py:212
207
208
209
210
211
212
213
214
215
216
217
    # Only called by get_request_handler. Has been split into its own function to
    # facilitate profiling endpoints, since inner functions are harder to profile.
    assert dependant.call is not None, "dependant.call must be a function"

    if is_coroutine:
        return await dependant.call(**values)
    else:
        return await run_in_threadpool(dependant.call, **values)


def get_request_handler(
fastapi/routing.py:301
296
297
298
299
300
301
302
303
304
305
306
                    async_exit_stack=async_exit_stack,
                    embed_body_fields=embed_body_fields,
                )
                errors = solved_result.errors
                if not errors:
                    raw_response = await run_endpoint_function(
                        dependant=dependant,
                        values=solved_result.values,
                        is_coroutine=is_coroutine,
                    )
                    if isinstance(raw_response, Response):
starlette/routing.py:73
68
69
70
71
72
73
74
75
76
77
78
    async def app(scope: Scope, receive: Receive, send: Send) -> None:
        request = Request(scope, receive, send)

        async def app(scope: Scope, receive: Receive, send: Send) -> None:
            response = await f(request)
            await response(scope, receive, send)

        await wrap_app_handling_exceptions(app, request)(scope, receive, send)

    return app
starlette/_exception_handler.py:42
37
38
39
40
41
42
43
44
45
46
47
            if message["type"] == "http.response.start":
                response_started = True
            await send(message)

        try:
            await app(scope, receive, sender)
        except Exception as exc:
            handler = None

            if isinstance(exc, HTTPException):
                handler = status_handlers.get(exc.status_code)
starlette/_exception_handler.py:53
48
49
50
51
52
53
54
55
56
57
58
            if handler is None:
                handler = _lookup_exception_handler(exception_handlers, exc)

            if handler is None:
                raise exc

            if response_started:
                raise RuntimeError("Caught handled exception, but response already started.") from exc

            if is_async_callable(handler):
starlette/routing.py:76
71
72
73
74
75
76
77
78
79
80
81
        async def app(scope: Scope, receive: Receive, send: Send) -> None:
            response = await f(request)
            await response(scope, receive, send)

        await wrap_app_handling_exceptions(app, request)(scope, receive, send)

    return app


def websocket_session(
starlette/routing.py:288
283
284
285
286
287
288
289
290
291
292
293
                raise HTTPException(status_code=405, headers=headers)
            else:
                response = PlainTextResponse("Method Not Allowed", status_code=405, headers=headers)
            await response(scope, receive, send)
        else:
            await self.app(scope, receive, send)

    def __eq__(self, other: typing.Any) -> bool:
        return (
            isinstance(other, Route)
            and self.path == other.path
starlette/routing.py:734
729
730
731
732
733
734
735
736
737
738
739
            # Determine if any route matches the incoming scope,
            # and hand over to the matching route if found.
            match, child_scope = route.matches(scope)
            if match == Match.FULL:
                scope.update(child_scope)
                await route.handle(scope, receive, send)
                return
            elif match == Match.PARTIAL and partial is None:
                partial = route
                partial_scope = child_scope
starlette/routing.py:714
709
710
711
712
713
714
715
716
717
718
719
    async def __call__(self, scope: Scope, receive: Receive, send: Send) -> None:
        """
        The main entry point to the Router class.
        """
        await self.middleware_stack(scope, receive, send)

    async def app(self, scope: Scope, receive: Receive, send: Send) -> None:
        assert scope["type"] in ("http", "websocket", "lifespan")

        if "router" not in scope:
starlette/_exception_handler.py:42
37
38
39
40
41
42
43
44
45
46
47
            if message["type"] == "http.response.start":
                response_started = True
            await send(message)

        try:
            await app(scope, receive, sender)
        except Exception as exc:
            handler = None

            if isinstance(exc, HTTPException):
                handler = status_handlers.get(exc.status_code)
starlette/_exception_handler.py:53
48
49
50
51
52
53
54
55
56
57
58
            if handler is None:
                handler = _lookup_exception_handler(exception_handlers, exc)

            if handler is None:
                raise exc

            if response_started:
                raise RuntimeError("Caught handled exception, but response already started.") from exc

            if is_async_callable(handler):
starlette/middleware/exceptions.py:62
57
58
59
60
61
62
63
64
65
66
67
        if scope["type"] == "http":
            conn = Request(scope, receive, send)
        else:
            conn = WebSocket(scope, receive, send)

        await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send)

    def http_exception(self, request: Request, exc: Exception) -> Response:
        assert isinstance(exc, HTTPException)
        if exc.status_code in {204, 304}:
            return Response(status_code=exc.status_code, headers=exc.headers)
starlette/middleware/base.py:141
136
137
138
139
140
141
142
143
144
145
146
            async def coro() -> None:
                nonlocal app_exc

                with send_stream:
                    try:
                        await self.app(scope, receive_or_disconnect, send_no_error)
                    except Exception as exc:
                        app_exc = exc

            task_group.start_soon(coro)
starlette/middleware/base.py:156
151
152
153
154
155
156
157
158
159
160
161
                    message = await recv_stream.receive()
            except anyio.EndOfStream:
                if app_exc is not None:
                    nonlocal exception_already_raised
                    exception_already_raised = True
                    raise app_exc
                raise RuntimeError("No response returned.")

            assert message["type"] == "http.response.start"

            async def body_stream() -> typing.AsyncGenerator[bytes, None]:
monkeydo/middleware/theme.py:45
40
41
42
43
44
45
46
47
48
49
50
        self.config = config

    async def dispatch(
        self, request: Request, call_next: RequestResponseEndpoint
    ) -> Response:
        response = await call_next(request)

        # Only process HTML page requests, not API calls or static files
        content_type = response.headers.get("content-type", "")
        if "text/html" not in content_type:
            return response
starlette/middleware/base.py:178
173
174
175
176
177
178
179
180
181
182
183
        streams: anyio.create_memory_object_stream[Message] = anyio.create_memory_object_stream()
        send_stream, recv_stream = streams
        with recv_stream, send_stream, collapse_excgroups():
            async with anyio.create_task_group() as task_group:
                response = await self.dispatch_func(request, call_next)
                await response(scope, wrapped_receive, send)
                response_sent.set()
                recv_stream.close()
        if app_exc is not None and not exception_already_raised:
            raise app_exc
starlette/_utils.py:82
77
78
79
80
81
82
83
84
85
86
87
    except BaseException as exc:
        if has_exceptiongroups:  # pragma: no cover
            while isinstance(exc, BaseExceptionGroup) and len(exc.exceptions) == 1:
                exc = exc.exceptions[0]

        raise exc


def get_route_path(scope: Scope) -> str:
    path: str = scope["path"]
    root_path = scope.get("root_path", "")
contextlib.py:158
153
154
155
156
157
158
159
160
161
162
163
            if value is None:
                # Need to force instantiation so we can reliably
                # tell if we get the same exception back
                value = typ()
            try:
                self.gen.throw(value)
            except StopIteration as exc:
                # Suppress StopIteration *unless* it's the same exception that
                # was passed to throw().  This prevents a StopIteration
                # raised inside the "with" statement from being suppressed.
                return exc is not value
starlette/middleware/base.py:176
171
172
173
174
175
176
177
178
179
180
181
            response.raw_headers = message["headers"]
            return response

        streams: anyio.create_memory_object_stream[Message] = anyio.create_memory_object_stream()
        send_stream, recv_stream = streams
        with recv_stream, send_stream, collapse_excgroups():
            async with anyio.create_task_group() as task_group:
                response = await self.dispatch_func(request, call_next)
                await response(scope, wrapped_receive, send)
                response_sent.set()
                recv_stream.close()
starlette/middleware/errors.py:165
160
161
162
163
164
165
166
167
168
169
170
            if message["type"] == "http.response.start":
                response_started = True
            await send(message)

        try:
            await self.app(scope, receive, _send)
        except Exception as exc:
            request = Request(scope)
            if self.debug:
                # In debug mode, return traceback responses.
                response = self.debug_response(request, exc)