wagtail / wagtailtrans

A Wagtail add-on for supporting multilingual sites
http://wagtailtrans.readthedocs.io/
BSD 3-Clause "New" or "Revised" License
104 stars 60 forks source link

Error rendering a preview of a language selector if the previewed page's language is not Live #202

Open GrUnicrn opened 3 years ago

GrUnicrn commented 3 years ago

Issue summary

When editing a page in language that is not set to Live, including a Language selector will break Preview of that page . The root of the problem seems to be in the code that renders language selector.

How to reproduce?

  1. WAGTAILTRANS_SYNC_TREE=False
  2. Add a new Language (say, Spanish) to the site. Keep its "Live" flag off.
  3. Given a page class A, make sure that the template of A that includes a Language selector ({% render_language_selector page %})
  4. Create a page "New Page" of class A in canonical language
  5. Translate this "New Page" to Spanish.
  6. When the page editor opens, press "Preview" button.

Expected result: The preview opens as usual, but Spanish language is not in the list of languages in Language selector.

Actual result: The page rendering fails with ValueError: list.remove(x): x not in list

Technical details

Environment:

Request Method: GET
Request URL: http://localhost/page-in-one-language-be/

Django Version: 3.1.3
Python Version: 3.8.5
Installed Applications:
['search',
 'home',
 'wagtail.contrib.forms',
 'wagtail.contrib.redirects',
 'wagtail.embeds',
 'wagtail.sites',
 'wagtail.users',
 'wagtail.snippets',
 'wagtail.documents',
 'wagtail.images',
 'wagtail.search',
 'wagtail.admin',
 'wagtail.core',
 'modelcluster',
 'taggit',
 'django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'wagtailtrans',
 'wagtail.contrib.modeladmin',
 'demotransbugs']
Installed Middleware:
['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.clickjacking.XFrameOptionsMiddleware',
 'django.middleware.security.SecurityMiddleware',
 'wagtail.contrib.redirects.middleware.RedirectMiddleware',
 'wagtailtrans.middleware.TranslationMiddleware']

Template error:
In template /.../WagtailTransTest/demotransbugs/demotransbugs/templates/base.html, error at line 0
   list.remove(x): x not in list
   1 : {% load static wagtailuserbar %}
   2 : 
   3 : <!DOCTYPE html>
   4 : <html class="no-js" lang="en">
   5 :     <head>
   6 :         <meta charset="utf-8" />
   7 :         <title>
   8 :             {% block title %}
   9 :                 {% if self.seo_title %}{{ self.seo_title }}{% else %}{{ self.title }}{% endif %}
   10 :             {% endblock %}

Traceback (most recent call last):
  File "/.../WagtailTransTest/venv/lib/python3.8/site-packages/django/core/handlers/exception.py", line 47, in inner
    response = get_response(request)
  File "/.../WagtailTransTest/venv/lib/python3.8/site-packages/wagtail/core/models.py", line 2416, in _get_response
    response = response.render()
  File "/.../WagtailTransTest/venv/lib/python3.8/site-packages/django/template/response.py", line 105, in render
    self.content = self.rendered_content
  File "/.../WagtailTransTest/venv/lib/python3.8/site-packages/django/template/response.py", line 83, in rendered_content
    return template.render(context, self._request)
  File "/.../WagtailTransTest/venv/lib/python3.8/site-packages/django/template/backends/django.py", line 61, in render
    return self.template.render(context)
  File "/.../WagtailTransTest/venv/lib/python3.8/site-packages/django/template/base.py", line 170, in render
    return self._render(context)
  File "/.../WagtailTransTest/venv/lib/python3.8/site-packages/django/template/base.py", line 162, in _render
    return self.nodelist.render(context)
  File "/.../WagtailTransTest/venv/lib/python3.8/site-packages/django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "/.../WagtailTransTest/venv/lib/python3.8/site-packages/django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "/.../WagtailTransTest/venv/lib/python3.8/site-packages/django/template/loader_tags.py", line 150, in render
    return compiled_parent._render(context)
  File "/.../WagtailTransTest/venv/lib/python3.8/site-packages/django/template/base.py", line 162, in _render
    return self.nodelist.render(context)
  File "/.../WagtailTransTest/venv/lib/python3.8/site-packages/django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "/.../WagtailTransTest/venv/lib/python3.8/site-packages/django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "/.../WagtailTransTest/venv/lib/python3.8/site-packages/django/template/loader_tags.py", line 62, in render
    result = block.nodelist.render(context)
  File "/.../WagtailTransTest/venv/lib/python3.8/site-packages/django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "/.../WagtailTransTest/venv/lib/python3.8/site-packages/django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "/.../WagtailTransTest/venv/lib/python3.8/site-packages/django/template/library.py", line 214, in render
    _dict = self.func(*resolved_args, **resolved_kwargs)
  File "/.../WagtailTransTest/venv/lib/python3.8/site-packages/wagtailtrans/templatetags/wagtailtrans_tags.py", line 69, in render_language_selector
    available_translations = _get_translations(page, homepage_fallback=homepage_fallback, include_self=include_self)
  File "/.../WagtailTransTest/venv/lib/python3.8/site-packages/wagtailtrans/templatetags/wagtailtrans_tags.py", line 24, in _get_translations
    available_languages.remove(page.language)

Exception Type: ValueError at /page-in-one-language-be/
Exception Value: list.remove(x): x not in list