Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

HTTP 500 error in admin console listing recipe steps #3192

Closed
soisoy opened this issue Jun 24, 2024 · 5 comments
Closed

HTTP 500 error in admin console listing recipe steps #3192

soisoy opened this issue Jun 24, 2024 · 5 comments
Labels
backend issues that affect the python backend bug Something isn't working

Comments

@soisoy
Copy link

soisoy commented Jun 24, 2024

Tandoor Version

1.5.17

Setup

Docker / Docker-Compose

Reverse Proxy

Traefik

Other

No response

Bug description

Visiting /admin/cookbook/step/?all= results in a HTTP 500 error. Debug logs from 500 page included in issue.

I am able to list page 1 (of 2) steps, but navigating to page 2, or listing all steps consistently results in a HTTP 500 error. I've used the API endpoint /api/step/ to query for all steps, and can retrieve information for every one via /admin/cookbook/step/${id}/change. I suspect the database to have a bad entry with a missing field, but have been unable to manually determine which one to delete/replace/update the step.

Database is postgres at version 14 also running in docker.

Relevant logs

Environment:


Request Method: GET
Request URL: https://tandoor.domain.tld/admin/cookbook/step/?all=

Django Version: 4.2.11
Python Version: 3.12.2
Installed Applications:
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.sites',
 'django.contrib.staticfiles',
 'django.contrib.postgres',
 'oauth2_provider',
 'django_tables2',
 'corsheaders',
 'crispy_forms',
 'crispy_bootstrap4',
 'rest_framework',
 'rest_framework.authtoken',
 'django_cleanup.apps.CleanupConfig',
 'webpack_loader',
 'django_js_reverse',
 'hcaptcha',
 'allauth',
 'allauth.account',
 'allauth.socialaccount',
 'cookbook.apps.CookbookConfig',
 'treebeard',
 'debug_toolbar']
Installed Middleware:
['corsheaders.middleware.CorsMiddleware',
 'django.middleware.security.SecurityMiddleware',
 'whitenoise.middleware.WhiteNoiseMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.locale.LocaleMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware',
 'cookbook.helper.scope_middleware.ScopeMiddleware',
 'allauth.account.middleware.AccountMiddleware',
 'debug_toolbar.middleware.DebugToolbarMiddleware']


Template error:
In template /opt/recipes/venv/lib/python3.12/site-packages/django/contrib/admin/templates/admin/change_list.html, error at line 68
   Invalid format specifier 's if not obj.name else f': '' for object of type 'str'
   58 :         {% block search %}{% search_form cl %}{% endblock %}
   59 :         {% block date_hierarchy %}{% if cl.date_hierarchy %}{% date_hierarchy cl %}{% endif %}{% endblock %}
   60 : 
   61 :         <form id="changelist-form" method="post"{% if cl.formset and cl.formset.is_multipart %} enctype="multipart/form-data"{% endif %} novalidate>{% csrf_token %}
   62 :         {% if cl.formset %}
   63 :           <div>{{ cl.formset.management_form }}</div>
   64 :         {% endif %}
   65 : 
   66 :         {% block result_list %}
   67 :           {% if action_form and actions_on_top and cl.show_admin_actions %}{% admin_actions %}{% endif %}
   68 :            {% result_list cl %} 
   69 :           {% if action_form and actions_on_bottom and cl.show_admin_actions %}{% admin_actions %}{% endif %}
   70 :         {% endblock %}
   71 :         {% block pagination %}{% pagination cl %}{% endblock %}
   72 :         </form>
   73 :       </div>
   74 :       {% block filters %}
   75 :         {% if cl.has_filters %}
   76 :           <div id="changelist-filter">
   77 :             <h2>{% translate 'Filter' %}</h2>
   78 :             {% if cl.has_active_filters %}<h3 id="changelist-filter-clear">


Traceback (most recent call last):
  File "/opt/recipes/venv/lib/python3.12/site-packages/django/db/models/options.py", line 681, in get_field
    return self.fields_map[field_name]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^

