Skip to content

Template error on organization security history page #18740

@nlhkabu

Description

@nlhkabu

Describe the bug
When I navigate to manage/organization/<org_name>/history I get the following error:
jinja2.exceptions.UndefinedError: 'dict object' has no attribute 'submitted_by_user_id'

Expected behavior
The page loads as expected

To Reproduce

  • Log In
  • Navigate to "Your organizations"
  • Click "manage" on an organization
  • Select "Security history" in the sidebar

My Platform
Dev

Additional context
Traceback:

Traceback (most recent call last):
  File "/opt/warehouse/lib/python3.13/site-packages/pyramid_debugtoolbar/panels/performance.py", line 61, in resource_timer_handler
    result = handler(request)
  File "/opt/warehouse/lib/python3.13/site-packages/pyramid_tm/__init__.py", line 179, in tm_tween
    raise exc from None
  File "/opt/warehouse/lib/python3.13/site-packages/pyramid_tm/__init__.py", line 145, in tm_tween
    response = handler(request)
  File "/opt/warehouse/src/warehouse/cache/http.py", line 64, in conditional_http_tween
    response = handler(request)
  File "/opt/warehouse/lib/python3.13/site-packages/pyramid_openapi3/tween.py", line 32, in excview_tween
    response = handler(request)
  File "/opt/warehouse/lib/python3.13/site-packages/pyramid/tweens.py", line 43, in excview_tween
    response = _error_handler(request, exc)
  File "/opt/warehouse/lib/python3.13/site-packages/pyramid/tweens.py", line 17, in _error_handler
    reraise(*exc_info)
  File "/opt/warehouse/lib/python3.13/site-packages/pyramid/util.py", line 733, in reraise
    raise value
  File "/opt/warehouse/lib/python3.13/site-packages/pyramid/tweens.py", line 41, in excview_tween
    response = handler(request)
  File "/opt/warehouse/src/warehouse/sanity.py", line 66, in sanity_tween_egress
    return unicode_redirects(handler(request))
  File "/opt/warehouse/lib/python3.13/site-packages/pyramid/router.py", line 143, in handle_request
    response = _call_view(
  File "/opt/warehouse/lib/python3.13/site-packages/sentry_sdk/integrations/pyramid.py", line 92, in sentry_patched_call_view
    return old_call_view(registry, request, *args, **kwargs)
  File "/opt/warehouse/lib/python3.13/site-packages/pyramid/view.py", line 674, in _call_view
    response = view_callable(context, request)
  File "/opt/warehouse/src/warehouse/cache/http.py", line 23, in wrapped
    return view(context, request)
  File "/opt/warehouse/src/warehouse/cache/http.py", line 23, in wrapped
    return view(context, request)
  File "/opt/warehouse/src/warehouse/csrf.py", line 28, in wrapped
    return view(context, request)
  File "/opt/warehouse/lib/python3.13/site-packages/pyramid/viewderivers.py", line 512, in csrf_view
    return view(context, request)
  File "/opt/warehouse/lib/python3.13/site-packages/pyramid/viewderivers.py", line 319, in secured_view
    return view(context, request)
  File "/opt/warehouse/src/warehouse/config.py", line 294, in wrapped
    return view(context, request)
  File "/opt/warehouse/src/warehouse/cache/origin/derivers.py", line 22, in wrapper_view
    return view(context, request)
  File "/opt/warehouse/src/warehouse/metrics/views.py", line 24, in wrapper_view
    return view(context, request)
  File "/opt/warehouse/lib/python3.13/site-packages/pyramid/viewderivers.py", line 450, in rendered_view
    response = view_renderer.render_view(
  File "/opt/warehouse/lib/python3.13/site-packages/pyramid/renderers.py", line 443, in render_view
    return self.render_to_response(response, system, request=request)
  File "/opt/warehouse/lib/python3.13/site-packages/pyramid/renderers.py", line 466, in render_to_response
    result = self.render(value, system_values, request=request)
  File "/opt/warehouse/lib/python3.13/site-packages/pyramid/renderers.py", line 462, in render
    result = renderer(value, system_values)
  File "/opt/warehouse/lib/python3.13/site-packages/pyramid_jinja2/__init__.py", line 260, in __call__
    return template.render(system)
  File "/opt/warehouse/lib/python3.13/site-packages/jinja2/environment.py", line 1295, in render
    self.environment.handle_exception()
  File "/opt/warehouse/lib/python3.13/site-packages/jinja2/environment.py", line 942, in handle_exception
    raise rewrite_traceback_stack(source=source)
  File "/opt/warehouse/src/warehouse/templates/manage/organization/history.html", line 4, in top-level template code
    {% set active_tab = "history" %}
  File "/opt/warehouse/src/warehouse/templates/manage/organization/manage_organization_base.html", line 5, in top-level template code
    {% set active_tab = active_tab|default('collaborators') %}
  File "/opt/warehouse/src/warehouse/templates/manage/manage_base.html", line 649, in top-level template code
    {{ submit_desc }} <a href="{{ request.route_path('accounts.profile', username=event.additional.submitted_by) }}">{{ event.additional.submitted_by }}</a>
  File "/opt/warehouse/src/warehouse/templates/base.html", line 206, in top-level template code
    {% block body %}
  File "/opt/warehouse/src/warehouse/templates/base.html", line 326, in block 'body'
    {% block content %}
  File "/opt/warehouse/src/warehouse/templates/manage/organization/manage_organization_base.html", line 51, in block 'content'
    {% block main %}{% endblock %}
  File "/opt/warehouse/src/warehouse/templates/manage/organization/history.html", line 183, in block 'main'
    <td>{{ event_summary(event) }}</td>
  File "/opt/warehouse/lib/python3.13/site-packages/jinja2/runtime.py", line 784, in _invoke
    rv = self._func(*arguments)
  File "/opt/warehouse/src/warehouse/templates/manage/organization/history.html", line 139, in template
    {% set submitted_by = get_user(event.additional.submitted_by_user_id).username %}
  File "/opt/warehouse/src/warehouse/accounts/services.py", line 110, in get_user
    return self.cached_get_user(userid)
  File "/opt/warehouse/src/warehouse/accounts/services.py", line 103, in _get_user
    select(User).options(joinedload(User.webauthn)).where(User.id == userid)
  File "/opt/warehouse/lib/python3.13/site-packages/sqlalchemy/sql/operators.py", line 584, in __eq__
    return self.operate(eq, other)
  File "/opt/warehouse/lib/python3.13/site-packages/sqlalchemy/orm/attributes.py", line 453, in operate
    return op(self.comparator, *other, **kwargs)  # type: ignore[no-any-return]  # noqa: E501
  File "/opt/warehouse/lib/python3.13/site-packages/sqlalchemy/sql/operators.py", line 584, in __eq__
    return self.operate(eq, other)
  File "/opt/warehouse/lib/python3.13/site-packages/sqlalchemy/orm/properties.py", line 479, in operate
    return op(self.__clause_element__(), *other, **kwargs)  # type: ignore[no-any-return]  # noqa: E501
  File "/opt/warehouse/lib/python3.13/site-packages/sqlalchemy/sql/annotation.py", line 371, in __eq__
    return self.__element.__class__.__eq__(self, other)
  File "/opt/warehouse/lib/python3.13/site-packages/sqlalchemy/sql/operators.py", line 584, in __eq__
    return self.operate(eq, other)
  File "/opt/warehouse/lib/python3.13/site-packages/sqlalchemy/sql/elements.py", line 1534, in operate
    return op(self.comparator, *other, **kwargs)  # type: ignore[no-any-return]  # noqa: E501
  File "/opt/warehouse/lib/python3.13/site-packages/sqlalchemy/sql/operators.py", line 584, in __eq__
    return self.operate(eq, other)
  File "/opt/warehouse/lib/python3.13/site-packages/sqlalchemy/sql/type_api.py", line 210, in operate
    return op_fn(self.expr, op, *other, **addtl_kw)
  File "/opt/warehouse/lib/python3.13/site-packages/sqlalchemy/sql/default_comparator.py", line 120, in _boolean_compare
    obj = coercions.expect(
  File "/opt/warehouse/lib/python3.13/site-packages/sqlalchemy/sql/coercions.py", line 395, in expect
    resolved = impl._literal_coercion(
  File "/opt/warehouse/lib/python3.13/site-packages/sqlalchemy/sql/coercions.py", line 803, in _literal_coercion
    return expr._bind_param(operator, element, type_=bindparam_type)
  File "/opt/warehouse/lib/python3.13/site-packages/sqlalchemy/sql/elements.py", line 4633, in _bind_param
    return BindParameter(
  File "/opt/warehouse/lib/python3.13/site-packages/sqlalchemy/sql/elements.py", line 2054, in __init__
    self.type = _compared_to_type.coerce_compared_value(
  File "/opt/warehouse/lib/python3.13/site-packages/sqlalchemy/sql/sqltypes.py", line 3720, in coerce_compared_value
    return super().coerce_compared_value(op, value)
  File "/opt/warehouse/lib/python3.13/site-packages/sqlalchemy/sql/type_api.py", line 1065, in coerce_compared_value
    _coerced_type = _resolve_value_to_type(value)
  File "/opt/warehouse/lib/python3.13/site-packages/sqlalchemy/sql/sqltypes.py", line 3903, in _resolve_value_to_type
    insp = inspection.inspect(value, False)
  File "/opt/warehouse/lib/python3.13/site-packages/sqlalchemy/inspection.py", line 140, in inspect
    ret = reg(subject)
  File "/opt/warehouse/lib/python3.13/site-packages/sqlalchemy/orm/base.py", line 430, in _inspect_mapped_object
    return instance_state(instance)
jinja2.exceptions.UndefinedError: 'dict object' has no attribute 'submitted_by_user_id'

Metadata

Metadata

Assignees

No one assigned

    Labels

    bug 🐛developer experienceAnything that improves the experience for Warehouse devs

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions