Skip to content

Views and path for communal election/vote archived results#2460

Open
Tschuppi81 wants to merge 64 commits into
masterfrom
feature/ogc-3103-wab-communal-elections
Open

Views and path for communal election/vote archived results#2460
Tschuppi81 wants to merge 64 commits into
masterfrom
feature/ogc-3103-wab-communal-elections

Conversation

@Tschuppi81
Copy link
Copy Markdown
Contributor

@Tschuppi81 Tschuppi81 commented May 1, 2026

ElectionDay: Adds path and views for municipality results

TYPE: Feature
LINK: ogc-3103

treinhard and others added 21 commits March 13, 2026 10:52
Return proper errors in JSON for 401 and 500 errors.

TYPE: Feature
Replaces existing pre release support.

TYPE: Feature
HINT: New version of xsdata-ech required, run `make update`
Required for large eCH 0252 XML files.
Deleting all elections on the same date that are not in the current
eCH 0252 delivery is to aggressive. Remove only elections in the
same ElectionCompound.

TYPE: Feature
@linear
Copy link
Copy Markdown

linear Bot commented May 1, 2026

@codecov
Copy link
Copy Markdown

codecov Bot commented May 1, 2026

❌ 12 Tests Failed:

Tests completed Failed Passed Skipped
1560 12 1548 16
View the top 3 failed test(s) by shortest run time
tests/onegov/swissvotes/test_views_auth.py::test_view_login_logout
Stack Traces | 0.923s run time
swissvotes_app = <tests.onegov.swissvotes.conftest.TestApp object at 0x7f107d8aa0d0>

    def test_view_login_logout(swissvotes_app: TestApp) -> None:
        client = Client(swissvotes_app)
>       client.get('/locale/de_CH').follow()
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^