During handling of the above exception ('recipe_and_name'), another exception occurred:
  File "/opt/recipes/venv/lib/python3.12/site-packages/django/contrib/admin/utils.py", line 272, in lookup_field
    f = _get_non_gfk_field(opts, name)
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/recipes/venv/lib/python3.12/site-packages/django/contrib/admin/utils.py", line 303, in _get_non_gfk_field
    field = opts.get_field(name)
            ^^^^^^^^^^^^^^^^^^^^
  File "/opt/recipes/venv/lib/python3.12/site-packages/django/db/models/options.py", line 683, in get_field
    raise FieldDoesNotExist(
    ^

During handling of the above exception (Step has no field named 'recipe_and_name'), another exception occurred:
  File "/opt/recipes/venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner
    response = get_response(request)
               ^^^^^^^^^^^^^^^^^^^^^
  File "/opt/recipes/venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response
    response = response.render()
               ^^^^^^^^^^^^^^^^^
  File "/opt/recipes/venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render
    self.content = self.rendered_content
                   ^^^^^^^^^^^^^^^^^^^^^
  File "/opt/recipes/venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content
    return template.render(context, self._request)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/recipes/venv/lib/python3.12/site-packages/django/template/backends/django.py", line 61, in render
    return self.template.render(context)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/recipes/venv/lib/python3.12/site-packages/django/template/base.py", line 175, in render
    return self._render(context)
           ^^^^^^^^^^^^^^^^^^^^^
  File "/opt/recipes/venv/lib/python3.12/site-packages/django/test/utils.py", line 112, in instrumented_test_render
    return self.nodelist.render(context)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/recipes/venv/lib/python3.12/site-packages/django/template/base.py", line 1005, in render
    return SafeString("".join([node.render_annotated(context) for node in self]))
                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/recipes/venv/lib/python3.12/site-packages/django/template/base.py", line 966, in render_annotated
    return self.render(context)
           ^^^^^^^^^^^^^^^^^^^^
  File "/opt/recipes/venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 157, in render
    return compiled_parent._render(context)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/recipes/venv/lib/python3.12/site-packages/django/test/utils.py", line 112, in instrumented_test_render
    return self.nodelist.render(context)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/recipes/venv/lib/python3.12/site-packages/django/template/base.py", line 1005, in render
    return SafeString("".join([node.render_annotated(context) for node in self]))
                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/recipes/venv/lib/python3.12/site-packages/django/template/base.py", line 966, in render_annotated
    return self.render(context)
           ^^^^^^^^^^^^^^^^^^^^
  File "/opt/recipes/venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 157, in render
    return compiled_parent._render(context)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/recipes/venv/lib/python3.12/site-packages/django/test/utils.py", line 112, in instrumented_test_render
    return self.nodelist.render(context)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/recipes/venv/lib/python3.12/site-packages/django/template/base.py", line 1005, in render
    return SafeString("".join([node.render_annotated(context) for node in self]))
                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/recipes/venv/lib/python3.12/site-packages/django/template/base.py", line 966, in render_annotated
    return self.render(context)
           ^^^^^^^^^^^^^^^^^^^^
  File "/opt/recipes/venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 63, in render
    result = block.nodelist.render(context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/recipes/venv/lib/python3.12/site-packages/django/template/base.py", line 1005, in render
    return SafeString("".join([node.render_annotated(context) for node in self]))
                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/recipes/venv/lib/python3.12/site-packages/django/template/base.py", line 966, in render_annotated
    return self.render(context)
           ^^^^^^^^^^^^^^^^^^^^
  File "/opt/recipes/venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 63, in render
    result = block.nodelist.render(context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/recipes/venv/lib/python3.12/site-packages/django/template/base.py", line 1005, in render
    return SafeString("".join([node.render_annotated(context) for node in self]))
                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/recipes/venv/lib/python3.12/site-packages/django/template/base.py", line 966, in render_annotated
    return self.render(context)
           ^^^^^^^^^^^^^^^^^^^^
  File "/opt/recipes/venv/lib/python3.12/site-packages/django/contrib/admin/templatetags/base.py", line 45, in render
    return super().render(context)
           ^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/recipes/venv/lib/python3.12/site-packages/django/template/library.py", line 258, in render
    _dict = self.func(*resolved_args, **resolved_kwargs)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/recipes/venv/lib/python3.12/site-packages/django/contrib/admin/templatetags/admin_list.py", line 336, in result_list
    "results": list(results(cl)),
               ^^^^^^^^^^^^^^^^^
  File "/opt/recipes/venv/lib/python3.12/site-packages/django/contrib/admin/templatetags/admin_list.py", line 312, in results
    yield ResultList(None, items_for_result(cl, res, None))
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/recipes/venv/lib/python3.12/site-packages/django/contrib/admin/templatetags/admin_list.py", line 303, in __init__
    super().__init__(*items)
    ^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/recipes/venv/lib/python3.12/site-packages/django/contrib/admin/templatetags/admin_list.py", line 213, in items_for_result
    f, attr, value = lookup_field(field_name, result, cl.model_admin)
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/recipes/venv/lib/python3.12/site-packages/django/contrib/admin/utils.py", line 281, in lookup_field
    value = attr(obj)
            ^^^^^^^^^
  File "/opt/recipes/cookbook/admin.py", line 188, in recipe_and_name
    return f"Orphaned Step{'':s if not obj.name else f': {obj.name}'}"
                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Exception Type: ValueError at /admin/cookbook/step/
Exception Value: Invalid format specifier 's if not obj.name else f': '' for object of type 'str'
@smilerz
Copy link
Collaborator

smilerz commented Jun 24, 2024

Please share the container logs from initial startup.

@soisoy
Copy link
Author

soisoy commented Jun 24, 2024

Logs from container start to error with DEBUG=1 environment variable set.

tandoor.log

@vabene1111
Copy link
Collaborator

@smilerz can you look into this? it seems to be related to the orphaned steps function. Maybe just add a catch and deactivate the function on whatever edge case is causing this

@vabene1111 vabene1111 added bug Something isn't working backend issues that affect the python backend labels Jul 8, 2024
@smilerz
Copy link
Collaborator

smilerz commented Jul 8, 2024

fixed #c217630

@smilerz smilerz closed this as completed Jul 8, 2024
@soisoy
Copy link
Author

soisoy commented Jul 21, 2024

Confirmed as fixed in 1.5.18. Thank you!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
backend issues that affect the python backend bug Something isn't working
Projects
None yet
Development

No branches or pull requests

3 participants