.../onegov/swissvotes/test_views_auth.py:29: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.........................................................................../app/lib/python3.14....../site-packages/webtest/app.py:328: in get
    return self.do_request(req, status=status,
tests/shared/client.py:159: in do_request
    return self.extend_response(super().do_request(*args, **kwargs))
                                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.........................................................................../app/lib/python3.14....../site-packages/webtest/app.py:627: in do_request
    res = req.get_response(app, catch_exc_info=True)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.........................................................................../app/lib/python3.14....../site-packages/webob/request.py:1309: in send
    status, headers, app_iter, exc_info = self.call_application(
.........................................................................../app/lib/python3.14....../site-packages/webob/request.py:1278: in call_application
    app_iter = application(self.environ, start_response)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.........................................................................../app/lib/python3.14.../site-packages/webtest/lint.py:196: in lint_app
    iterator = application(environ, start_response_wrapper)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.../onegov/core/framework.py:219: in with_request_cache_wrapper
    return fn(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^
.../onegov/core/framework.py:234: in with_print_exceptions_wrapper
    return fn(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^
.........................................................................../app/lib/python3.14.../site-packages/morepath/app.py:138: in __call__
    response = self.publish(request)
               ^^^^^^^^^^^^^^^^^^^^^
.........................................................................../app/lib/python3.14.../site-packages/morepath/core.py:201: in poisoned_host_header_protection_tween
    return handler(request)
           ^^^^^^^^^^^^^^^^
.../onegov/core/framework.py:1765: in http_conflict_tween
    return handler(request)
           ^^^^^^^^^^^^^^^^
.../onegov/core/framework.py:1790: in activate_session_manager
    return handler(request)
           ^^^^^^^^^^^^^^^^
.../onegov/core/framework.py:1808: in close_session_after_request
    return handler(request)
           ^^^^^^^^^^^^^^^^
.../onegov/file/integration.py:477: in configure_depot_tween
    return handler(request)
           ^^^^^^^^^^^^^^^^
.........................................................................../app/lib/python3.14.../more/transaction/main.py:53: in transaction_tween
    userid = request.identity.userid
             ^^^^^^^^^^^^^^^^
.........................................................................../app/lib/python3.14.../site-packages/morepath/reify.py:44: in __get__
    val = self.wrapped(inst)
          ^^^^^^^^^^^^^^^^^^
.........................................................................../app/lib/python3.14.../site-packages/morepath/request.py:85: in identity
    result = self.app._identify(self)
             ^^^^^^^^^^^^^^^^^^^^^^^^
.../core/security/identity_policy.py:24: in identify
    key: request.browser_session[key] for key in self.required_keys
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.../onegov/core/browser_session.py:191: in __getitem__
    result = self._get(name)
             ^^^^^^^^^^^^^^^
.../onegov/core/browser_session.py:124: in _get
    return self._cache.get(name)
           ^^^^^^^^^^^^^^^^^^^^^
.../onegov/core/browser_session.py:34: in get
    return self.cache.get(self.mangle(key))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.........................................................................../app/lib/python3.14.../dogpile/cache/region.py:783: in get
    value = self._get_cache_value(key, expiration_time, ignore_expiration)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.........................................................................../app/lib/python3.14.../dogpile/cache/region.py:821: in _get_cache_value
    value = self._get_from_backend(key)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^
.........................................................................../app/lib/python3.14.../dogpile/cache/region.py:1325: in _get_from_backend
    self.backend.get_serialized(key)
.........................................................................../app/lib/python3.14.../cache/backends/redis.py:262: in get_serialized
    value = self.reader_client.get(key)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^
.........................................................................../app/lib/python3.14.../redis/commands/core.py:3194: in get
    return self.execute_command("GET", name, keys=[name])
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.........................................................................../app/lib/python3.14.............../site-packages/redis/client.py:787: in execute_command
    return self._execute_command(*args, **options)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.........................................................................../app/lib/python3.14.............../site-packages/redis/client.py:809: in _execute_command
    result = conn.retry.call_with_retry(
.........................................................................../app/lib/python3.14....../site-packages/redis/retry.py:132: in call_with_retry
    raise error
.........................................................................../app/lib/python3.14....../site-packages/redis/retry.py:120: in call_with_retry
    return do()
           ^^^^
.........................................................................../app/lib/python3.14.............../site-packages/redis/client.py:810: in <lambda>
    lambda: self._send_command_parse_response(
.........................................................................../app/lib/python3.14.............../site-packages/redis/client.py:753: in _send_command_parse_response
    return self.parse_response(conn, command_name, **options)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.........................................................................../app/lib/python3.14.............../site-packages/redis/client.py:853: in parse_response
    response = connection.read_response()
               ^^^^^^^^^^^^^^^^^^^^^^^^^^
.........................................................................../app/lib/python3.14.../site-packages/redis/connection.py:1371: in read_response
    response = self._parser.read_response(
.........................................................................../app/lib/python3.14.../redis/_parsers/hiredis.py:151: in read_response
    self.read_from_socket(timeout=timeout)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <redis._parsers.hiredis._HiredisParser object at 0x7f107f965a90>
timeout = <object object at 0x7f10b8dedcf0>, raise_on_timeout = True

    def read_from_socket(self, timeout=SENTINEL, raise_on_timeout=True):
        sock = self._sock
        custom_timeout = timeout is not SENTINEL
        try:
            if custom_timeout:
                sock.settimeout(timeout)
            bufflen = self._sock.recv_into(self._buffer)
            if bufflen == 0:
>               raise ConnectionError(SERVER_CLOSED_CONNECTION_ERROR)
E               redis.exceptions.ConnectionError: Connection closed by server.

.........................................................................../app/lib/python3.14.../redis/_parsers/hiredis.py:111: ConnectionError
tests/onegov/translator_directory/test_views.py::test_manage_language
Stack Traces | 1.4s run time
client = <tests.onegov.translator_directory.conftest.Client object at 0x7f841bd03df0>

    def test_manage_language(client: Client) -> None:
>       client.login_editor()

.../onegov/translator_directory/test_views.py:490: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
tests/shared/client.py:69: in login_editor
    return self.login('editor@example.org', 'hunter2', to)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
tests/shared/client.py:60: in login
    login_page = self.get(url)
                 ^^^^^^^^^^^^^
.........................................................................../app/lib/python3.14....../site-packages/webtest/app.py:328: in get
    return self.do_request(req, status=status,
tests/shared/client.py:159: in do_request
    return self.extend_response(super().do_request(*args, **kwargs))
                                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.........................................................................../app/lib/python3.14....../site-packages/webtest/app.py:627: in do_request
    res = req.get_response(app, catch_exc_info=True)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.........................................................................../app/lib/python3.14....../site-packages/webob/request.py:1309: in send
    status, headers, app_iter, exc_info = self.call_application(
.........................................................................../app/lib/python3.14....../site-packages/webob/request.py:1278: in call_application
    app_iter = application(self.environ, start_response)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.........................................................................../app/lib/python3.14.../site-packages/webtest/lint.py:196: in lint_app
    iterator = application(environ, start_response_wrapper)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.../onegov/core/framework.py:219: in with_request_cache_wrapper
    return fn(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^
.../onegov/core/framework.py:234: in with_print_exceptions_wrapper
    return fn(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^
.........................................................................../app/lib/python3.14.../site-packages/morepath/app.py:138: in __call__
    response = self.publish(request)
               ^^^^^^^^^^^^^^^^^^^^^
.........................................................................../app/lib/python3.14.../site-packages/morepath/core.py:201: in poisoned_host_header_protection_tween
    return handler(request)
           ^^^^^^^^^^^^^^^^
.../onegov/core/framework.py:1765: in http_conflict_tween
    return handler(request)
           ^^^^^^^^^^^^^^^^
.../onegov/core/framework.py:1790: in activate_session_manager
    return handler(request)
           ^^^^^^^^^^^^^^^^
.../onegov/core/framework.py:1808: in close_session_after_request
    return handler(request)
           ^^^^^^^^^^^^^^^^
.../onegov/file/integration.py:477: in configure_depot_tween
    return handler(request)
           ^^^^^^^^^^^^^^^^
.........................................................................../app/lib/python3.14.../more/transaction/main.py:53: in transaction_tween
    userid = request.identity.userid
             ^^^^^^^^^^^^^^^^
.........................................................................../app/lib/python3.14.../site-packages/morepath/reify.py:44: in __get__
    val = self.wrapped(inst)
          ^^^^^^^^^^^^^^^^^^
.........................................................................../app/lib/python3.14.../site-packages/morepath/request.py:85: in identity
    result = self.app._identify(self)
             ^^^^^^^^^^^^^^^^^^^^^^^^
.../core/security/identity_policy.py:24: in identify
    key: request.browser_session[key] for key in self.required_keys
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.../onegov/core/browser_session.py:191: in __getitem__
    result = self._get(name)
             ^^^^^^^^^^^^^^^
.../onegov/core/browser_session.py:124: in _get
    return self._cache.get(name)
           ^^^^^^^^^^^^^^^^^^^^^
.../onegov/core/browser_session.py:34: in get
    return self.cache.get(self.mangle(key))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.........................................................................../app/lib/python3.14.../dogpile/cache/region.py:783: in get
    value = self._get_cache_value(key, expiration_time, ignore_expiration)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.........................................................................../app/lib/python3.14.../dogpile/cache/region.py:821: in _get_cache_value
    value = self._get_from_backend(key)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^
.........................................................................../app/lib/python3.14.../dogpile/cache/region.py:1325: in _get_from_backend
    self.backend.get_serialized(key)
.........................................................................../app/lib/python3.14.../cache/backends/redis.py:262: in get_serialized
    value = self.reader_client.get(key)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^
.........................................................................../app/lib/python3.14.../redis/commands/core.py:3194: in get
    return self.execute_command("GET", name, keys=[name])
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.........................................................................../app/lib/python3.14.............../site-packages/redis/client.py:787: in execute_command
    return self._execute_command(*args, **options)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.........................................................................../app/lib/python3.14.............../site-packages/redis/client.py:809: in _execute_command
    result = conn.retry.call_with_retry(
.........................................................................../app/lib/python3.14....../site-packages/redis/retry.py:132: in call_with_retry
    raise error
.........................................................................../app/lib/python3.14....../site-packages/redis/retry.py:120: in call_with_retry
    return do()
           ^^^^
.........................................................................../app/lib/python3.14.............../site-packages/redis/client.py:810: in <lambda>
    lambda: self._send_command_parse_response(
.........................................................................../app/lib/python3.14.............../site-packages/redis/client.py:753: in _send_command_parse_response
    return self.parse_response(conn, command_name, **options)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.........................................................................../app/lib/python3.14.............../site-packages/redis/client.py:853: in parse_response
    response = connection.read_response()
               ^^^^^^^^^^^^^^^^^^^^^^^^^^
.........................................................................../app/lib/python3.14.../site-packages/redis/connection.py:1371: in read_response
    response = self._parser.read_response(
.........................................................................../app/lib/python3.14.../redis/_parsers/hiredis.py:151: in read_response
    self.read_from_socket(timeout=timeout)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <redis._parsers.hiredis._HiredisParser object at 0x7f841c976360>
timeout = <object object at 0x7f84572f1cf0>, raise_on_timeout = True

    def read_from_socket(self, timeout=SENTINEL, raise_on_timeout=True):
        sock = self._sock
        custom_timeout = timeout is not SENTINEL
        try:
            if custom_timeout:
                sock.settimeout(timeout)
            bufflen = self._sock.recv_into(self._buffer)
            if bufflen == 0:
>               raise ConnectionError(SERVER_CLOSED_CONNECTION_ERROR)
E               redis.exceptions.ConnectionError: Connection closed by server.

.........................................................................../app/lib/python3.14.../redis/_parsers/hiredis.py:111: ConnectionError
tests/onegov/fsi/test_views_attendee.py::test_add_edit_external_attendee
Stack Traces | 1.53s run time
fixturedef = <FixtureDef argname='fsi_app' scope='function' baseid='tests/onegov/fsi'>
request = <SubRequest 'fsi_app' for <Function test_add_edit_external_attendee>>

    @pytest.hookimpl(wrapper=True)
    def pytest_fixture_setup(fixturedef: FixtureDef, request) -> object | None:
        if (
            fixturedef.argname == "event_loop_policy"
            and fixturedef.func.__module__ != __name__
        ):
            warnings.warn(
                PytestDeprecationWarning(_EVENT_LOOP_POLICY_FIXTURE_DEPRECATION_WARNING),
            )
        asyncio_mode = _get_asyncio_mode(request.config)
        if not _is_asyncio_fixture_function(fixturedef.func):
            if asyncio_mode == Mode.STRICT:
                # Ignore async fixtures without explicit asyncio mark in strict mode
                # This applies to pytest_trio fixtures, for example
>               return (yield)
                        ^^^^^

............................................................................../app/lib/python3.14.../site-packages/pytest_asyncio/plugin.py:924: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.../onegov/fsi/conftest.py:79: in fsi_app
    yield create_fsi_app(request, False, hashed_password)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.../onegov/fsi/conftest.py:244: in create_fsi_app
    org = create_new_organisation(app, name="Kursverwaltung")
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.../onegov/fsi/initial_content.py:29: in create_new_organisation
    add_pages(session, path)
.../onegov/org/initial_content.py:94: in add_pages
    pages.add(
.../orm/abstract/adjacency_list.py:518: in add
    name = name or self.get_unique_child_name(title, parent)
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.../orm/abstract/adjacency_list.py:493: in get_unique_child_name
    n for n, in siblings.with_entities(self.__listclass__.name)
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
............................................................................../app/lib/python3.14.../sqlalchemy/orm/query.py:2850: in __iter__
    result = self._iter()
             ^^^^^^^^^^^^
............................................................................../app/lib/python3.14.../sqlalchemy/orm/query.py:2864: in _iter
    result: Union[ScalarResult[_T], Result[_T]] = self.session.execute(
............................................................................../app/lib/python3.14.../sqlalchemy/orm/session.py:2372: in execute
    return self._execute_internal(
............................................................................../app/lib/python3.14.../sqlalchemy/orm/session.py:2249: in _execute_internal
    ) = compile_state_cls.orm_pre_session_exec(
............................................................................../app/lib/python3.14.../sqlalchemy/orm/context.py:577: in orm_pre_session_exec
    session._autoflush()
............................................................................../app/lib/python3.14.../sqlalchemy/orm/session.py:3061: in _autoflush
    self.flush()
............................................................................../app/lib/python3.14.../sqlalchemy/orm/session.py:4352: in flush
    self._flush(objects)
............................................................................../app/lib/python3.14.../sqlalchemy/orm/session.py:4487: in _flush
    with util.safe_reraise():
         ^^^^^^^^^^^^^^^^^^^
............................................................................../app/lib/python3.14.../sqlalchemy/util/langhelpers.py:122: in __exit__
    raise exc_value.with_traceback(exc_tb)
............................................................................../app/lib/python3.14.../sqlalchemy/orm/session.py:4452: in _flush
    self.dispatch.after_flush(self, flush_context)
............................................................................../app/lib/python3.14.../sqlalchemy/event/attr.py:388: in __call__
    fn(*args, **kw)
.../core/orm/session_manager.py:584: in on_after_flush
    self.on_insert.send(self.current_schema, obj=obj)
............................................................................../app/lib/python3.14.../site-packages/blinker/base.py:249: in send
    result = receiver(sender, **kwargs)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^
.../core/orm/cache.py:172: in handle_orm_change
    self.cache.delete(cache_key)
............................................................................../app/lib/python3.14.../dogpile/cache/region.py:1427: in delete
    self.backend.delete(key)
............................................................................../app/lib/python3.14.../cache/backends/redis.py:289: in delete
    self.writer_client.delete(key)
............................................................................../app/lib/python3.14.../redis/commands/core.py:2864: in delete
    return self.execute_command("DEL", *names)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
............................................................................../app/lib/python3.14.............../site-packages/redis/client.py:787: in execute_command
    return self._execute_command(*args, **options)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
............................................................................../app/lib/python3.14.............../site-packages/redis/client.py:809: in _execute_command
    result = conn.retry.call_with_retry(
............................................................................../app/lib/python3.14....../site-packages/redis/retry.py:132: in call_with_retry
    raise error
............................................................................../app/lib/python3.14....../site-packages/redis/retry.py:120: in call_with_retry
    return do()
           ^^^^
............................................................................../app/lib/python3.14.............../site-packages/redis/client.py:810: in <lambda>
    lambda: self._send_command_parse_response(
............................................................................../app/lib/python3.14.............../site-packages/redis/client.py:753: in _send_command_parse_response
    return self.parse_response(conn, command_name, **options)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
............................................................................../app/lib/python3.14.............../site-packages/redis/client.py:853: in parse_response
    response = connection.read_response()
               ^^^^^^^^^^^^^^^^^^^^^^^^^^
............................................................................../app/lib/python3.14.../site-packages/redis/connection.py:1371: in read_response
    response = self._parser.read_response(
............................................................................../app/lib/python3.14.../redis/_parsers/hiredis.py:151: in read_response
    self.read_from_socket(timeout=timeout)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <redis._parsers.hiredis._HiredisParser object at 0x7f56a17d92b0>
timeout = <object object at 0x7f56dc611cf0>, raise_on_timeout = True

    def read_from_socket(self, timeout=SENTINEL, raise_on_timeout=True):
        sock = self._sock
        custom_timeout = timeout is not SENTINEL
        try:
            if custom_timeout:
                sock.settimeout(timeout)
            bufflen = self._sock.recv_into(self._buffer)
            if bufflen == 0:
>               raise ConnectionError(SERVER_CLOSED_CONNECTION_ERROR)
E               redis.exceptions.ConnectionError: Connection closed by server.

............................................................................../app/lib/python3.14.../redis/_parsers/hiredis.py:111: ConnectionError
tests/onegov/fsi/test_cronjobs.py::test_send_reminder_mails
Stack Traces | 1.57s run time
fixturedef = <FixtureDef argname='fsi_app_mocked' scope='function' baseid='tests/onegov/fsi'>
request = <SubRequest 'fsi_app_mocked' for <Function test_send_reminder_mails>>

    @pytest.hookimpl(wrapper=True)
    def pytest_fixture_setup(fixturedef: FixtureDef, request) -> object | None:
        if (
            fixturedef.argname == "event_loop_policy"
            and fixturedef.func.__module__ != __name__
        ):
            warnings.warn(
                PytestDeprecationWarning(_EVENT_LOOP_POLICY_FIXTURE_DEPRECATION_WARNING),
            )
        asyncio_mode = _get_asyncio_mode(request.config)
        if not _is_asyncio_fixture_function(fixturedef.func):
            if asyncio_mode == Mode.STRICT:
                # Ignore async fixtures without explicit asyncio mark in strict mode
                # This applies to pytest_trio fixtures, for example
>               return (yield)
                        ^^^^^

............................................................................../app/lib/python3.14.../site-packages/pytest_asyncio/plugin.py:924: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.../onegov/fsi/conftest.py:87: in fsi_app_mocked
    yield create_fsi_app(request, False, hashed_password, mock_db=True)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.../onegov/fsi/conftest.py:244: in create_fsi_app
    org = create_new_organisation(app, name="Kursverwaltung")
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.../onegov/fsi/initial_content.py:29: in create_new_organisation
    add_pages(session, path)
.../onegov/org/initial_content.py:94: in add_pages
    pages.add(
.../orm/abstract/adjacency_list.py:518: in add
    name = name or self.get_unique_child_name(title, parent)
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.../orm/abstract/adjacency_list.py:493: in get_unique_child_name
    n for n, in siblings.with_entities(self.__listclass__.name)
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
............................................................................../app/lib/python3.14.../sqlalchemy/orm/query.py:2850: in __iter__
    result = self._iter()
             ^^^^^^^^^^^^
............................................................................../app/lib/python3.14.../sqlalchemy/orm/query.py:2864: in _iter
    result: Union[ScalarResult[_T], Result[_T]] = self.session.execute(
............................................................................../app/lib/python3.14.../sqlalchemy/orm/session.py:2372: in execute
    return self._execute_internal(
............................................................................../app/lib/python3.14.../sqlalchemy/orm/session.py:2249: in _execute_internal
    ) = compile_state_cls.orm_pre_session_exec(
............................................................................../app/lib/python3.14.../sqlalchemy/orm/context.py:577: in orm_pre_session_exec
    session._autoflush()
............................................................................../app/lib/python3.14.../sqlalchemy/orm/session.py:3061: in _autoflush
    self.flush()
............................................................................../app/lib/python3.14.../sqlalchemy/orm/session.py:4352: in flush
    self._flush(objects)
............................................................................../app/lib/python3.14.../sqlalchemy/orm/session.py:4487: in _flush
    with util.safe_reraise():
         ^^^^^^^^^^^^^^^^^^^
............................................................................../app/lib/python3.14.../sqlalchemy/util/langhelpers.py:122: in __exit__
    raise exc_value.with_traceback(exc_tb)
............................................................................../app/lib/python3.14.../sqlalchemy/orm/session.py:4452: in _flush
    self.dispatch.after_flush(self, flush_context)
............................................................................../app/lib/python3.14.../sqlalchemy/event/attr.py:388: in __call__
    fn(*args, **kw)
.../core/orm/session_manager.py:584: in on_after_flush
    self.on_insert.send(self.current_schema, obj=obj)
............................................................................../app/lib/python3.14.../site-packages/blinker/base.py:249: in send
    result = receiver(sender, **kwargs)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^
.../core/orm/cache.py:172: in handle_orm_change
    self.cache.delete(cache_key)
............................................................................../app/lib/python3.14.../dogpile/cache/region.py:1427: in delete
    self.backend.delete(key)
............................................................................../app/lib/python3.14.../cache/backends/redis.py:289: in delete
    self.writer_client.delete(key)
............................................................................../app/lib/python3.14.../redis/commands/core.py:2864: in delete
    return self.execute_command("DEL", *names)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
............................................................................../app/lib/python3.14.............../site-packages/redis/client.py:787: in execute_command
    return self._execute_command(*args, **options)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
............................................................................../app/lib/python3.14.............../site-packages/redis/client.py:809: in _execute_command
    result = conn.retry.call_with_retry(
............................................................................../app/lib/python3.14....../site-packages/redis/retry.py:132: in call_with_retry
    raise error
............................................................................../app/lib/python3.14....../site-packages/redis/retry.py:120: in call_with_retry
    return do()
           ^^^^
............................................................................../app/lib/python3.14.............../site-packages/redis/client.py:810: in <lambda>
    lambda: self._send_command_parse_response(
............................................................................../app/lib/python3.14.............../site-packages/redis/client.py:753: in _send_command_parse_response
    return self.parse_response(conn, command_name, **options)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
............................................................................../app/lib/python3.14.............../site-packages/redis/client.py:853: in parse_response
    response = connection.read_response()
               ^^^^^^^^^^^^^^^^^^^^^^^^^^
............................................................................../app/lib/python3.14.../site-packages/redis/connection.py:1371: in read_response
    response = self._parser.read_response(
............................................................................../app/lib/python3.14.../redis/_parsers/hiredis.py:151: in read_response
    self.read_from_socket(timeout=timeout)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <redis._parsers.hiredis._HiredisParser object at 0x7f95d287dd10>
timeout = <object object at 0x7f960d8c5cf0>, raise_on_timeout = True

    def read_from_socket(self, timeout=SENTINEL, raise_on_timeout=True):
        sock = self._sock
        custom_timeout = timeout is not SENTINEL
        try:
            if custom_timeout:
                sock.settimeout(timeout)
            bufflen = self._sock.recv_into(self._buffer)
            if bufflen == 0:
>               raise ConnectionError(SERVER_CLOSED_CONNECTION_ERROR)
E               redis.exceptions.ConnectionError: Connection closed by server.

............................................................................../app/lib/python3.14.../redis/_parsers/hiredis.py:111: ConnectionError
tests/onegov/fsi/test_views_attendee.py::test_attendee_details
Stack Traces | 1.63s run time
fixturedef = <FixtureDef argname='fsi_app_mocked' scope='function' baseid='tests/onegov/fsi'>
request = <SubRequest 'fsi_app_mocked' for <Function test_attendee_details>>

    @pytest.hookimpl(wrapper=True)
    def pytest_fixture_setup(fixturedef: FixtureDef, request) -> object | None:
        if (
            fixturedef.argname == "event_loop_policy"
            and fixturedef.func.__module__ != __name__
        ):
            warnings.warn(
                PytestDeprecationWarning(_EVENT_LOOP_POLICY_FIXTURE_DEPRECATION_WARNING),
            )
        asyncio_mode = _get_asyncio_mode(request.config)
        if not _is_asyncio_fixture_function(fixturedef.func):
            if asyncio_mode == Mode.STRICT:
                # Ignore async fixtures without explicit asyncio mark in strict mode
                # This applies to pytest_trio fixtures, for example
>               return (yield)
                        ^^^^^

............................................................................../app/lib/python3.14.../site-packages/pytest_asyncio/plugin.py:924: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.../onegov/fsi/conftest.py:87: in fsi_app_mocked
    yield create_fsi_app(request, False, hashed_password, mock_db=True)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.../onegov/fsi/conftest.py:244: in create_fsi_app
    org = create_new_organisation(app, name="Kursverwaltung")
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.../onegov/fsi/initial_content.py:29: in create_new_organisation
    add_pages(session, path)
.../onegov/org/initial_content.py:94: in add_pages
    pages.add(
.../orm/abstract/adjacency_list.py:518: in add
    name = name or self.get_unique_child_name(title, parent)
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.../orm/abstract/adjacency_list.py:493: in get_unique_child_name
    n for n, in siblings.with_entities(self.__listclass__.name)
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
............................................................................../app/lib/python3.14.../sqlalchemy/orm/query.py:2850: in __iter__
    result = self._iter()
             ^^^^^^^^^^^^
............................................................................../app/lib/python3.14.../sqlalchemy/orm/query.py:2864: in _iter
    result: Union[ScalarResult[_T], Result[_T]] = self.session.execute(
............................................................................../app/lib/python3.14.../sqlalchemy/orm/session.py:2372: in execute
    return self._execute_internal(
............................................................................../app/lib/python3.14.../sqlalchemy/orm/session.py:2249: in _execute_internal
    ) = compile_state_cls.orm_pre_session_exec(
............................................................................../app/lib/python3.14.../sqlalchemy/orm/context.py:577: in orm_pre_session_exec
    session._autoflush()
............................................................................../app/lib/python3.14.../sqlalchemy/orm/session.py:3061: in _autoflush
    self.flush()
............................................................................../app/lib/python3.14.../sqlalchemy/orm/session.py:4352: in flush
    self._flush(objects)
............................................................................../app/lib/python3.14.../sqlalchemy/orm/session.py:4487: in _flush
    with util.safe_reraise():
         ^^^^^^^^^^^^^^^^^^^
............................................................................../app/lib/python3.14.../sqlalchemy/util/langhelpers.py:122: in __exit__
    raise exc_value.with_traceback(exc_tb)
............................................................................../app/lib/python3.14.../sqlalchemy/orm/session.py:4452: in _flush
    self.dispatch.after_flush(self, flush_context)
............................................................................../app/lib/python3.14.../sqlalchemy/event/attr.py:388: in __call__
    fn(*args, **kw)
.../core/orm/session_manager.py:584: in on_after_flush
    self.on_insert.send(self.current_schema, obj=obj)
............................................................................../app/lib/python3.14.../site-packages/blinker/base.py:249: in send
    result = receiver(sender, **kwargs)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^
.../core/orm/cache.py:172: in handle_orm_change
    self.cache.delete(cache_key)
............................................................................../app/lib/python3.14.../dogpile/cache/region.py:1427: in delete
    self.backend.delete(key)
............................................................................../app/lib/python3.14.../cache/backends/redis.py:289: in delete
    self.writer_client.delete(key)
............................................................................../app/lib/python3.14.../redis/commands/core.py:2864: in delete
    return self.execute_command("DEL", *names)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
............................................................................../app/lib/python3.14.............../site-packages/redis/client.py:787: in execute_command
    return self._execute_command(*args, **options)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
............................................................................../app/lib/python3.14.............../site-packages/redis/client.py:809: in _execute_command
    result = conn.retry.call_with_retry(
............................................................................../app/lib/python3.14....../site-packages/redis/retry.py:132: in call_with_retry
    raise error
............................................................................../app/lib/python3.14....../site-packages/redis/retry.py:120: in call_with_retry
    return do()
           ^^^^
............................................................................../app/lib/python3.14.............../site-packages/redis/client.py:810: in <lambda>
    lambda: self._send_command_parse_response(
............................................................................../app/lib/python3.14.............../site-packages/redis/client.py:753: in _send_command_parse_response
    return self.parse_response(conn, command_name, **options)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
............................................................................../app/lib/python3.14.............../site-packages/redis/client.py:853: in parse_response
    response = connection.read_response()
               ^^^^^^^^^^^^^^^^^^^^^^^^^^
............................................................................../app/lib/python3.14.../site-packages/redis/connection.py:1371: in read_response
    response = self._parser.read_response(
............................................................................../app/lib/python3.14.../redis/_parsers/hiredis.py:151: in read_response
    self.read_from_socket(timeout=timeout)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <redis._parsers.hiredis._HiredisParser object at 0x7fb2ee4fe660>
timeout = <object object at 0x7fb329171cf0>, raise_on_timeout = True

    def read_from_socket(self, timeout=SENTINEL, raise_on_timeout=True):
        sock = self._sock
        custom_timeout = timeout is not SENTINEL
        try:
            if custom_timeout:
                sock.settimeout(timeout)
            bufflen = self._sock.recv_into(self._buffer)
            if bufflen == 0:
>               raise ConnectionError(SERVER_CLOSED_CONNECTION_ERROR)
E               redis.exceptions.ConnectionError: Connection closed by server.

............................................................................../app/lib/python3.14.../redis/_parsers/hiredis.py:111: ConnectionError
tests/onegov/election_day/screen_widgets/test_election_widgets.py::test_majorz_election_widgets
Stack Traces | 2.53s run time
self = <PageTemplate <string>>
_BaseTemplate__kw = {'__decode': <method 'decode' of 'bytes' objects>, '__on_error_handler': None, '__translate': <function simple_transla...e, 'Grüne', Decimal('15.0'), None, None), (746, 'Thöni', 'Stefan', False, 'Piraten', Decimal('4.4'), None, None)], ...}
econtext = {'layout': <onegov.election_day.layouts.election.ElectionLayout object at 0x7f8c14e23d90>, 'request': <tests.onegov.el...hameleon.tal.RepeatDict object at 0x7f8c150c9ab0>, 'macroname': "layout.macros['election-candidates-by-entity-table']"}
rcontext = {'__error__': [("layout.principal.label('entity')", 799, 95, '.../onegov/election_day/t...nnectionError), ("layout.macros['election-candidates-by-entity-table']", 10, 60, '<string>', network:ConnectionError)]}
stream = ['<div class="homepage">\n\n          \n        ', '<span class="my-class-1">', 'majorz_internal_staenderatswahl-2015-intermediate', '</span>\n        ', '<span class="my-class-2">', '\n    ', ...]
target_language = None, cls = <class 'redis.exceptions.ConnectionError'>

    def render(self, **__kw: Any) -> str:
        econtext = Scope(__kw)
        rcontext: dict[str, Any] = {}
        self.cook_check()
        stream = self.output_stream_factory()
        target_language = __kw.get("target_language")
        try:
>           self._render(
                stream,
                econtext,
                rcontext,
                target_language=target_language
            )

............................................................................................................................../app/lib/python3.14............/site-packages/chameleon/template.py:238: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
f78a22816cc76ca2f6178de804459cff.py:384: in render
    ???
macros_0f0e253999b9fdd84a429cd74e411558.py:14445: in render_election_candidates_by_entity_table
    ???
............................................................................................................................../app/lib/python3.14........./site-packages/chameleon/utils.py:517: in lookup_attr
    return getattr(obj, key)
           ^^^^^^^^^^^^^^^^^
....../usr/lib/python3.14/functools.py:1126: in __get__
    val = self.func(instance)
          ^^^^^^^^^^^^^^^^^^^
.../election_day/layouts/default.py:67: in principal
    return self.request.app.principal
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
.../onegov/election_day/app.py:63: in principal
    return self.cache.get_or_create('principal', self.load_principal)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
............................................................................................................................../app/lib/python3.14.../dogpile/cache/region.py:1097: in get_or_create
    with Lock(
............................................................................................................................../app/lib/python3.14............/site-packages/dogpile/lock.py:185: in __enter__
    return self._enter()
           ^^^^^^^^^^^^^
............................................................................................................................../app/lib/python3.14............/site-packages/dogpile/lock.py:87: in _enter
    value = value_fn()
            ^^^^^^^^^^
............................................................................................................................../app/lib/python3.14.../dogpile/cache/region.py:1033: in get_value
    value = self._get_from_backend(key)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^
............................................................................................................................../app/lib/python3.14.../dogpile/cache/region.py:1325: in _get_from_backend
    self.backend.get_serialized(key)
............................................................................................................................../app/lib/python3.14.../cache/backends/redis.py:262: in get_serialized
    value = self.reader_client.get(key)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^
............................................................................................................................../app/lib/python3.14.../redis/commands/core.py:3194: in get
    return self.execute_command("GET", name, keys=[name])
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
............................................................................................................................../app/lib/python3.14............................../site-packages/redis/client.py:787: in execute_command
    return self._execute_command(*args, **options)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
............................................................................................................................../app/lib/python3.14............................../site-packages/redis/client.py:809: in _execute_command
    result = conn.retry.call_with_retry(
............................................................................................................................../app/lib/python3.14............/site-packages/redis/retry.py:132: in call_with_retry
    raise error
............................................................................................................................../app/lib/python3.14............/site-packages/redis/retry.py:120: in call_with_retry
    return do()
           ^^^^
............................................................................................................................../app/lib/python3.14............................../site-packages/redis/client.py:810: in <lambda>
    lambda: self._send_command_parse_response(
............................................................................................................................../app/lib/python3.14............................../site-packages/redis/client.py:753: in _send_command_parse_response
    return self.parse_response(conn, command_name, **options)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
............................................................................................................................../app/lib/python3.14............................../site-packages/redis/client.py:853: in parse_response
    response = connection.read_response()
               ^^^^^^^^^^^^^^^^^^^^^^^^^^
............................................................................................................................../app/lib/python3.14....../site-packages/redis/connection.py:1371: in read_response
    response = self._parser.read_response(
............................................................................................................................../app/lib/python3.14.../redis/_parsers/hiredis.py:151: in read_response
    self.read_from_socket(timeout=timeout)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <redis._parsers.hiredis._HiredisParser object at 0x7f8c15cf7bb0>
timeout = <object object at 0x7f8c50b81cf0>, raise_on_timeout = True

    def read_from_socket(self, timeout=SENTINEL, raise_on_timeout=True):
        sock = self._sock
        custom_timeout = timeout is not SENTINEL
        try:
            if custom_timeout:
                sock.settimeout(timeout)
            bufflen = self._sock.recv_into(self._buffer)
            if bufflen == 0:
>               raise ConnectionError(SERVER_CLOSED_CONNECTION_ERROR)
E               redis.exceptions.ConnectionError: Connection closed by server.

............................................................................................................................../app/lib/python3.14.../redis/_parsers/hiredis.py:111: ConnectionError

During handling of the above exception, another exception occurred:

election_day_app_zg = <tests.onegov.election_day.conftest.TestApp object at 0x7f8c12771450>
import_test_datasets = <function import_test_datasets.<locals>._import_test_datasets at 0x7f8c150617a0>

    def test_majorz_election_widgets(
        election_day_app_zg: TestApp,
        import_test_datasets: ImportTestDatasets
    ) -> None:
    
        structure = """
            <model-title class="my-class-1"/>
            <model-progress class="my-class-2"/>
            <counted-entities class="my-class-3"/>
            <election-candidates-table class="my-class-4" lists="SP, Grüne,"/>
            <election-candidates-chart class="my-class-5"/>
            <election-candidates-chart class="my-class-6" limit="2"
                lists="x,y" sort-by-lists="True" elected="True"/>
            <election-candidates-by-entity-table class="my-class-7"/>
            <number-of-counted-entities class="my-class-8"/>
            <total-entities class="my-class-9"/>
            <election-turnout class="my-class-a"/>
            <absolute-majority class="my-class-b"/>
            <allocated-mandates class="my-class-c"/>
            <number-of-mandates class="my-class-d"/>
            <mandates class="my-class-e"/>
            <last-result-change class="my-class-f"/>
            <if-completed>is-completed</if-completed>
            <if-not-completed>is-not-completed</if-not-completed>
            <if-absolute-majority>is-am</if-absolute-majority>
            <if-relative-majority>is-rm</if-relative-majority>
        """
        widgets: list[Widget] = [
            AbsoluteMajorityWidget(),
            AllocatedMandatesWidget(),
            CountedEntitiesWidget(),
            ElectionCandidatesByEntityTableWidget(),
            ElectionCandidatesChartWidget(),
            ElectionCandidatesTableWidget(),
            ElectionTurnoutWidget(),
            IfAbsoluteMajorityWidget(),
            IfCompletedWidget(),
            IfNotCompletedWidget(),
            IfRelateMajorityWidget(),
            LastResultChangeWidget(),
            MandatesWidget(),
            ModelProgressWidget(),
            ModelTitleWidget(),
            NumberOfCountedEntitiesWidget(),
            NumberOfMandatesWidget(),
            TotalEntitiesWidget(),
        ]
    
        # Empty
        session = election_day_app_zg.session()
        session.add(
            Election(title='Election', domain='canton', date=date(2015, 6, 18))
        )
        session.flush()
        model = session.query(Election).one()
        request: Any = DummyRequest(app=election_day_app_zg, session=session)
        layout = ElectionLayout(model, request)
        default = {'layout': layout, 'request': request}
        data = inject_variables(widgets, layout, structure, default, False)
    
        assert data == {
            'candidates': [],
            'candidates_by_entites': ([], []),
            'election': model,
            'embed': False,
            'entities': '',
            'layout': layout,
            'model': model,
            'request': request,
        }
    
        result = transform_structure(widgets, structure)
        result = PageTemplate(result)(**data)
        etree.fromstring(result.encode('utf-8'))
    
        assert '>Election</span>' in result
        assert 'is-completed' not in result
        assert 'is-not-completed' in result
        assert 'is-am' not in result
        assert 'is-rm' not in result
        assert 'my-class-1' in result
        assert 'my-class-2' in result
        assert 'my-class-3' in result
        assert 'my-class-4' in result
        assert 'my-class-5' in result
        assert 'my-class-6' in result
        assert 'my-class-7' in result
        assert 'my-class-8' in result
        assert 'my-class-9' in result
        assert 'my-class-a' in result
        assert 'my-class-b' in result
        assert 'my-class-c' in result
        assert 'my-class-d' in result
        assert 'my-class-e' in result
        assert 'my-class-f' in result
    
        # Add intermediate results
        with freeze_time('2022-01-01 12:00'):
            results = import_test_datasets(
                'internal',
                'election',
                'zg',
                'canton',
                'majorz',
                date_=date(2015, 10, 18),
                number_of_mandates=2,
                dataset_name='staenderatswahl-2015-intermediate',
                app_session=session
            )
            assert len(results) == 1
            model, errors = next(iter(results.values()))
            model.majority_type = 'absolute'
            assert not errors
            session.add(model)
            session.flush()
    
        layout = ElectionLayout(model, request)
        default = {'layout': layout, 'request': request}
        data = inject_variables(widgets, layout, structure, default, False)
    
        assert data['candidates'] == [
            (10693, 'Hegglin', 'Peter', True, 'CVP', Decimal('63.3'), None, None),
            (10103, 'Eder', 'Joachim', True, 'FDP', Decimal('59.8'), None, None),
            (4845, 'Brandenberg', 'Manuel', False, 'SVP', Decimal('28.7'), None,
             None),
            (2890, 'Gysel', 'Barbara', False, 'SP', Decimal('17.1'), None, None),
            (2541, 'Lustenberger', 'Andreas', False, 'Grüne', Decimal('15.0'),
             None, None),
            (746, 'Thöni', 'Stefan', False, 'Piraten', Decimal('4.4'), None, None)
        ]
    
        assert [c[1:] for c in data['candidates_by_entites'][0]] == [
            ('Hegglin', 'Peter', 10693),
            ('Eder', 'Joachim', 10103),
            ('Brandenberg', 'Manuel', 4845),
            ('Gysel', 'Barbara', 2890),
            ('Lustenberger', 'Andreas', 2541),
            ('Thöni', 'Stefan', 746)
        ]
        assert data['candidates_by_entites'][1] == [
            ('Baar', [
                ('Baar', 'Hegglin', 'Peter', 4207),
                ('Baar', 'Eder', 'Joachim', 4237),
                ('Baar', 'Brandenberg', 'Manuel', 2100),
                ('Baar', 'Gysel', 'Barbara', 1264),
                ('Baar', 'Lustenberger', 'Andreas', 1269),
                ('Baar', 'Thöni', 'Stefan', 320)
            ]),
            ('Cham', [
                ('Cham', 'Hegglin', 'Peter', 2905),
                ('Cham', 'Eder', 'Joachim', 2726),
                ('Cham', 'Brandenberg', 'Manuel', 1404),
                ('Cham', 'Gysel', 'Barbara', 888),
                ('Cham', 'Lustenberger', 'Andreas', 685),
                ('Cham', 'Thöni', 'Stefan', 232)
            ]),
            ('Hünenberg', [
                ('Hünenberg', 'Hegglin', 'Peter', 2205),
                ('Hünenberg', 'Eder', 'Joachim', 2098),
                ('Hünenberg', 'Brandenberg', 'Manuel', 881),
                ('Hünenberg', 'Gysel', 'Barbara', 540),
                ('Hünenberg', 'Lustenberger', 'Andreas', 397),
                ('Hünenberg', 'Thöni', 'Stefan', 140)
            ]),
            ('Menzingen', [
                ('Menzingen', 'Hegglin', 'Peter', 1376),
                ('Menzingen', 'Eder', 'Joachim', 1042),
                ('Menzingen', 'Brandenberg', 'Manuel', 460),
                ('Menzingen', 'Gysel', 'Barbara', 198),
                ('Menzingen', 'Lustenberger', 'Andreas', 190),
                ('Menzingen', 'Thöni', 'Stefan', 54)
            ])
        ]
        assert data['election'] == model
        assert data['embed'] == False
        assert data['entities'] == 'Baar, Cham, Hünenberg, Menzingen'
        assert data['layout'] == layout
        assert data['model'] == model
        assert data['request'] == request
    
        result = transform_structure(widgets, structure)
>       result = PageTemplate(result)(**data)
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.../election_day/screen_widgets/test_election_widgets.py:227: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
............................................................................................................................../app/lib/python3.14............/site-packages/chameleon/template.py:183: in __call__
    return self.render(**kwargs)
           ^^^^^^^^^^^^^^^^^^^^^
............................................................................................................................../app/lib/python3.14.../chameleon/zpt/template.py:359: in render
    return super().render(**_kw)
           ^^^^^^^^^^^^^^^^^^^^^
............................................................................................................................../app/lib/python3.14............/site-packages/chameleon/template.py:268: in render
    raise_with_traceback(exc, tb)
............................................................................................................................../app/lib/python3.14........./site-packages/chameleon/utils.py:52: in raise_with_traceback
    raise exc
............................................................................................................................../app/lib/python3.14............/site-packages/chameleon/template.py:238: in render
    self._render(
f78a22816cc76ca2f6178de804459cff.py:384: in render
    ???
macros_0f0e253999b9fdd84a429cd74e411558.py:14445: in render_election_candidates_by_entity_table
    ???
............................................................................................................................../app/lib/python3.14........./site-packages/chameleon/utils.py:517: in lookup_attr
    return getattr(obj, key)
           ^^^^^^^^^^^^^^^^^
....../usr/lib/python3.14/functools.py:1126: in __get__
    val = self.func(instance)
          ^^^^^^^^^^^^^^^^^^^
.../election_day/layouts/default.py:67: in principal
    return self.request.app.principal
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
.../onegov/election_day/app.py:63: in principal
    return self.cache.get_or_create('principal', self.load_principal)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
............................................................................................................................../app/lib/python3.14.../dogpile/cache/region.py:1097: in get_or_create
    with Lock(
............................................................................................................................../app/lib/python3.14............/site-packages/dogpile/lock.py:185: in __enter__
    return self._enter()
           ^^^^^^^^^^^^^
............................................................................................................................../app/lib/python3.14............/site-packages/dogpile/lock.py:87: in _enter
    value = value_fn()
            ^^^^^^^^^^
............................................................................................................................../app/lib/python3.14.../dogpile/cache/region.py:1033: in get_value
    value = self._get_from_backend(key)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^
............................................................................................................................../app/lib/python3.14.../dogpile/cache/region.py:1325: in _get_from_backend
    self.backend.get_serialized(key)
............................................................................................................................../app/lib/python3.14.../cache/backends/redis.py:262: in get_serialized
    value = self.reader_client.get(key)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^
............................................................................................................................../app/lib/python3.14.../redis/commands/core.py:3194: in get
    return self.execute_command("GET", name, keys=[name])
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
............................................................................................................................../app/lib/python3.14............................../site-packages/redis/client.py:787: in execute_command
    return self._execute_command(*args, **options)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
............................................................................................................................../app/lib/python3.14............................../site-packages/redis/client.py:809: in _execute_command
    result = conn.retry.call_with_retry(
............................................................................................................................../app/lib/python3.14............/site-packages/redis/retry.py:132: in call_with_retry
    raise error
............................................................................................................................../app/lib/python3.14............/site-packages/redis/retry.py:120: in call_with_retry
    return do()
           ^^^^
............................................................................................................................../app/lib/python3.14............................../site-packages/redis/client.py:810: in <lambda>
    lambda: self._send_command_parse_response(
............................................................................................................................../app/lib/python3.14............................../site-packages/redis/client.py:753: in _send_command_parse_response
    return self.parse_response(conn, command_name, **options)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
............................................................................................................................../app/lib/python3.14............................../site-packages/redis/client.py:853: in parse_response
    response = connection.read_response()
               ^^^^^^^^^^^^^^^^^^^^^^^^^^
............................................................................................................................../app/lib/python3.14....../site-packages/redis/connection.py:1371: in read_response
    response = self._parser.read_response(
............................................................................................................................../app/lib/python3.14.../redis/_parsers/hiredis.py:151: in read_response
    self.read_from_socket(timeout=timeout)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <redis._parsers.hiredis._HiredisParser object at 0x7f8c15cf7bb0>
timeout = <object object at 0x7f8c50b81cf0>, raise_on_timeout = True

    def read_from_socket(self, timeout=SENTINEL, raise_on_timeout=True):
        sock = self._sock
        custom_timeout = timeout is not SENTINEL
        try:
            if custom_timeout:
                sock.settimeout(timeout)
            bufflen = self._sock.recv_into(self._buffer)
            if bufflen == 0:
>               raise ConnectionError(SERVER_CLOSED_CONNECTION_ERROR)
E               redis.exceptions.ConnectionError: redis.exceptions.ConnectionError: Connection closed by server.
E               
E                - Expression: "layout.principal.label('entity')"
E                - Filename:   ... .../election_day/templates/macros.pt
E                - Location:   (line 799: col 95)
E                - Source:     ... n:translate="">${layout.principal.label('entity')}</th>
E                                                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
E                - Expression: "layout.macros['election-candidates-by-entity-table']"
E                - Filename:   <string>
E                - Location:   (line 10: col 60)
E                - Arguments:  layout: <ElectionLayout ('None',) at 0x7f8c14e23d90>
E                              request: <DummyRequest ('None',) at 0x7f8c15062830>
E                              model: <Election ('None',) at 0x7f8c12490150>
E                              entities: Baar, Cham, Hünenberg, Menzingen
E                              election: <Election ('None',) at 0x7f8c12490150>
E                              candidates_by_entites: <tuple ('None',) at 0x7f8c12094540>
E                              embed: False
E                              candidates: <list ('None',) at 0x7f8c13e16440>
E                              target_language: <NoneType ('None',) at 0xa1f2e0>
E                              repeat: <RepeatDict ('None',) at 0x7f8c150c9ab0>
E                              macroname: layout.macros['election-candidates-by-entity-table']

............................................................................................................................../app/lib/python3.14.../redis/_parsers/hiredis.py:111: ConnectionError
tests/onegov/town6/test_views.py::test_clipboard
Stack Traces | 17.9s run time
__stream = ['<!DOCTYPE html>\n', '<html', '\n    class="no-js"', '\n    lang="de-CH"', '\n    xmlns="http://www.w3.org/1999/xhtml"', ' data-version="2026.28"', ...]
econtext = {'request': <OrgRequest at 0x7f29ac0aa8b0 GET http:.../localhost/auth/login>, 'translate': <function ChameleonTranslate....': "layout.macros['side_navigation']", '__slot_title': deque([]), '__slot_content': deque([]), 'cls': 'default-layout'}
rcontext = {'__error__': [('top_navigation|layout.top_navigation', 93, 192, '.../onegov/town6/temp...('layout.base', 1, 22, '.../town6/templates/login.pt', network:ConnectionError)]}
__i18n_domain = 'onegov.town6', __i18n_context = None, target_language = None

>   ???

macros_8c870b4b23e8841b5021b09750590eba.py:4941: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = {'request': <OrgRequest at 0x7f29ac0aa8b0 GET http:.../localhost/auth/login>, 'translate': <function ChameleonTranslate....': "layout.macros['side_navigation']", '__slot_title': deque([]), '__slot_content': deque([]), 'cls': 'default-layout'}
key = 'top_navigation'

    def get_name(self, key: str) -> Any:
        value = self.get(key, marker)
        if value is marker:
>           raise NameError(key)
E           NameError: top_navigation

................................................................................................................................................................................./app/lib/python3.14............/site-packages/chameleon/utils.py:470: NameError

During handling of the above exception, another exception occurred:

self = <PageTemplateFile .../town6/templates/login.pt>
_BaseTemplate__kw = {'Markup': <class 'markupsafe.Markup'>, '__decode': <method 'decode' of 'bytes' objects>, '__on_error_handler': None, '__translate': <function ChameleonTranslate.<locals>.translate at 0x7f29abfb0ca0>, ...}
econtext = {'request': <OrgRequest at 0x7f29ac0aa8b0 GET http:.../localhost/auth/login>, 'translate': <function ChameleonTranslate....peatDict object at 0x7f29b06be440>, 'macroname': 'layout.base', '__slot_title': deque([]), '__slot_content': deque([])}
rcontext = {'__error__': [('top_navigation|layout.top_navigation', 93, 192, '.../onegov/town6/temp...('layout.base', 1, 22, '.../town6/templates/login.pt', network:ConnectionError)]}
stream = ['<!DOCTYPE html>\n', '<html', '\n    class="no-js"', '\n    lang="de-CH"', '\n    xmlns="http://www.w3.org/1999/xhtml"', ' data-version="2026.28"', ...]
target_language = None, cls = <class 'redis.exceptions.ConnectionError'>

    def render(self, **__kw: Any) -> str:
        econtext = Scope(__kw)
        rcontext: dict[str, Any] = {}
        self.cook_check()
        stream = self.output_stream_factory()
        target_language = __kw.get("target_language")
        try:
>           self._render(
                stream,
                econtext,
                rcontext,
                target_language=target_language
            )

................................................................................................................................................................................./app/lib/python3.14........./site-packages/chameleon/template.py:238: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
login_c3d1b3b650723ae3d4a74eefcf8377e6.py:774: in render
    ???
................................................................................................................................................................................./app/lib/python3.14.../chameleon/zpt/template.py:363: in include
    self._render(*args, **kwargs)
layout_7ed8e5de102a27bc4465253098fe70c9.py:2606: in render
    ???
layout_7ed8e5de102a27bc4465253098fe70c9.py:933: in render_layout
    ???
macros_8c870b4b23e8841b5021b09750590eba.py:4943: in render_side_navigation
    ???
................................................................................................................................................................................./app/lib/python3.14............/site-packages/chameleon/utils.py:517: in lookup_attr
    return getattr(obj, key)
           ^^^^^^^^^^^^^^^^^
....../usr/lib/python3.14/functools.py:1126: in __get__
    val = self.func(instance)
          ^^^^^^^^^^^^^^^^^^^
.../onegov/town6/layout.py:242: in top_navigation
    return tuple(yield_children(page) for page in self.root_pages)
                                                  ^^^^^^^^^^^^^^^
.../onegov/org/layout.py:927: in root_pages
    return self.request.root_pages
           ^^^^^^^^^^^^^^^^^^^^^^^
.../core/orm/cache.py:386: in __get__
    return self.load(instance)
           ^^^^^^^^^^^^^^^^^^^
.../core/orm/cache.py:337: in load
    obj = app.cache.get_or_create(
................................................................................................................................................................................./app/lib/python3.14.../dogpile/cache/region.py:1097: in get_or_create
    with Lock(
................................................................................................................................................................................./app/lib/python3.14............/site-packages/dogpile/lock.py:185: in __enter__
    return self._enter()
           ^^^^^^^^^^^^^
................................................................................................................................................................................./app/lib/python3.14............/site-packages/dogpile/lock.py:87: in _enter
    value = value_fn()
            ^^^^^^^^^^
................................................................................................................................................................................./app/lib/python3.14.../dogpile/cache/region.py:1033: in get_value
    value = self._get_from_backend(key)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................................./app/lib/python3.14.../dogpile/cache/region.py:1325: in _get_from_backend
    self.backend.get_serialized(key)
................................................................................................................................................................................./app/lib/python3.14.../cache/backends/redis.py:262: in get_serialized
    value = self.reader_client.get(key)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................................./app/lib/python3.14.../redis/commands/core.py:3194: in get
    return self.execute_command("GET", name, keys=[name])
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................................./app/lib/python3.14............................../site-packages/redis/client.py:787: in execute_command
    return self._execute_command(*args, **options)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................................./app/lib/python3.14............................../site-packages/redis/client.py:809: in _execute_command
    result = conn.retry.call_with_retry(
................................................................................................................................................................................./app/lib/python3.14............/site-packages/redis/retry.py:132: in call_with_retry
    raise error
................................................................................................................................................................................./app/lib/python3.14............/site-packages/redis/retry.py:120: in call_with_retry
    return do()
           ^^^^
................................................................................................................................................................................./app/lib/python3.14............................../site-packages/redis/client.py:810: in <lambda>
    lambda: self._send_command_parse_response(
................................................................................................................................................................................./app/lib/python3.14............................../site-packages/redis/client.py:753: in _send_command_parse_response
    return self.parse_response(conn, command_name, **options)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................................./app/lib/python3.14............................../site-packages/redis/client.py:853: in parse_response
    response = connection.read_response()
               ^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................................./app/lib/python3.14....../site-packages/redis/connection.py:1371: in read_response
    response = self._parser.read_response(
................................................................................................................................................................................./app/lib/python3.14.../redis/_parsers/hiredis.py:151: in read_response
    self.read_from_socket(timeout=timeout)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <redis._parsers.hiredis._HiredisParser object at 0x7f29b6eae120>
timeout = <object object at 0x7f29f2ce1cf0>, raise_on_timeout = True

    def read_from_socket(self, timeout=SENTINEL, raise_on_timeout=True):
        sock = self._sock
        custom_timeout = timeout is not SENTINEL
        try:
            if custom_timeout:
                sock.settimeout(timeout)
            bufflen = self._sock.recv_into(self._buffer)
            if bufflen == 0:
>               raise ConnectionError(SERVER_CLOSED_CONNECTION_ERROR)
E               redis.exceptions.ConnectionError: Connection closed by server.

................................................................................................................................................................................./app/lib/python3.14.../redis/_parsers/hiredis.py:111: ConnectionError

During handling of the above exception, another exception occurred:

client = <tests.onegov.town6.conftest.Client object at 0x7f29ac0fae90>

    def test_clipboard(client: Client) -> None:
>       client.login_admin()

.../onegov/town6/test_views.py:54: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
tests/shared/client.py:66: in login_admin
    return self.login('admin@example.org', 'hunter2', to)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
tests/shared/client.py:60: in login
    login_page = self.get(url)
                 ^^^^^^^^^^^^^
................................................................................................................................................................................./app/lib/python3.14....../site-packages/webtest/app.py:328: in get
    return self.do_request(req, status=status,
tests/shared/client.py:159: in do_request
    return self.extend_response(super().do_request(*args, **kwargs))
                                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................................./app/lib/python3.14....../site-packages/webtest/app.py:627: in do_request
    res = req.get_response(app, catch_exc_info=True)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................................./app/lib/python3.14....../site-packages/webob/request.py:1309: in send
    status, headers, app_iter, exc_info = self.call_application(
................................................................................................................................................................................./app/lib/python3.14....../site-packages/webob/request.py:1278: in call_application
    app_iter = application(self.environ, start_response)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................................./app/lib/python3.14.../site-packages/webtest/lint.py:196: in lint_app
    iterator = application(environ, start_response_wrapper)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.../onegov/core/framework.py:219: in with_request_cache_wrapper
    return fn(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^
.../onegov/core/framework.py:234: in with_print_exceptions_wrapper
    return fn(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................................./app/lib/python3.14.../site-packages/morepath/app.py:138: in __call__
    response = self.publish(request)
               ^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................................./app/lib/python3.14....../site-packages/morepath/core.py:201: in poisoned_host_header_protection_tween
    return handler(request)
           ^^^^^^^^^^^^^^^^
.../onegov/core/framework.py:1765: in http_conflict_tween
    return handler(request)
           ^^^^^^^^^^^^^^^^
.../onegov/core/framework.py:1790: in activate_session_manager
    return handler(request)
           ^^^^^^^^^^^^^^^^
.../onegov/core/framework.py:1808: in close_session_after_request
    return handler(request)
           ^^^^^^^^^^^^^^^^
.../onegov/file/integration.py:477: in configure_depot_tween
    return handler(request)
           ^^^^^^^^^^^^^^^^
................................................................................................................................................................................./app/lib/python3.14.../more/transaction/main.py:67: in transaction_tween
    response = handler(request)
               ^^^^^^^^^^^^^^^^
.../onegov/core/framework.py:1628: in fix_webassets_url
    response = handler(request)
               ^^^^^^^^^^^^^^^^
.../onegov/user/integration.py:376: in auto_login_tween
    return handler(request)
           ^^^^^^^^^^^^^^^^
................................................................................................................................................................................./app/lib/python3.14.../more/webassets/tweens.py:132: in __call__
    return self.handler(request)
           ^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................................./app/lib/python3.14.../more/webassets/tweens.py:84: in __call__
    response = self.handler(request)
               ^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................................./app/lib/python3.14....../site-packages/morepath/core.py:157: in excview_tween
    response = handler(request)
               ^^^^^^^^^^^^^^^^
................................................................................................................................................................................./app/lib/python3.14.../more/content_security/core.py:99: in content_security_policy_tween
    response = handler(request)
               ^^^^^^^^^^^^^^^^
.../onegov/core/framework.py:1833: in current_language_tween
    return handler(request)
           ^^^^^^^^^^^^^^^^
.../onegov/core/framework.py:1875: in set_cache_control_header_tween
    response = handler(request)
               ^^^^^^^^^^^^^^^^
.../onegov/gis/integration.py:139: in inject_mapbox_api_token_tween
    response = handler(request)
               ^^^^^^^^^^^^^^^^
.../onegov/websockets/integration.py:151: in websocket_csp_tween
    result = handler(request)
             ^^^^^^^^^^^^^^^^
.../onegov/org/app.py:751: in enable_iframes_tween
    result = handler(request)
             ^^^^^^^^^^^^^^^^
................................................................................................................................................................................./app/lib/python3.14....../site-packages/morepath/publish.py:38: in publish
    return resolve_response(obj, request)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................................./app/lib/python3.14....../site-packages/morepath/publish.py:93: in resolve_response
    return request.app.get_view(obj, request)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
<generated code: def call(self, obj, request):
    _key = _registry_key(self=self, obj=obj, request=request)
    return (_component_lookup(_key) or
            _fallback_lookup(_key) or
            _fallback)(self, obj, request)
>:3: in call
    ???
.../onegov/org/app.py:991: in wrapped
    response = func(self, obj, request)
               ^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................................./app/lib/python3.14.../site-packages/morepath/view.py:87: in __call__
    response = self.render(content, request)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.../onegov/core/templates.py:220: in render
    return original_render(template.render(**variables), request)
                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................................./app/lib/python3.14.../chameleon/zpt/template.py:359: in render
    return super().render(**_kw)
           ^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................................./app/lib/python3.14........./site-packages/chameleon/template.py:268: in render
    raise_with_traceback(exc, tb)
................................................................................................................................................................................./app/lib/python3.14............/site-packages/chameleon/utils.py:52: in raise_with_traceback
    raise exc
................................................................................................................................................................................./app/lib/python3.14........./site-packages/chameleon/template.py:238: in render
    self._render(
login_c3d1b3b650723ae3d4a74eefcf8377e6.py:774: in render
    ???
................................................................................................................................................................................./app/lib/python3.14.../chameleon/zpt/template.py:363: in include
    self._render(*args, **kwargs)
layout_7ed8e5de102a27bc4465253098fe70c9.py:2606: in render
    ???
layout_7ed8e5de102a27bc4465253098fe70c9.py:933: in render_layout
    ???
macros_8c870b4b23e8841b5021b09750590eba.py:4943: in render_side_navigation
    ???
................................................................................................................................................................................./app/lib/python3.14............/site-packages/chameleon/utils.py:517: in lookup_attr
    return getattr(obj, key)
           ^^^^^^^^^^^^^^^^^
....../usr/lib/python3.14/functools.py:1126: in __get__
    val = self.func(instance)
          ^^^^^^^^^^^^^^^^^^^
.../onegov/town6/layout.py:242: in top_navigation
    return tuple(yield_children(page) for page in self.root_pages)
                                                  ^^^^^^^^^^^^^^^
.../onegov/org/layout.py:927: in root_pages
    return self.request.root_pages
           ^^^^^^^^^^^^^^^^^^^^^^^
.../core/orm/cache.py:386: in __get__
    return self.load(instance)
           ^^^^^^^^^^^^^^^^^^^
.../core/orm/cache.py:337: in load
    obj = app.cache.get_or_create(
................................................................................................................................................................................./app/lib/python3.14.../dogpile/cache/region.py:1097: in get_or_create
    with Lock(
................................................................................................................................................................................./app/lib/python3.14............/site-packages/dogpile/lock.py:185: in __enter__
    return self._enter()
           ^^^^^^^^^^^^^
................................................................................................................................................................................./app/lib/python3.14............/site-packages/dogpile/lock.py:87: in _enter
    value = value_fn()
            ^^^^^^^^^^
................................................................................................................................................................................./app/lib/python3.14.../dogpile/cache/region.py:1033: in get_value
    value = self._get_from_backend(key)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................................./app/lib/python3.14.../dogpile/cache/region.py:1325: in _get_from_backend
    self.backend.get_serialized(key)
................................................................................................................................................................................./app/lib/python3.14.../cache/backends/redis.py:262: in get_serialized
    value = self.reader_client.get(key)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................................./app/lib/python3.14.../redis/commands/core.py:3194: in get
    return self.execute_command("GET", name, keys=[name])
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................................./app/lib/python3.14............................../site-packages/redis/client.py:787: in execute_command
    return self._execute_command(*args, **options)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................................./app/lib/python3.14............................../site-packages/redis/client.py:809: in _execute_command
    result = conn.retry.call_with_retry(
................................................................................................................................................................................./app/lib/python3.14............/site-packages/redis/retry.py:132: in call_with_retry
    raise error
................................................................................................................................................................................./app/lib/python3.14............/site-packages/redis/retry.py:120: in call_with_retry
    return do()
           ^^^^
................................................................................................................................................................................./app/lib/python3.14............................../site-packages/redis/client.py:810: in <lambda>
    lambda: self._send_command_parse_response(
................................................................................................................................................................................./app/lib/python3.14............................../site-packages/redis/client.py:753: in _send_command_parse_response
    return self.parse_response(conn, command_name, **options)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................................./app/lib/python3.14............................../site-packages/redis/client.py:853: in parse_response
    response = connection.read_response()
               ^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................................./app/lib/python3.14....../site-packages/redis/connection.py:1371: in read_response
    response = self._parser.read_response(
................................................................................................................................................................................./app/lib/python3.14.../redis/_parsers/hiredis.py:151: in read_response
    self.read_from_socket(timeout=timeout)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <redis._parsers.hiredis._HiredisParser object at 0x7f29b6eae120>
timeout = <object object at 0x7f29f2ce1cf0>, raise_on_timeout = True

    def read_from_socket(self, timeout=SENTINEL, raise_on_timeout=True):
        sock = self._sock
        custom_timeout = timeout is not SENTINEL
        try:
            if custom_timeout:
                sock.settimeout(timeout)
            bufflen = self._sock.recv_into(self._buffer)
            if bufflen == 0:
>               raise ConnectionError(SERVER_CLOSED_CONNECTION_ERROR)
E               redis.exceptions.ConnectionError: redis.exceptions.ConnectionError: Connection closed by server.
E               
E                - Expression: "top_navigation|layout.top_navigation"
E                - Filename:   ... .../town6/templates/macros.pt
E                - Location:   (line 93: col 192)
E                - Source:     ... :define="links top_navigation|layout.top_navigation">
E                                                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
E                - Expression: "layout.macros['side_navigation']"
E                - Filename:   ... .../town6/templates/layout.pt
E                - Location:   (line 54: col 36)
E                - Source:     ... metal:use-macro="layout.macros['side_navigation']"></tal:b>
E                                                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
E                - Expression: "layout.base"
E                - Filename:   ... .../town6/templates/login.pt
E                - Location:   (line 1: col 22)
E                - Source:     <div metal:use-macro="layout.base" i18n:domain="onegov.town6 ...
E                                                    ^^^^^^^^^^^
E                - Arguments:  request: <OrgRequest ('None',) at 0x7f29ac0aa8b0>
E                              translate: <function ('translate',) at 0x7f29abfb0ca0>
E                              escape: <function ('escape',) at 0x7f29e65fc3b0>
E                              Markup: <type ('Markup',) at 0x201528b0>
E                              layout: <DefaultLayout ('None',) at 0x7f29b50a2210>
E                              password_reset_link: http:.../localhost/auth/request-password?skip=0&to=%2F
E                              register_link: http:.../localhost/auth/register?skip=0&to=%2F
E                              may_register: False
E                              button_text: Login
E                              providers: <dict_values ('None',) at 0x7f29b0040af0>
E                              provider_login: <function ('provider_login',) at 0x7f29abfb1170>
E                              render_untrusted_markdown: <function ('render_untrusted_markdown',) at 0x7f29c70547d0>
E                              title: Login to ${org}
E                              form: <TranslationBoundForm ('None',) at 0x7f29b4db5010>
E                              global_tools: <tuple ('None',) at 0xa6def0>
E                              modules: <LinkGroup ('None',) at 0x7f29b260b970>
E                              target_language: <NoneType ('None',) at 0xa1f2e0>
E                              repeat: <RepeatDict ('None',) at 0x7f29b06be440>
E                              macroname: layout.base

................................................................................................................................................................................./app/lib/python3.14.../redis/_parsers/hiredis.py:111: ConnectionError
tests/onegov/feriennet/test_sponsors.py::test_random_sponsors_at_activities
Stack Traces | 19.7s run time
self = <PageTemplateFile .../town6/templates/login.pt>
_BaseTemplate__kw = {'Markup': <class 'markupsafe.Markup'>, '__decode': <method 'decode' of 'bytes' objects>, '__on_error_handler': None, '__translate': <function ChameleonTranslate.<locals>.translate at 0x7fb2ee039590>, ...}
econtext = {'request': <FeriennetRequest at 0x7fb2ee4fc1a0 GET http:.../localhost/auth/login>, 'translate': <function ChameleonTran...peatDict object at 0x7fb2ee013fa0>, 'macroname': 'layout.base', '__slot_title': deque([]), '__slot_content': deque([])}
rcontext = {'__error__': [('request.consume_messages()', 30, 29, '.../town6/templates/macro...('layout.base', 1, 22, '.../town6/templates/login.pt', network:ConnectionError)]}
stream = ['<!DOCTYPE html>\n', '<html', '\n    class="no-js"', '\n    lang="de-CH"', '\n    xmlns="http://www.w3.org/1999/xhtml"', ' data-version="2026.28"', ...]
target_language = None, cls = <class 'redis.exceptions.ConnectionError'>

    def render(self, **__kw: Any) -> str:
        econtext = Scope(__kw)
        rcontext: dict[str, Any] = {}
        self.cook_check()
        stream = self.output_stream_factory()
        target_language = __kw.get("target_language")
        try:
>           self._render(
                stream,
                econtext,
                rcontext,
                target_language=target_language
            )

................................................................................................................................................................../app/lib/python3.14........./site-packages/chameleon/template.py:238: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
login_c3d1b3b650723ae3d4a74eefcf8377e6.py:774: in render
    ???
................................................................................................................................................................../app/lib/python3.14.../chameleon/zpt/template.py:363: in include
    self._render(*args, **kwargs)
layout_cf1670105536ab5f20ce7b65fc52861d.py:2611: in render
    ???
layout_cf1670105536ab5f20ce7b65fc52861d.py:2185: in render_layout
    ???
macros_8c870b4b23e8841b5021b09750590eba.py:3795: in render_consume_messages
    ???
................................................................................................................................................................../app/lib/python3.14....../site-packages/chameleon/tal.py:436: in __call__
    iterable = list(iterable) if iterable is not None else ()
               ^^^^^^^^^^^^^^
.../onegov/core/request.py:635: in consume_messages
    yield from self.browser_session.pop('messages', ())
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.../onegov/core/browser_session.py:150: in pop
    value = self.get(name, default=default)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.../onegov/core/browser_session.py:183: in get
    result = self._get(name)
             ^^^^^^^^^^^^^^^
.../onegov/core/browser_session.py:124: in _get
    return self._cache.get(name)
           ^^^^^^^^^^^^^^^^^^^^^
.../onegov/core/browser_session.py:34: in get
    return self.cache.get(self.mangle(key))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14.../dogpile/cache/region.py:783: in get
    value = self._get_cache_value(key, expiration_time, ignore_expiration)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14.../dogpile/cache/region.py:821: in _get_cache_value
    value = self._get_from_backend(key)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14.../dogpile/cache/region.py:1325: in _get_from_backend
    self.backend.get_serialized(key)
................................................................................................................................................................../app/lib/python3.14.../cache/backends/redis.py:262: in get_serialized
    value = self.reader_client.get(key)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14.../redis/commands/core.py:3194: in get
    return self.execute_command("GET", name, keys=[name])
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14............................../site-packages/redis/client.py:787: in execute_command
    return self._execute_command(*args, **options)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14............................../site-packages/redis/client.py:809: in _execute_command
    result = conn.retry.call_with_retry(
................................................................................................................................................................../app/lib/python3.14............/site-packages/redis/retry.py:132: in call_with_retry
    raise error
................................................................................................................................................................../app/lib/python3.14............/site-packages/redis/retry.py:120: in call_with_retry
    return do()
           ^^^^
................................................................................................................................................................../app/lib/python3.14............................../site-packages/redis/client.py:810: in <lambda>
    lambda: self._send_command_parse_response(
................................................................................................................................................................../app/lib/python3.14............................../site-packages/redis/client.py:753: in _send_command_parse_response
    return self.parse_response(conn, command_name, **options)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14............................../site-packages/redis/client.py:853: in parse_response
    response = connection.read_response()
               ^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14....../site-packages/redis/connection.py:1371: in read_response
    response = self._parser.read_response(
................................................................................................................................................................../app/lib/python3.14.../redis/_parsers/hiredis.py:151: in read_response
    self.read_from_socket(timeout=timeout)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <redis._parsers.hiredis._HiredisParser object at 0x7fb2ee4fe660>
timeout = <object object at 0x7fb329171cf0>, raise_on_timeout = True

    def read_from_socket(self, timeout=SENTINEL, raise_on_timeout=True):
        sock = self._sock
        custom_timeout = timeout is not SENTINEL
        try:
            if custom_timeout:
                sock.settimeout(timeout)
            bufflen = self._sock.recv_into(self._buffer)
            if bufflen == 0:
>               raise ConnectionError(SERVER_CLOSED_CONNECTION_ERROR)
E               redis.exceptions.ConnectionError: Connection closed by server.

................................................................................................................................................................../app/lib/python3.14.../redis/_parsers/hiredis.py:111: ConnectionError

During handling of the above exception, another exception occurred:

client = <tests.onegov.feriennet.conftest.Client object at 0x7fb2f0222510>
scenario = <tests.onegov.activity.conftest.Scenario object at 0x7fb2ee2ca0d0>

    def test_random_sponsors_at_activities(
        client: Client,
        scenario: Scenario
    ) -> None:
    
>       client.login_admin()

.../onegov/feriennet/test_sponsors.py:136: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
tests/shared/client.py:66: in login_admin
    return self.login('admin@example.org', 'hunter2', to)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
tests/shared/client.py:60: in login
    login_page = self.get(url)
                 ^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14....../site-packages/webtest/app.py:328: in get
    return self.do_request(req, status=status,
tests/shared/client.py:159: in do_request
    return self.extend_response(super().do_request(*args, **kwargs))
                                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14....../site-packages/webtest/app.py:627: in do_request
    res = req.get_response(app, catch_exc_info=True)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14....../site-packages/webob/request.py:1309: in send
    status, headers, app_iter, exc_info = self.call_application(
................................................................................................................................................................../app/lib/python3.14....../site-packages/webob/request.py:1278: in call_application
    app_iter = application(self.environ, start_response)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14.../site-packages/webtest/lint.py:196: in lint_app
    iterator = application(environ, start_response_wrapper)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.../onegov/core/framework.py:219: in with_request_cache_wrapper
    return fn(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^
.../onegov/core/framework.py:234: in with_print_exceptions_wrapper
    return fn(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14.../site-packages/morepath/app.py:138: in __call__
    response = self.publish(request)
               ^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14....../site-packages/morepath/core.py:201: in poisoned_host_header_protection_tween
    return handler(request)
           ^^^^^^^^^^^^^^^^
.../onegov/core/framework.py:1765: in http_conflict_tween
    return handler(request)
           ^^^^^^^^^^^^^^^^
.../onegov/core/framework.py:1790: in activate_session_manager
    return handler(request)
           ^^^^^^^^^^^^^^^^
.../onegov/core/framework.py:1808: in close_session_after_request
    return handler(request)
           ^^^^^^^^^^^^^^^^
.../onegov/file/integration.py:477: in configure_depot_tween
    return handler(request)
           ^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14.../more/transaction/main.py:67: in transaction_tween
    response = handler(request)
               ^^^^^^^^^^^^^^^^
.../onegov/core/framework.py:1628: in fix_webassets_url
    response = handler(request)
               ^^^^^^^^^^^^^^^^
.../onegov/user/integration.py:376: in auto_login_tween
    return handler(request)
           ^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14.../more/webassets/tweens.py:132: in __call__
    return self.handler(request)
           ^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14.../more/webassets/tweens.py:84: in __call__
    response = self.handler(request)
               ^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14....../site-packages/morepath/core.py:157: in excview_tween
    response = handler(request)
               ^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14.../more/content_security/core.py:99: in content_security_policy_tween
    response = handler(request)
               ^^^^^^^^^^^^^^^^
.../onegov/core/framework.py:1833: in current_language_tween
    return handler(request)
           ^^^^^^^^^^^^^^^^
.../onegov/core/framework.py:1875: in set_cache_control_header_tween
    response = handler(request)
               ^^^^^^^^^^^^^^^^
.../onegov/gis/integration.py:139: in inject_mapbox_api_token_tween
    response = handler(request)
               ^^^^^^^^^^^^^^^^
.../onegov/websockets/integration.py:151: in websocket_csp_tween
    result = handler(request)
             ^^^^^^^^^^^^^^^^
.../onegov/org/app.py:751: in enable_iframes_tween
    result = handler(request)
             ^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14....../site-packages/morepath/publish.py:38: in publish
    return resolve_response(obj, request)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14....../site-packages/morepath/publish.py:93: in resolve_response
    return request.app.get_view(obj, request)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
<generated code: def call(self, obj, request):
    _key = _registry_key(self=self, obj=obj, request=request)
    return (_component_lookup(_key) or
            _fallback_lookup(_key) or
            _fallback)(self, obj, request)
>:3: in call
    ???
.../onegov/org/app.py:991: in wrapped
    response = func(self, obj, request)
               ^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14.../site-packages/morepath/view.py:87: in __call__
    response = self.render(content, request)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.../onegov/core/templates.py:220: in render
    return original_render(template.render(**variables), request)
                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14.../chameleon/zpt/template.py:359: in render
    return super().render(**_kw)
           ^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14........./site-packages/chameleon/template.py:268: in render
    raise_with_traceback(exc, tb)
................................................................................................................................................................../app/lib/python3.14.../site-packages/chameleon/utils.py:52: in raise_with_traceback
    raise exc
................................................................................................................................................................../app/lib/python3.14........./site-packages/chameleon/template.py:238: in render
    self._render(
login_c3d1b3b650723ae3d4a74eefcf8377e6.py:774: in render
    ???
................................................................................................................................................................../app/lib/python3.14.../chameleon/zpt/template.py:363: in include
    self._render(*args, **kwargs)
layout_cf1670105536ab5f20ce7b65fc52861d.py:2611: in render
    ???
layout_cf1670105536ab5f20ce7b65fc52861d.py:2185: in render_layout
    ???
macros_8c870b4b23e8841b5021b09750590eba.py:3795: in render_consume_messages
    ???
................................................................................................................................................................../app/lib/python3.14....../site-packages/chameleon/tal.py:436: in __call__
    iterable = list(iterable) if iterable is not None else ()
               ^^^^^^^^^^^^^^
.../onegov/core/request.py:635: in consume_messages
    yield from self.browser_session.pop('messages', ())
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.../onegov/core/browser_session.py:150: in pop
    value = self.get(name, default=default)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.../onegov/core/browser_session.py:183: in get
    result = self._get(name)
             ^^^^^^^^^^^^^^^
.../onegov/core/browser_session.py:124: in _get
    return self._cache.get(name)
           ^^^^^^^^^^^^^^^^^^^^^
.../onegov/core/browser_session.py:34: in get
    return self.cache.get(self.mangle(key))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14.../dogpile/cache/region.py:783: in get
    value = self._get_cache_value(key, expiration_time, ignore_expiration)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14.../dogpile/cache/region.py:821: in _get_cache_value
    value = self._get_from_backend(key)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14.../dogpile/cache/region.py:1325: in _get_from_backend
    self.backend.get_serialized(key)
................................................................................................................................................................../app/lib/python3.14.../cache/backends/redis.py:262: in get_serialized
    value = self.reader_client.get(key)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14.../redis/commands/core.py:3194: in get
    return self.execute_command("GET", name, keys=[name])
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14............................../site-packages/redis/client.py:787: in execute_command
    return self._execute_command(*args, **options)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14............................../site-packages/redis/client.py:809: in _execute_command
    result = conn.retry.call_with_retry(
................................................................................................................................................................../app/lib/python3.14............/site-packages/redis/retry.py:132: in call_with_retry
    raise error
................................................................................................................................................................../app/lib/python3.14............/site-packages/redis/retry.py:120: in call_with_retry
    return do()
           ^^^^
................................................................................................................................................................../app/lib/python3.14............................../site-packages/redis/client.py:810: in <lambda>
    lambda: self._send_command_parse_response(
................................................................................................................................................................../app/lib/python3.14............................../site-packages/redis/client.py:753: in _send_command_parse_response
    return self.parse_response(conn, command_name, **options)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14............................../site-packages/redis/client.py:853: in parse_response
    response = connection.read_response()
               ^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14....../site-packages/redis/connection.py:1371: in read_response
    response = self._parser.read_response(
................................................................................................................................................................../app/lib/python3.14.../redis/_parsers/hiredis.py:151: in read_response
    self.read_from_socket(timeout=timeout)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <redis._parsers.hiredis._HiredisParser object at 0x7fb2ee4fe660>
timeout = <object object at 0x7fb329171cf0>, raise_on_timeout = True

    def read_from_socket(self, timeout=SENTINEL, raise_on_timeout=True):
        sock = self._sock
        custom_timeout = timeout is not SENTINEL
        try:
            if custom_timeout:
                sock.settimeout(timeout)
            bufflen = self._sock.recv_into(self._buffer)
            if bufflen == 0:
>               raise ConnectionError(SERVER_CLOSED_CONNECTION_ERROR)
E               redis.exceptions.ConnectionError: redis.exceptions.ConnectionError: Connection closed by server.
E               
E                - Expression: "request.consume_messages()"
E                - Filename:   ... .../town6/templates/macros.pt
E                - Location:   (line 30: col 29)
E                - Source:     ... :repeat="message request.consume_messages()" data-closable c ...
E                                                   ^^^^^^^^^^^^^^^^^^^^^^^^^^
E                - Expression: "layout.macros['consume_messages']"
E                - Filename:   ... .../feriennet/templates/layout.pt
E                - Location:   (line 197: col 52)
E                - Source:     ... metal:use-macro="layout.macros['consume_messages']" />
E                                                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
E                - Expression: "layout.base"
E                - Filename:   ... .../town6/templates/login.pt
E                - Location:   (line 1: col 22)
E                - Source:     <div metal:use-macro="layout.base" i18n:domain="onegov.town6 ...
E                                                    ^^^^^^^^^^^
E                - Arguments:  request: <FeriennetRequest ('None',) at 0x7fb2ee4fc1a0>
E                              translate: <function ('translate',) at 0x7fb2ee039590>
E                              escape: <function ('escape',) at 0x7fb31caa83b0>
E                              Markup: <type ('Markup',) at 0x2d5024a0>
E                              layout: <DefaultLayout ('None',) at 0x7fb2ee05c6e0>
E                              password_reset_link: http:.../localhost/auth/request-password?skip=0&to=%2F
E                              register_link: http:.../localhost/auth/register?skip=0&to=%2F
E                              may_register: True
E                              button_text: Login
E                              providers: <dict_values ('None',) at 0x7fb2ee41b2e0>
E                              provider_login: <function ('provider_login',) at 0x7fb2ee0392d0>
E                              render_untrusted_markdown: <function ('render_untrusted_markdown',) at 0x7fb2fe7507d0>
E                              title: Login to ${org}
E                              form: <TranslationBoundForm ('None',) at 0x7fb2ee4ffe00>
E                              global_tools: <tuple ('None',) at 0x7fb2edf50780>
E                              top_navigation: <tuple ('None',) at 0x7fb2ee198660>
E                              volunteer_link: <NoneType ('None',) at 0xa1f2e0>
E                              target_language: <NoneType ('None',) at 0xa1f2e0>
E                              repeat: <RepeatDict ('None',) at 0x7fb2ee013fa0>
E                              macroname: layout.base

................................................................................................................................................................../app/lib/python3.14.../redis/_parsers/hiredis.py:111: ConnectionError
tests/onegov/feriennet/test_browser.py::test_browse_matching
Stack Traces | 22.1s run time
browser = <tests.shared.browser.ExtendedBrowser object at 0x7f6b6d7bb230>
scenario = <tests.onegov.activity.conftest.Scenario object at 0x7f6b6c8034d0>

    def test_browse_matching(
        browser: ExtendedBrowser,
        scenario: Scenario
    ) -> None:
    
        scenario.add_period(title="Ferienpass 2016")
    
        for i in range(2):
            scenario.add_activity(title=f"A {i}", state='accepted')
            scenario.add_occasion(age=(0, 10), spots=(2, 4))
    
        dustin = scenario.add_attendee(name="Dustin")
        mike = scenario.add_attendee(name="Mike")
    
        # the first course has enough attendees
        scenario.add_booking(attendee=dustin, occasion=scenario.occasions[0])
        scenario.add_booking(attendee=mike, occasion=scenario.occasions[0])
    
        # the second one does not
        scenario.add_booking(attendee=mike, occasion=scenario.occasions[1])
    
        scenario.commit()
    
>       browser.login_admin()

.../onegov/feriennet/test_browser.py:43: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
tests/shared/browser.py:363: in login_admin
    self.login('admin@example.org', 'hunter2', to)
tests/shared/browser.py:357: in login
    self.visit(url)
tests/shared/browser.py:348: in visit
    self.fail_on_console_errors(sleep_before_fail, expected_errors)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <tests.shared.browser.ExtendedBrowser object at 0x7f6b6d7bb230>
sleep_before = 0, expected_errors = []

    def fail_on_console_errors(
        self,
        sleep_before: float = 0,
        expected_errors: list[dict[str, Any]] | None = None
    ) -> None:
        expected_errors = expected_errors or []
        filters = expected_errors + self.failsafe_filters
        error_msgs = self.get_console_log(filters)
        if error_msgs and environ.get('SHOW_BROWSER') == '1':
            time.sleep(sleep_before)
>       assert not error_msgs, error_msgs
E       AssertionError: [{'level': 'SEVERE', 'message': 'http://127.0.0.1:40273/auth/login - Failed to load resource: the server responded with a status of 500 (INTERNAL SERVER ERROR)', 'source': 'console-api'}]
E       assert not [{'level': 'SEVERE', 'message': 'http://127.0.0.1:40273/auth/login - Failed to load resource: the server responded with a status of 500 (INTERNAL SERVER ERROR)', 'source': 'console-api'}]

tests/shared/browser.py:671: AssertionError
tests/onegov/fsi/test_views_course_event.py::test_cancel_course_event
Stack Traces | 23.6s run time
self = <PageTemplateFile .../town6/templates/login.pt>
_BaseTemplate__kw = {'Markup': <class 'markupsafe.Markup'>, '__decode': <method 'decode' of 'bytes' objects>, '__on_error_handler': None, '__translate': <function ChameleonTranslate.<locals>.translate at 0x7f42050ef110>, ...}
econtext = {'request': <FsiRequest at 0x7f4207c9e660 GET http:.../localhost/auth/login>, 'translate': <function ChameleonTranslate....peatDict object at 0x7f4205537880>, 'macroname': 'layout.base', '__slot_title': deque([]), '__slot_content': deque([])}
rcontext = {'__error__': [('request.is_logged_in or request.authenticated_email', 97, 132, '.../onegov-cloud/src/on...('layout.base', 1, 22, '.../town6/templates/login.pt', network:ConnectionError)]}
stream = ['<!DOCTYPE html>\n', '<html', '\n    class="no-js"', '\n    lang="de-CH"', '\n    xmlns="http://www.w3.org/1999/xhtml"', ' data-version="2026.28"', ...]
target_language = None, cls = <class 'redis.exceptions.ConnectionError'>

    def render(self, **__kw: Any) -> str:
        econtext = Scope(__kw)
        rcontext: dict[str, Any] = {}
        self.cook_check()
        stream = self.output_stream_factory()
        target_language = __kw.get("target_language")
        try:
>           self._render(
                stream,
                econtext,
                rcontext,
                target_language=target_language
            )

................................................................................................................................................................../app/lib/python3.14........./site-packages/chameleon/template.py:238: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
login_c3d1b3b650723ae3d4a74eefcf8377e6.py:774: in render
    ???
................................................................................................................................................................../app/lib/python3.14.../chameleon/zpt/template.py:363: in include
    self._render(*args, **kwargs)
layout_7ed8e5de102a27bc4465253098fe70c9.py:2606: in render
    ???
layout_7ed8e5de102a27bc4465253098fe70c9.py:1192: in render_layout
    ???
................................................................................................................................................................../app/lib/python3.14........./site-packages/chameleon/utils.py:517: in lookup_attr
    return getattr(obj, key)
           ^^^^^^^^^^^^^^^^^
....../usr/lib/python3.14/functools.py:1126: in __get__
    val = self.func(instance)
          ^^^^^^^^^^^^^^^^^^^
.../onegov/org/request.py:142: in authenticated_email
    return self.browser_session.get('authenticated_email')
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.../onegov/core/browser_session.py:183: in get
    result = self._get(name)
             ^^^^^^^^^^^^^^^
.../onegov/core/browser_session.py:124: in _get
    return self._cache.get(name)
           ^^^^^^^^^^^^^^^^^^^^^
.../onegov/core/browser_session.py:34: in get
    return self.cache.get(self.mangle(key))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14.../dogpile/cache/region.py:783: in get
    value = self._get_cache_value(key, expiration_time, ignore_expiration)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14.../dogpile/cache/region.py:821: in _get_cache_value
    value = self._get_from_backend(key)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14.../dogpile/cache/region.py:1325: in _get_from_backend
    self.backend.get_serialized(key)
................................................................................................................................................................../app/lib/python3.14.../cache/backends/redis.py:262: in get_serialized
    value = self.reader_client.get(key)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14.../redis/commands/core.py:3194: in get
    return self.execute_command("GET", name, keys=[name])
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14............................../site-packages/redis/client.py:787: in execute_command
    return self._execute_command(*args, **options)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14............................../site-packages/redis/client.py:809: in _execute_command
    result = conn.retry.call_with_retry(
................................................................................................................................................................../app/lib/python3.14............/site-packages/redis/retry.py:132: in call_with_retry
    raise error
................................................................................................................................................................../app/lib/python3.14............/site-packages/redis/retry.py:120: in call_with_retry
    return do()
           ^^^^
................................................................................................................................................................../app/lib/python3.14............................../site-packages/redis/client.py:810: in <lambda>
    lambda: self._send_command_parse_response(
................................................................................................................................................................../app/lib/python3.14............................../site-packages/redis/client.py:753: in _send_command_parse_response
    return self.parse_response(conn, command_name, **options)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14............................../site-packages/redis/client.py:853: in parse_response
    response = connection.read_response()
               ^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14....../site-packages/redis/connection.py:1371: in read_response
    response = self._parser.read_response(
................................................................................................................................................................../app/lib/python3.14.../redis/_parsers/hiredis.py:151: in read_response
    self.read_from_socket(timeout=timeout)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <redis._parsers.hiredis._HiredisParser object at 0x7f42057a4d70>
timeout = <object object at 0x7f423fba9cf0>, raise_on_timeout = True

    def read_from_socket(self, timeout=SENTINEL, raise_on_timeout=True):
        sock = self._sock
        custom_timeout = timeout is not SENTINEL
        try:
            if custom_timeout:
                sock.settimeout(timeout)
            bufflen = self._sock.recv_into(self._buffer)
            if bufflen == 0:
>               raise ConnectionError(SERVER_CLOSED_CONNECTION_ERROR)
E               redis.exceptions.ConnectionError: Connection closed by server.

................................................................................................................................................................../app/lib/python3.14.../redis/_parsers/hiredis.py:111: ConnectionError

During handling of the above exception, another exception occurred:

client_with_db = <tests.onegov.fsi.conftest.Client object at 0x7f42092b57f0>

    def test_cancel_course_event(client_with_db: Client) -> None:
        client = client_with_db
        session = client.app.session()
        event = session.query(CourseEvent).filter(
            CourseEvent.start > utcnow()).first()
        assert event is not None
    
        wanted_count = event.attendees.count()
    
        view = f'/fsi/event/{event.id}'
>       client.login_admin()

.../onegov/fsi/test_views_course_event.py:185: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
tests/shared/client.py:66: in login_admin
    return self.login('admin@example.org', 'hunter2', to)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
tests/shared/client.py:60: in login
    login_page = self.get(url)
                 ^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14....../site-packages/webtest/app.py:328: in get
    return self.do_request(req, status=status,
tests/shared/client.py:159: in do_request
    return self.extend_response(super().do_request(*args, **kwargs))
                                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14....../site-packages/webtest/app.py:627: in do_request
    res = req.get_response(app, catch_exc_info=True)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14....../site-packages/webob/request.py:1309: in send
    status, headers, app_iter, exc_info = self.call_application(
................................................................................................................................................................../app/lib/python3.14....../site-packages/webob/request.py:1278: in call_application
    app_iter = application(self.environ, start_response)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14.../site-packages/webtest/lint.py:196: in lint_app
    iterator = application(environ, start_response_wrapper)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.../onegov/core/framework.py:219: in with_request_cache_wrapper
    return fn(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^
.../onegov/core/framework.py:234: in with_print_exceptions_wrapper
    return fn(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14.../site-packages/morepath/app.py:138: in __call__
    response = self.publish(request)
               ^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14....../site-packages/morepath/core.py:201: in poisoned_host_header_protection_tween
    return handler(request)
           ^^^^^^^^^^^^^^^^
.../onegov/core/framework.py:1765: in http_conflict_tween
    return handler(request)
           ^^^^^^^^^^^^^^^^
.../onegov/core/framework.py:1790: in activate_session_manager
    return handler(request)
           ^^^^^^^^^^^^^^^^
.../onegov/core/framework.py:1808: in close_session_after_request
    return handler(request)
           ^^^^^^^^^^^^^^^^
.../onegov/file/integration.py:477: in configure_depot_tween
    return handler(request)
           ^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14.../more/transaction/main.py:67: in transaction_tween
    response = handler(request)
               ^^^^^^^^^^^^^^^^
.../onegov/core/framework.py:1628: in fix_webassets_url
    response = handler(request)
               ^^^^^^^^^^^^^^^^
.../onegov/user/integration.py:376: in auto_login_tween
    return handler(request)
           ^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14.../more/webassets/tweens.py:132: in __call__
    return self.handler(request)
           ^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14.../more/webassets/tweens.py:84: in __call__
    response = self.handler(request)
               ^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14....../site-packages/morepath/core.py:157: in excview_tween
    response = handler(request)
               ^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14.../more/content_security/core.py:99: in content_security_policy_tween
    response = handler(request)
               ^^^^^^^^^^^^^^^^
.../onegov/core/framework.py:1833: in current_language_tween
    return handler(request)
           ^^^^^^^^^^^^^^^^
.../onegov/core/framework.py:1875: in set_cache_control_header_tween
    response = handler(request)
               ^^^^^^^^^^^^^^^^
.../onegov/gis/integration.py:139: in inject_mapbox_api_token_tween
    response = handler(request)
               ^^^^^^^^^^^^^^^^
.../onegov/websockets/integration.py:151: in websocket_csp_tween
    result = handler(request)
             ^^^^^^^^^^^^^^^^
.../onegov/org/app.py:751: in enable_iframes_tween
    result = handler(request)
             ^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14....../site-packages/morepath/publish.py:38: in publish
    return resolve_response(obj, request)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14....../site-packages/morepath/publish.py:93: in resolve_response
    return request.app.get_view(obj, request)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
<generated code: def call(self, obj, request):
    _key = _registry_key(self=self, obj=obj, request=request)
    return (_component_lookup(_key) or
            _fallback_lookup(_key) or
            _fallback)(self, obj, request)
>:3: in call
    ???
.../onegov/org/app.py:991: in wrapped
    response = func(self, obj, request)
               ^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14.../site-packages/morepath/view.py:87: in __call__
    response = self.render(content, request)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.../onegov/core/templates.py:220: in render
    return original_render(template.render(**variables), request)
                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14.../chameleon/zpt/template.py:359: in render
    return super().render(**_kw)
           ^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14........./site-packages/chameleon/template.py:268: in render
    raise_with_traceback(exc, tb)
................................................................................................................................................................../app/lib/python3.14........./site-packages/chameleon/utils.py:52: in raise_with_traceback
    raise exc
................................................................................................................................................................../app/lib/python3.14........./site-packages/chameleon/template.py:238: in render
    self._render(
login_c3d1b3b650723ae3d4a74eefcf8377e6.py:774: in render
    ???
................................................................................................................................................................../app/lib/python3.14.../chameleon/zpt/template.py:363: in include
    self._render(*args, **kwargs)
layout_7ed8e5de102a27bc4465253098fe70c9.py:2606: in render
    ???
layout_7ed8e5de102a27bc4465253098fe70c9.py:1192: in render_layout
    ???
................................................................................................................................................................../app/lib/python3.14........./site-packages/chameleon/utils.py:517: in lookup_attr
    return getattr(obj, key)
           ^^^^^^^^^^^^^^^^^
....../usr/lib/python3.14/functools.py:1126: in __get__
    val = self.func(instance)
          ^^^^^^^^^^^^^^^^^^^
.../onegov/org/request.py:142: in authenticated_email
    return self.browser_session.get('authenticated_email')
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.../onegov/core/browser_session.py:183: in get
    result = self._get(name)
             ^^^^^^^^^^^^^^^
.../onegov/core/browser_session.py:124: in _get
    return self._cache.get(name)
           ^^^^^^^^^^^^^^^^^^^^^
.../onegov/core/browser_session.py:34: in get
    return self.cache.get(self.mangle(key))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14.../dogpile/cache/region.py:783: in get
    value = self._get_cache_value(key, expiration_time, ignore_expiration)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14.../dogpile/cache/region.py:821: in _get_cache_value
    value = self._get_from_backend(key)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14.../dogpile/cache/region.py:1325: in _get_from_backend
    self.backend.get_serialized(key)
................................................................................................................................................................../app/lib/python3.14.../cache/backends/redis.py:262: in get_serialized
    value = self.reader_client.get(key)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14.../redis/commands/core.py:3194: in get
    return self.execute_command("GET", name, keys=[name])
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14............................../site-packages/redis/client.py:787: in execute_command
    return self._execute_command(*args, **options)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14............................../site-packages/redis/client.py:809: in _execute_command
    result = conn.retry.call_with_retry(
................................................................................................................................................................../app/lib/python3.14............/site-packages/redis/retry.py:132: in call_with_retry
    raise error
................................................................................................................................................................../app/lib/python3.14............/site-packages/redis/retry.py:120: in call_with_retry
    return do()
           ^^^^
................................................................................................................................................................../app/lib/python3.14............................../site-packages/redis/client.py:810: in <lambda>
    lambda: self._send_command_parse_response(
................................................................................................................................................................../app/lib/python3.14............................../site-packages/redis/client.py:753: in _send_command_parse_response
    return self.parse_response(conn, command_name, **options)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14............................../site-packages/redis/client.py:853: in parse_response
    response = connection.read_response()
               ^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14....../site-packages/redis/connection.py:1371: in read_response
    response = self._parser.read_response(
................................................................................................................................................................../app/lib/python3.14.../redis/_parsers/hiredis.py:151: in read_response
    self.read_from_socket(timeout=timeout)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <redis._parsers.hiredis._HiredisParser object at 0x7f42057a4d70>
timeout = <object object at 0x7f423fba9cf0>, raise_on_timeout = True

    def read_from_socket(self, timeout=SENTINEL, raise_on_timeout=True):
        sock = self._sock
        custom_timeout = timeout is not SENTINEL
        try:
            if custom_timeout:
                sock.settimeout(timeout)
            bufflen = self._sock.recv_into(self._buffer)
            if bufflen == 0:
>               raise ConnectionError(SERVER_CLOSED_CONNECTION_ERROR)
E               redis.exceptions.ConnectionError: redis.exceptions.ConnectionError: Connection closed by server.
E               
E                - Expression: "request.is_logged_in or request.authenticated_email"
E                - Filename:   ... .../town6/templates/layout.pt
E                - Location:   (line 97: col 132)
E                - Source:     ... ition="request.is_logged_in or request.authenticated_email">
E                                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
E                - Expression: "layout.base"
E                - Filename:   ... .../town6/templates/login.pt
E                - Location:   (line 1: col 22)
E                - Source:     <div metal:use-macro="layout.base" i18n:domain="onegov.town6 ...
E                                                    ^^^^^^^^^^^
E                - Arguments:  request: <FsiRequest ('None',) at 0x7f4207c9e660>
E                              translate: <function ('translate',) at 0x7f42050ef110>
E                              escape: <function ('escape',) at 0x7f42334c83b0>
E                              Markup: <type ('Markup',) at 0x2ae99ef0>
E                              layout: <DefaultLayout ('None',) at 0x7f42057a7380>
E                              password_reset_link: http:.../localhost/auth/request-password?skip=0&to=%...
E                              register_link: http:.../localhost/auth/register?skip=0&to=%2Ffsi%2F...
E                              may_register: False
E                              button_text: Login
E                              providers: <dict_values ('None',) at 0x7f420588f0a0>
E                              provider_login: <function ('provider_login',) at 0x7f42050eefb0>
E                              render_untrusted_markdown: <function ('render_untrusted_markdown',) at 0x7f42142147d0>
E                              title: Login to ${org}
E                              form: <TranslationBoundForm ('None',) at 0x7f42057a6ba0>
E                              global_tools: <tuple ('None',) at 0x7f420518c300>
E                              top_navigation: <tuple ('None',) at 0x7f4205782580>
E                              hide_search_header: True
E                              target_language: <NoneType ('None',) at 0xa1f2e0>
E                              repeat: <RepeatDict ('None',) at 0x7f4205537880>
E                              macroname: layout.base

................................................................................................................................................................../app/lib/python3.14.../redis/_parsers/hiredis.py:111: ConnectionError
tests/onegov/fsi/test_views_course_event.py::test_status_change_to_planned_sends_reminder_email
Stack Traces | 23.8s run time
self = <PageTemplateFile .../town6/templates/login.pt>
_BaseTemplate__kw = {'Markup': <class 'markupsafe.Markup'>, '__decode': <method 'decode' of 'bytes' objects>, '__on_error_handler': None, '__translate': <function ChameleonTranslate.<locals>.translate at 0x7fe1f7867110>, ...}
econtext = {'request': <FsiRequest at 0x7fe1fa2be660 GET http:.../localhost/auth/login>, 'translate': <function ChameleonTranslate....peatDict object at 0x7fe1f78b3700>, 'macroname': 'layout.base', '__slot_title': deque([]), '__slot_content': deque([])}
rcontext = {'__error__': [('request.is_logged_in or request.authenticated_email', 97, 132, '.../onegov-cloud/src/on...('layout.base', 1, 22, '.../town6/templates/login.pt', network:ConnectionError)]}
stream = ['<!DOCTYPE html>\n', '<html', '\n    class="no-js"', '\n    lang="de-CH"', '\n    xmlns="http://www.w3.org/1999/xhtml"', ' data-version="2026.28"', ...]
target_language = None, cls = <class 'redis.exceptions.ConnectionError'>

    def render(self, **__kw: Any) -> str:
        econtext = Scope(__kw)
        rcontext: dict[str, Any] = {}
        self.cook_check()
        stream = self.output_stream_factory()
        target_language = __kw.get("target_language")
        try:
>           self._render(
                stream,
                econtext,
                rcontext,
                target_language=target_language
            )

................................................................................................................................................................../app/lib/python3.14........./site-packages/chameleon/template.py:238: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
login_c3d1b3b650723ae3d4a74eefcf8377e6.py:774: in render
    ???
................................................................................................................................................................../app/lib/python3.14.../chameleon/zpt/template.py:363: in include
    self._render(*args, **kwargs)
layout_7ed8e5de102a27bc4465253098fe70c9.py:2606: in render
    ???
layout_7ed8e5de102a27bc4465253098fe70c9.py:1192: in render_layout
    ???
................................................................................................................................................................../app/lib/python3.14........./site-packages/chameleon/utils.py:517: in lookup_attr
    return getattr(obj, key)
           ^^^^^^^^^^^^^^^^^
....../usr/lib/python3.14/functools.py:1126: in __get__
    val = self.func(instance)
          ^^^^^^^^^^^^^^^^^^^
.../onegov/org/request.py:142: in authenticated_email
    return self.browser_session.get('authenticated_email')
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.../onegov/core/browser_session.py:183: in get
    result = self._get(name)
             ^^^^^^^^^^^^^^^
.../onegov/core/browser_session.py:124: in _get
    return self._cache.get(name)
           ^^^^^^^^^^^^^^^^^^^^^
.../onegov/core/browser_session.py:34: in get
    return self.cache.get(self.mangle(key))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14.../dogpile/cache/region.py:783: in get
    value = self._get_cache_value(key, expiration_time, ignore_expiration)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14.../dogpile/cache/region.py:821: in _get_cache_value
    value = self._get_from_backend(key)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14.../dogpile/cache/region.py:1325: in _get_from_backend
    self.backend.get_serialized(key)
................................................................................................................................................................../app/lib/python3.14.../cache/backends/redis.py:262: in get_serialized
    value = self.reader_client.get(key)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14.../redis/commands/core.py:3194: in get
    return self.execute_command("GET", name, keys=[name])
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14............................../site-packages/redis/client.py:787: in execute_command
    return self._execute_command(*args, **options)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14............................../site-packages/redis/client.py:809: in _execute_command
    result = conn.retry.call_with_retry(
................................................................................................................................................................../app/lib/python3.14............/site-packages/redis/retry.py:132: in call_with_retry
    raise error
................................................................................................................................................................../app/lib/python3.14............/site-packages/redis/retry.py:120: in call_with_retry
    return do()
           ^^^^
................................................................................................................................................................../app/lib/python3.14............................../site-packages/redis/client.py:810: in <lambda>
    lambda: self._send_command_parse_response(
................................................................................................................................................................../app/lib/python3.14............................../site-packages/redis/client.py:753: in _send_command_parse_response
    return self.parse_response(conn, command_name, **options)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14............................../site-packages/redis/client.py:853: in parse_response
    response = connection.read_response()
               ^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14....../site-packages/redis/connection.py:1371: in read_response
    response = self._parser.read_response(
................................................................................................................................................................../app/lib/python3.14.../redis/_parsers/hiredis.py:151: in read_response
    self.read_from_socket(timeout=timeout)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <redis._parsers.hiredis._HiredisParser object at 0x7fe1f7d34d70>
timeout = <object object at 0x7fe232211cf0>, raise_on_timeout = True

    def read_from_socket(self, timeout=SENTINEL, raise_on_timeout=True):
        sock = self._sock
        custom_timeout = timeout is not SENTINEL
        try:
            if custom_timeout:
                sock.settimeout(timeout)
            bufflen = self._sock.recv_into(self._buffer)
            if bufflen == 0:
>               raise ConnectionError(SERVER_CLOSED_CONNECTION_ERROR)
E               redis.exceptions.ConnectionError: Connection closed by server.

................................................................................................................................................................../app/lib/python3.14.../redis/_parsers/hiredis.py:111: ConnectionError

During handling of the above exception, another exception occurred:

client_with_db = <tests.onegov.fsi.conftest.Client object at 0x7fe1fd8717f0>

    def test_status_change_to_planned_sends_reminder_email(
        client_with_db: Client
    ) -> None:
        client = client_with_db
        session = client.app.session()
        event = session.query(CourseEvent).filter(
            CourseEvent.start > utcnow()).first()
        assert event is not None
        assert event.status == 'created'
    
        wanted_count = event.attendees.count()
        assert wanted_count > 0
    
>       client.login_admin()

.../onegov/fsi/test_views_course_event.py:156: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
tests/shared/client.py:66: in login_admin
    return self.login('admin@example.org', 'hunter2', to)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
tests/shared/client.py:60: in login
    login_page = self.get(url)
                 ^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14....../site-packages/webtest/app.py:328: in get
    return self.do_request(req, status=status,
tests/shared/client.py:159: in do_request
    return self.extend_response(super().do_request(*args, **kwargs))
                                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14....../site-packages/webtest/app.py:627: in do_request
    res = req.get_response(app, catch_exc_info=True)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14....../site-packages/webob/request.py:1309: in send
    status, headers, app_iter, exc_info = self.call_application(
................................................................................................................................................................../app/lib/python3.14....../site-packages/webob/request.py:1278: in call_application
    app_iter = application(self.environ, start_response)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14.../site-packages/webtest/lint.py:196: in lint_app
    iterator = application(environ, start_response_wrapper)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.../onegov/core/framework.py:219: in with_request_cache_wrapper
    return fn(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^
.../onegov/core/framework.py:234: in with_print_exceptions_wrapper
    return fn(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14.../site-packages/morepath/app.py:138: in __call__
    response = self.publish(request)
               ^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14....../site-packages/morepath/core.py:201: in poisoned_host_header_protection_tween
    return handler(request)
           ^^^^^^^^^^^^^^^^
.../onegov/core/framework.py:1765: in http_conflict_tween
    return handler(request)
           ^^^^^^^^^^^^^^^^
.../onegov/core/framework.py:1790: in activate_session_manager
    return handler(request)
           ^^^^^^^^^^^^^^^^
.../onegov/core/framework.py:1808: in close_session_after_request
    return handler(request)
           ^^^^^^^^^^^^^^^^
.../onegov/file/integration.py:477: in configure_depot_tween
    return handler(request)
           ^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14.../more/transaction/main.py:67: in transaction_tween
    response = handler(request)
               ^^^^^^^^^^^^^^^^
.../onegov/core/framework.py:1628: in fix_webassets_url
    response = handler(request)
               ^^^^^^^^^^^^^^^^
.../onegov/user/integration.py:376: in auto_login_tween
    return handler(request)
           ^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14.../more/webassets/tweens.py:132: in __call__
    return self.handler(request)
           ^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14.../more/webassets/tweens.py:84: in __call__
    response = self.handler(request)
               ^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14....../site-packages/morepath/core.py:157: in excview_tween
    response = handler(request)
               ^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14.../more/content_security/core.py:99: in content_security_policy_tween
    response = handler(request)
               ^^^^^^^^^^^^^^^^
.../onegov/core/framework.py:1833: in current_language_tween
    return handler(request)
           ^^^^^^^^^^^^^^^^
.../onegov/core/framework.py:1875: in set_cache_control_header_tween
    response = handler(request)
               ^^^^^^^^^^^^^^^^
.../onegov/gis/integration.py:139: in inject_mapbox_api_token_tween
    response = handler(request)
               ^^^^^^^^^^^^^^^^
.../onegov/websockets/integration.py:151: in websocket_csp_tween
    result = handler(request)
             ^^^^^^^^^^^^^^^^
.../onegov/org/app.py:751: in enable_iframes_tween
    result = handler(request)
             ^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14....../site-packages/morepath/publish.py:38: in publish
    return resolve_response(obj, request)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14....../site-packages/morepath/publish.py:93: in resolve_response
    return request.app.get_view(obj, request)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
<generated code: def call(self, obj, request):
    _key = _registry_key(self=self, obj=obj, request=request)
    return (_component_lookup(_key) or
            _fallback_lookup(_key) or
            _fallback)(self, obj, request)
>:3: in call
    ???
.../onegov/org/app.py:991: in wrapped
    response = func(self, obj, request)
               ^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14.../site-packages/morepath/view.py:87: in __call__
    response = self.render(content, request)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.../onegov/core/templates.py:220: in render
    return original_render(template.render(**variables), request)
                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14.../chameleon/zpt/template.py:359: in render
    return super().render(**_kw)
           ^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14........./site-packages/chameleon/template.py:268: in render
    raise_with_traceback(exc, tb)
................................................................................................................................................................../app/lib/python3.14........./site-packages/chameleon/utils.py:52: in raise_with_traceback
    raise exc
................................................................................................................................................................../app/lib/python3.14........./site-packages/chameleon/template.py:238: in render
    self._render(
login_c3d1b3b650723ae3d4a74eefcf8377e6.py:774: in render
    ???
................................................................................................................................................................../app/lib/python3.14.../chameleon/zpt/template.py:363: in include
    self._render(*args, **kwargs)
layout_7ed8e5de102a27bc4465253098fe70c9.py:2606: in render
    ???
layout_7ed8e5de102a27bc4465253098fe70c9.py:1192: in render_layout
    ???
................................................................................................................................................................../app/lib/python3.14........./site-packages/chameleon/utils.py:517: in lookup_attr
    return getattr(obj, key)
           ^^^^^^^^^^^^^^^^^
....../usr/lib/python3.14/functools.py:1126: in __get__
    val = self.func(instance)
          ^^^^^^^^^^^^^^^^^^^
.../onegov/org/request.py:142: in authenticated_email
    return self.browser_session.get('authenticated_email')
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.../onegov/core/browser_session.py:183: in get
    result = self._get(name)
             ^^^^^^^^^^^^^^^
.../onegov/core/browser_session.py:124: in _get
    return self._cache.get(name)
           ^^^^^^^^^^^^^^^^^^^^^
.../onegov/core/browser_session.py:34: in get
    return self.cache.get(self.mangle(key))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14.../dogpile/cache/region.py:783: in get
    value = self._get_cache_value(key, expiration_time, ignore_expiration)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14.../dogpile/cache/region.py:821: in _get_cache_value
    value = self._get_from_backend(key)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14.../dogpile/cache/region.py:1325: in _get_from_backend
    self.backend.get_serialized(key)
................................................................................................................................................................../app/lib/python3.14.../cache/backends/redis.py:262: in get_serialized
    value = self.reader_client.get(key)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14.../redis/commands/core.py:3194: in get
    return self.execute_command("GET", name, keys=[name])
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14............................../site-packages/redis/client.py:787: in execute_command
    return self._execute_command(*args, **options)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14............................../site-packages/redis/client.py:809: in _execute_command
    result = conn.retry.call_with_retry(
................................................................................................................................................................../app/lib/python3.14............/site-packages/redis/retry.py:132: in call_with_retry
    raise error
................................................................................................................................................................../app/lib/python3.14............/site-packages/redis/retry.py:120: in call_with_retry
    return do()
           ^^^^
................................................................................................................................................................../app/lib/python3.14............................../site-packages/redis/client.py:810: in <lambda>
    lambda: self._send_command_parse_response(
................................................................................................................................................................../app/lib/python3.14............................../site-packages/redis/client.py:753: in _send_command_parse_response
    return self.parse_response(conn, command_name, **options)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14............................../site-packages/redis/client.py:853: in parse_response
    response = connection.read_response()
               ^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................../app/lib/python3.14....../site-packages/redis/connection.py:1371: in read_response
    response = self._parser.read_response(
................................................................................................................................................................../app/lib/python3.14.../redis/_parsers/hiredis.py:151: in read_response
    self.read_from_socket(timeout=timeout)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <redis._parsers.hiredis._HiredisParser object at 0x7fe1f7d34d70>
timeout = <object object at 0x7fe232211cf0>, raise_on_timeout = True

    def read_from_socket(self, timeout=SENTINEL, raise_on_timeout=True):
        sock = self._sock
        custom_timeout = timeout is not SENTINEL
        try:
            if custom_timeout:
                sock.settimeout(timeout)
            bufflen = self._sock.recv_into(self._buffer)
            if bufflen == 0:
>               raise ConnectionError(SERVER_CLOSED_CONNECTION_ERROR)
E               redis.exceptions.ConnectionError: redis.exceptions.ConnectionError: Connection closed by server.
E               
E                - Expression: "request.is_logged_in or request.authenticated_email"
E                - Filename:   ... .../town6/templates/layout.pt
E                - Location:   (line 97: col 132)
E                - Source:     ... ition="request.is_logged_in or request.authenticated_email">
E                                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
E                - Expression: "layout.base"
E                - Filename:   ... .../town6/templates/login.pt
E                - Location:   (line 1: col 22)
E                - Source:     <div metal:use-macro="layout.base" i18n:domain="onegov.town6 ...
E                                                    ^^^^^^^^^^^
E                - Arguments:  request: <FsiRequest ('None',) at 0x7fe1fa2be660>
E                              translate: <function ('translate',) at 0x7fe1f7867110>
E                              escape: <function ('escape',) at 0x7fe225b203b0>
E                              Markup: <type ('Markup',) at 0x1b1f75f0>
E                              layout: <DefaultLayout ('None',) at 0x7fe1f7d37380>
E                              password_reset_link: http:.../localhost/auth/request-password?skip=0&to=%...
E                              register_link: http:.../localhost/auth/register?skip=0&to=%2Ffsi%2F...
E                              may_register: False
E                              button_text: Login
E                              providers: <dict_values ('None',) at 0x7fe1f7fcd900>
E                              provider_login: <function ('provider_login',) at 0x7fe1f7866fb0>
E                              render_untrusted_markdown: <function ('render_untrusted_markdown',) at 0x7fe2066207d0>
E                              title: Login to ${org}
E                              form: <TranslationBoundForm ('None',) at 0x7fe1f7d36ba0>
E                              global_tools: <tuple ('None',) at 0x7fe1f7a2bb40>
E                              top_navigation: <tuple ('None',) at 0x7fe1f7d13340>
E                              hide_search_header: True
E                              target_language: <NoneType ('None',) at 0xa1f2e0>
E                              repeat: <RepeatDict ('None',) at 0x7fe1f78b3700>
E                              macroname: layout.base

................................................................................................................................................................../app/lib/python3.14.../redis/_parsers/hiredis.py:111: ConnectionError
View the full list of 1 ❄️ flaky test(s)
tests/onegov/town6/test_views_directory.py::test_create_directory_accordion_layout[B3-Answer-Question]

Flake rate in main: 91.67% (Passed 1 times, Failed 11 times)

Stack Traces | 20.2s run time
__stream = ['<!DOCTYPE html>\n', '<html', '\n    class="no-js"', '\n    lang="de-CH"', '\n    xmlns="http://www.w3.org/1999/xhtml"', ' data-version="2026.28"', ...]
econtext = {'request': <OrgRequest at 0x7faf87d46660 GET http:.../localhost/auth/login>, 'translate': <function ChameleonTranslate....': "layout.macros['side_navigation']", '__slot_title': deque([]), '__slot_content': deque([]), 'cls': 'default-layout'}
rcontext = {'__error__': [('top_navigation|layout.top_navigation', 93, 192, '.../onegov/town6/temp...('layout.base', 1, 22, '.../town6/templates/login.pt', network:ConnectionError)]}
__i18n_domain = 'onegov.town6', __i18n_context = None, target_language = None

>   ???

macros_8c870b4b23e8841b5021b09750590eba.py:4941: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = {'request': <OrgRequest at 0x7faf87d46660 GET http:.../localhost/auth/login>, 'translate': <function ChameleonTranslate....': "layout.macros['side_navigation']", '__slot_title': deque([]), '__slot_content': deque([]), 'cls': 'default-layout'}
key = 'top_navigation'

    def get_name(self, key: str) -> Any:
        value = self.get(key, marker)
        if value is marker:
>           raise NameError(key)
E           NameError: top_navigation

................................................................................................................................................................................./app/lib/python3.14............/site-packages/chameleon/utils.py:470: NameError

During handling of the above exception, another exception occurred:

self = <PageTemplateFile .../town6/templates/login.pt>
_BaseTemplate__kw = {'Markup': <class 'markupsafe.Markup'>, '__decode': <method 'decode' of 'bytes' objects>, '__on_error_handler': None, '__translate': <function ChameleonTranslate.<locals>.translate at 0x7faf871c61f0>, ...}
econtext = {'request': <OrgRequest at 0x7faf87d46660 GET http:.../localhost/auth/login>, 'translate': <function ChameleonTranslate....peatDict object at 0x7faf8cf62f20>, 'macroname': 'layout.base', '__slot_title': deque([]), '__slot_content': deque([])}
rcontext = {'__error__': [('top_navigation|layout.top_navigation', 93, 192, '.../onegov/town6/temp...('layout.base', 1, 22, '.../town6/templates/login.pt', network:ConnectionError)]}
stream = ['<!DOCTYPE html>\n', '<html', '\n    class="no-js"', '\n    lang="de-CH"', '\n    xmlns="http://www.w3.org/1999/xhtml"', ' data-version="2026.28"', ...]
target_language = None, cls = <class 'redis.exceptions.ConnectionError'>

    def render(self, **__kw: Any) -> str:
        econtext = Scope(__kw)
        rcontext: dict[str, Any] = {}
        self.cook_check()
        stream = self.output_stream_factory()
        target_language = __kw.get("target_language")
        try:
>           self._render(
                stream,
                econtext,
                rcontext,
                target_language=target_language
            )

................................................................................................................................................................................./app/lib/python3.14........./site-packages/chameleon/template.py:238: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
login_c3d1b3b650723ae3d4a74eefcf8377e6.py:774: in render
    ???
................................................................................................................................................................................./app/lib/python3.14.../chameleon/zpt/template.py:363: in include
    self._render(*args, **kwargs)
layout_7ed8e5de102a27bc4465253098fe70c9.py:2606: in render
    ???
layout_7ed8e5de102a27bc4465253098fe70c9.py:933: in render_layout
    ???
macros_8c870b4b23e8841b5021b09750590eba.py:4943: in render_side_navigation
    ???
................................................................................................................................................................................./app/lib/python3.14............/site-packages/chameleon/utils.py:517: in lookup_attr
    return getattr(obj, key)
           ^^^^^^^^^^^^^^^^^
....../usr/lib/python3.14/functools.py:1126: in __get__
    val = self.func(instance)
          ^^^^^^^^^^^^^^^^^^^
.../onegov/town6/layout.py:242: in top_navigation
    return tuple(yield_children(page) for page in self.root_pages)
                                                  ^^^^^^^^^^^^^^^
.../onegov/org/layout.py:927: in root_pages
    return self.request.root_pages
           ^^^^^^^^^^^^^^^^^^^^^^^
.../core/orm/cache.py:386: in __get__
    return self.load(instance)
           ^^^^^^^^^^^^^^^^^^^
.../core/orm/cache.py:337: in load
    obj = app.cache.get_or_create(
................................................................................................................................................................................./app/lib/python3.14.../dogpile/cache/region.py:1097: in get_or_create
    with Lock(
................................................................................................................................................................................./app/lib/python3.14............/site-packages/dogpile/lock.py:185: in __enter__
    return self._enter()
           ^^^^^^^^^^^^^
................................................................................................................................................................................./app/lib/python3.14............/site-packages/dogpile/lock.py:87: in _enter
    value = value_fn()
            ^^^^^^^^^^
................................................................................................................................................................................./app/lib/python3.14.../dogpile/cache/region.py:1033: in get_value
    value = self._get_from_backend(key)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................................./app/lib/python3.14.../dogpile/cache/region.py:1325: in _get_from_backend
    self.backend.get_serialized(key)
................................................................................................................................................................................./app/lib/python3.14.../cache/backends/redis.py:262: in get_serialized
    value = self.reader_client.get(key)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................................./app/lib/python3.14.../redis/commands/core.py:3194: in get
    return self.execute_command("GET", name, keys=[name])
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................................./app/lib/python3.14............................../site-packages/redis/client.py:787: in execute_command
    return self._execute_command(*args, **options)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................................./app/lib/python3.14............................../site-packages/redis/client.py:809: in _execute_command
    result = conn.retry.call_with_retry(
................................................................................................................................................................................./app/lib/python3.14............/site-packages/redis/retry.py:132: in call_with_retry
    raise error
................................................................................................................................................................................./app/lib/python3.14............/site-packages/redis/retry.py:120: in call_with_retry
    return do()
           ^^^^
................................................................................................................................................................................./app/lib/python3.14............................../site-packages/redis/client.py:810: in <lambda>
    lambda: self._send_command_parse_response(
................................................................................................................................................................................./app/lib/python3.14............................../site-packages/redis/client.py:753: in _send_command_parse_response
    return self.parse_response(conn, command_name, **options)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................................./app/lib/python3.14............................../site-packages/redis/client.py:853: in parse_response
    response = connection.read_response()
               ^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................................./app/lib/python3.14....../site-packages/redis/connection.py:1371: in read_response
    response = self._parser.read_response(
................................................................................................................................................................................./app/lib/python3.14.../redis/_parsers/hiredis.py:151: in read_response
    self.read_from_socket(timeout=timeout)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <redis._parsers.hiredis._HiredisParser object at 0x7faf9145e6d0>
timeout = <object object at 0x7fafcb021cf0>, raise_on_timeout = True

    def read_from_socket(self, timeout=SENTINEL, raise_on_timeout=True):
        sock = self._sock
        custom_timeout = timeout is not SENTINEL
        try:
            if custom_timeout:
                sock.settimeout(timeout)
            bufflen = self._sock.recv_into(self._buffer)
            if bufflen == 0:
>               raise ConnectionError(SERVER_CLOSED_CONNECTION_ERROR)
E               redis.exceptions.ConnectionError: Connection closed by server.

................................................................................................................................................................................./app/lib/python3.14.../redis/_parsers/hiredis.py:111: ConnectionError

During handling of the above exception, another exception occurred:

index = 'B3', content_labels = 'Answer', hide_labels = 'Question'
client = <tests.onegov.town6.conftest.Client object at 0x7faf87d47cb0>

    @pytest.mark.parametrize(
        'index,content_labels,hide_labels', [
        ('A1', '', ''),
        ('A2', 'Question', ''),
        ('A3', 'Answer', ''),
        ('A4', 'Question\nAnswer', ''),
    
        ('B1', '', 'Question'),
        ('B2', 'Question', 'Question'),
        ('B3', 'Answer', 'Question'),
        ('B4', 'Question\nAnswer', 'Question'),
    
        ('C1', '', 'Answer'),
        ('C2', 'Question', 'Answer'),
        ('C3', 'Answer', 'Answer'),
        ('C4', 'Question\nAnswer', 'Answer'),
    
        ('D1', '', 'Question\nAnswer'),
        ('D2', 'Question', 'Question\nAnswer'),
        ('D3', 'Answer', 'Question\nAnswer'),
        ('D4', 'Question\nAnswer', 'Question\nAnswer'),
    ])
    def test_create_directory_accordion_layout(
        index: str,
        content_labels: str,
        hide_labels: str,
        client: Client
    ) -> None:
        question_label = '<strong>Question</strong>:'
        answer_label = '<strong>Answer</strong>:'
    
        def create_directory(
            client: Client,
            title: str,
            hide_labels: str
        ) -> ExtendedResponse:
            page = (client.get('/directories').click('^Verzeichnis$'))
            page.form['title'] = title + f' {index}'
            page.form['structure'] = "Question *= ___\nAnswer *= ___"
            page.form['title_format'] = '[Question]'
            page.form['layout'] = 'accordion'
            page.form['content_fields'] = content_labels
            page.form['content_hide_labels'] = hide_labels
            return page.form.submit().follow()
    
        def test_labels() -> None:
            assert question in page  # question always appears as accordion title
            if 'Question' in content_labels:
                assert page.text.count(question) == 2
                if 'Question' in hide_labels:
                    assert question_label not in page
                else:
                    assert question_label in page
            else:
                assert page.text.count(question) == 1
                assert question_label not in page
    
            if 'Answer' in content_labels:
                assert answer in page
                if 'Answer' in hide_labels:
                    assert answer_label not in page
                else:
                    assert answer_label in page
            else:
                assert answer not in page
                assert answer_label not in page
    
            # test edit link
            assert page.pyquery('.accordion .edit-link').attr('href')
    
>       client.login_admin()

.../onegov/town6/test_views_directory.py:258: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
tests/shared/client.py:66: in login_admin
    return self.login('admin@example.org', 'hunter2', to)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
tests/shared/client.py:60: in login
    login_page = self.get(url)
                 ^^^^^^^^^^^^^
................................................................................................................................................................................./app/lib/python3.14....../site-packages/webtest/app.py:328: in get
    return self.do_request(req, status=status,
tests/shared/client.py:159: in do_request
    return self.extend_response(super().do_request(*args, **kwargs))
                                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................................./app/lib/python3.14....../site-packages/webtest/app.py:627: in do_request
    res = req.get_response(app, catch_exc_info=True)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................................./app/lib/python3.14....../site-packages/webob/request.py:1309: in send
    status, headers, app_iter, exc_info = self.call_application(
................................................................................................................................................................................./app/lib/python3.14....../site-packages/webob/request.py:1278: in call_application
    app_iter = application(self.environ, start_response)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................................./app/lib/python3.14.../site-packages/webtest/lint.py:196: in lint_app
    iterator = application(environ, start_response_wrapper)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.../onegov/core/framework.py:219: in with_request_cache_wrapper
    return fn(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^
.../onegov/core/framework.py:234: in with_print_exceptions_wrapper
    return fn(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................................./app/lib/python3.14.../site-packages/morepath/app.py:138: in __call__
    response = self.publish(request)
               ^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................................./app/lib/python3.14....../site-packages/morepath/core.py:201: in poisoned_host_header_protection_tween
    return handler(request)
           ^^^^^^^^^^^^^^^^
.../onegov/core/framework.py:1765: in http_conflict_tween
    return handler(request)
           ^^^^^^^^^^^^^^^^
.../onegov/core/framework.py:1790: in activate_session_manager
    return handler(request)
           ^^^^^^^^^^^^^^^^
.../onegov/core/framework.py:1808: in close_session_after_request
    return handler(request)
           ^^^^^^^^^^^^^^^^
.../onegov/file/integration.py:477: in configure_depot_tween
    return handler(request)
           ^^^^^^^^^^^^^^^^
................................................................................................................................................................................./app/lib/python3.14.../more/transaction/main.py:67: in transaction_tween
    response = handler(request)
               ^^^^^^^^^^^^^^^^
.../onegov/core/framework.py:1628: in fix_webassets_url
    response = handler(request)
               ^^^^^^^^^^^^^^^^
.../onegov/user/integration.py:376: in auto_login_tween
    return handler(request)
           ^^^^^^^^^^^^^^^^
................................................................................................................................................................................./app/lib/python3.14.../more/webassets/tweens.py:132: in __call__
    return self.handler(request)
           ^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................................./app/lib/python3.14.../more/webassets/tweens.py:84: in __call__
    response = self.handler(request)
               ^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................................./app/lib/python3.14....../site-packages/morepath/core.py:157: in excview_tween
    response = handler(request)
               ^^^^^^^^^^^^^^^^
................................................................................................................................................................................./app/lib/python3.14.../more/content_security/core.py:99: in content_security_policy_tween
    response = handler(request)
               ^^^^^^^^^^^^^^^^
.../onegov/core/framework.py:1833: in current_language_tween
    return handler(request)
           ^^^^^^^^^^^^^^^^
.../onegov/core/framework.py:1875: in set_cache_control_header_tween
    response = handler(request)
               ^^^^^^^^^^^^^^^^
.../onegov/gis/integration.py:139: in inject_mapbox_api_token_tween
    response = handler(request)
               ^^^^^^^^^^^^^^^^
.../onegov/websockets/integration.py:151: in websocket_csp_tween
    result = handler(request)
             ^^^^^^^^^^^^^^^^
.../onegov/org/app.py:751: in enable_iframes_tween
    result = handler(request)
             ^^^^^^^^^^^^^^^^
................................................................................................................................................................................./app/lib/python3.14....../site-packages/morepath/publish.py:38: in publish
    return resolve_response(obj, request)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................................./app/lib/python3.14....../site-packages/morepath/publish.py:93: in resolve_response
    return request.app.get_view(obj, request)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
<generated code: def call(self, obj, request):
    _key = _registry_key(self=self, obj=obj, request=request)
    return (_component_lookup(_key) or
            _fallback_lookup(_key) or
            _fallback)(self, obj, request)
>:3: in call
    ???
.../onegov/org/app.py:991: in wrapped
    response = func(self, obj, request)
               ^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................................./app/lib/python3.14.../site-packages/morepath/view.py:87: in __call__
    response = self.render(content, request)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.../onegov/core/templates.py:220: in render
    return original_render(template.render(**variables), request)
                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................................./app/lib/python3.14.../chameleon/zpt/template.py:359: in render
    return super().render(**_kw)
           ^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................................./app/lib/python3.14........./site-packages/chameleon/template.py:268: in render
    raise_with_traceback(exc, tb)
................................................................................................................................................................................./app/lib/python3.14............/site-packages/chameleon/utils.py:52: in raise_with_traceback
    raise exc
................................................................................................................................................................................./app/lib/python3.14........./site-packages/chameleon/template.py:238: in render
    self._render(
login_c3d1b3b650723ae3d4a74eefcf8377e6.py:774: in render
    ???
................................................................................................................................................................................./app/lib/python3.14.../chameleon/zpt/template.py:363: in include
    self._render(*args, **kwargs)
layout_7ed8e5de102a27bc4465253098fe70c9.py:2606: in render
    ???
layout_7ed8e5de102a27bc4465253098fe70c9.py:933: in render_layout
    ???
macros_8c870b4b23e8841b5021b09750590eba.py:4943: in render_side_navigation
    ???
................................................................................................................................................................................./app/lib/python3.14............/site-packages/chameleon/utils.py:517: in lookup_attr
    return getattr(obj, key)
           ^^^^^^^^^^^^^^^^^
....../usr/lib/python3.14/functools.py:1126: in __get__
    val = self.func(instance)
          ^^^^^^^^^^^^^^^^^^^
.../onegov/town6/layout.py:242: in top_navigation
    return tuple(yield_children(page) for page in self.root_pages)
                                                  ^^^^^^^^^^^^^^^
.../onegov/org/layout.py:927: in root_pages
    return self.request.root_pages
           ^^^^^^^^^^^^^^^^^^^^^^^
.../core/orm/cache.py:386: in __get__
    return self.load(instance)
           ^^^^^^^^^^^^^^^^^^^
.../core/orm/cache.py:337: in load
    obj = app.cache.get_or_create(
................................................................................................................................................................................./app/lib/python3.14.../dogpile/cache/region.py:1097: in get_or_create
    with Lock(
................................................................................................................................................................................./app/lib/python3.14............/site-packages/dogpile/lock.py:185: in __enter__
    return self._enter()
           ^^^^^^^^^^^^^
................................................................................................................................................................................./app/lib/python3.14............/site-packages/dogpile/lock.py:87: in _enter
    value = value_fn()
            ^^^^^^^^^^
................................................................................................................................................................................./app/lib/python3.14.../dogpile/cache/region.py:1033: in get_value
    value = self._get_from_backend(key)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................................./app/lib/python3.14.../dogpile/cache/region.py:1325: in _get_from_backend
    self.backend.get_serialized(key)
................................................................................................................................................................................./app/lib/python3.14.../cache/backends/redis.py:262: in get_serialized
    value = self.reader_client.get(key)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................................./app/lib/python3.14.../redis/commands/core.py:3194: in get
    return self.execute_command("GET", name, keys=[name])
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................................./app/lib/python3.14............................../site-packages/redis/client.py:787: in execute_command
    return self._execute_command(*args, **options)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................................./app/lib/python3.14............................../site-packages/redis/client.py:809: in _execute_command
    result = conn.retry.call_with_retry(
................................................................................................................................................................................./app/lib/python3.14............/site-packages/redis/retry.py:132: in call_with_retry
    raise error
................................................................................................................................................................................./app/lib/python3.14............/site-packages/redis/retry.py:120: in call_with_retry
    return do()
           ^^^^
................................................................................................................................................................................./app/lib/python3.14............................../site-packages/redis/client.py:810: in <lambda>
    lambda: self._send_command_parse_response(
................................................................................................................................................................................./app/lib/python3.14............................../site-packages/redis/client.py:753: in _send_command_parse_response
    return self.parse_response(conn, command_name, **options)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................................./app/lib/python3.14............................../site-packages/redis/client.py:853: in parse_response
    response = connection.read_response()
               ^^^^^^^^^^^^^^^^^^^^^^^^^^
................................................................................................................................................................................./app/lib/python3.14....../site-packages/redis/connection.py:1371: in read_response
    response = self._parser.read_response(
................................................................................................................................................................................./app/lib/python3.14.../redis/_parsers/hiredis.py:151: in read_response
    self.read_from_socket(timeout=timeout)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <redis._parsers.hiredis._HiredisParser object at 0x7faf9145e6d0>
timeout = <object object at 0x7fafcb021cf0>, raise_on_timeout = True

    def read_from_socket(self, timeout=SENTINEL, raise_on_timeout=True):
        sock = self._sock
        custom_timeout = timeout is not SENTINEL
        try:
            if custom_timeout:
                sock.settimeout(timeout)
            bufflen = self._sock.recv_into(self._buffer)
            if bufflen == 0:
>               raise ConnectionError(SERVER_CLOSED_CONNECTION_ERROR)
E               redis.exceptions.ConnectionError: redis.exceptions.ConnectionError: Connection closed by server.
E               
E                - Expression: "top_navigation|layout.top_navigation"
E                - Filename:   ... .../town6/templates/macros.pt
E                - Location:   (line 93: col 192)
E                - Source:     ... :define="links top_navigation|layout.top_navigation">
E                                                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
E                - Expression: "layout.macros['side_navigation']"
E                - Filename:   ... .../town6/templates/layout.pt
E                - Location:   (line 54: col 36)
E                - Source:     ... metal:use-macro="layout.macros['side_navigation']"></tal:b>
E                                                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
E                - Expression: "layout.base"
E                - Filename:   ... .../town6/templates/login.pt
E                - Location:   (line 1: col 22)
E                - Source:     <div metal:use-macro="layout.base" i18n:domain="onegov.town6 ...
E                                                    ^^^^^^^^^^^
E                - Arguments:  request: <OrgRequest ('None',) at 0x7faf87d46660>
E                              translate: <function ('translate',) at 0x7faf871c61f0>
E                              escape: <function ('escape',) at 0x7fafbe96c3b0>
E                              Markup: <type ('Markup',) at 0x136d0f60>
E                              layout: <DefaultLayout ('None',) at 0x7faf868586e0>
E                              password_reset_link: http:.../localhost/auth/request-password?skip=0&to=%2F
E                              register_link: http:.../localhost/auth/register?skip=0&to=%2F
E                              may_register: False
E                              button_text: Login
E                              providers: <dict_values ('None',) at 0x7faf8cf62ce0>
E                              provider_login: <function ('provider_login',) at 0x7faf871c5f30>
E                              render_untrusted_markdown: <function ('render_untrusted_markdown',) at 0x7faf9f43c7d0>
E                              title: Login to ${org}
E                              form: <TranslationBoundForm ('None',) at 0x7faf87d46ba0>
E                              global_tools: <tuple ('None',) at 0xa6def0>
E                              modules: <LinkGroup ('None',) at 0x7faf87178bd0>
E                              target_language: <NoneType ('None',) at 0xa1f2e0>
E                              repeat: <RepeatDict ('None',) at 0x7faf8cf62f20>
E                              macroname: layout.base

................................................................................................................................................................................./app/lib/python3.14.../redis/_parsers/hiredis.py:111: ConnectionError

To view more test analytics, go to the Test Analytics Dashboard
📋 Got 3 mins? Take this short survey to help us improve Test Analytics.

Tschuppi81 added 30 commits May 5, 2026 14:51
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants