#32648: New sitemap 'alternates' generation feature is bugged using default 
values.
--------------------------------------------+----------------------------
               Reporter:  paris-ci          |          Owner:  nobody
                   Type:  Bug               |         Status:  new
              Component:  contrib.sitemaps  |        Version:  3.2
               Severity:  Normal            |       Keywords:  alternates
           Triage Stage:  Unreviewed        |      Has patch:  0
    Needs documentation:  0                 |    Needs tests:  0
Patch needs improvement:  0                 |  Easy pickings:  0
                  UI/UX:  0                 |
--------------------------------------------+----------------------------
 (First time reporting a bug in Django, please be kind)

 Hi,

 When closing ticket #27395 with the following commit
 
https://github.com/django/django/commit/16218c20606d8cd89c5393970c83da04598a3e04#
 a bug was added in Django.

 If alternates is set to False, or if i18n is disabled on the sitemap, this
 line
 
https://github.com/django/django/commit/16218c20606d8cd89c5393970c83da04598a3e04
 #diff-d0316d5baddb3fd017c4a17ac10d784a4668a05ae39bf8a0485ec80da1409c51R189
 will not get executed, meaning `url_info` will not have `alternates` set.

 Later, when rendering in the template, the inner loop
 
(https://github.com/django/django/commit/16218c20606d8cd89c5393970c83da04598a3e04
 #diff-a2c649c9d199c72cb1df4204ce54d92a480f4f077e7b423db91ee1ab421895d8R10)
 will try to access alternates anyway, causing the following stacktrace to
 be printed


 {{{#!python
 [DEBUG   ] (base._resolve_lookup) Exception while resolving variable
 'alternates' in template 'sitemap.xml'.

 Traceback (most recent call last):
   File "/usr/local/lib/python3.9/site-packages/django/template/base.py",
 line 829, in _resolve_lookup
     current = current[bit]
 KeyError: 'alternates'

 During handling of the above exception, another exception occurred:

 Traceback (most recent call last):
   File "/usr/local/lib/python3.9/site-packages/django/template/base.py",
 line 837, in _resolve_lookup
     current = getattr(current, bit)
 AttributeError: 'dict' object has no attribute 'alternates'

 During handling of the above exception, another exception occurred:

 Traceback (most recent call last):
   File "/usr/local/lib/python3.9/site-packages/django/template/base.py",
 line 843, in _resolve_lookup
     current = current[int(bit)]
 ValueError: invalid literal for int() with base 10: 'alternates'

 During handling of the above exception, another exception occurred:

 Traceback (most recent call last):
   File "/usr/local/lib/python3.9/site-packages/django/template/base.py",
 line 848, in _resolve_lookup
     raise VariableDoesNotExist("Failed lookup for key "

 django.template.base.VariableDoesNotExist: Failed lookup for key
 [alternates] in {'item': <Item __str__>, 'location': 'https://myurl',
 'lastmod': None, 'changefreq': 'always', 'priority': ''}
 }}}

 A simple fix is the meantime is to redefine the _urls() method in the
 Sitemap to include the alternates attribute to an empty list :

 {{{#!python
 class Sitemap(sitemaps.Sitemap):
     """
     Fixes the Exception while resolving variable 'alternates' in template
 'sitemap.xml'
     """
     def _urls(self, *args, **kwargs):
         urls = super()._urls(*args, **kwargs)

         for url_info in urls:
             url_info['alternates'] = []

         return urls
 }}}

 That said, the patch is probably a 1-liner, to check if url.alternates
 exist before using it.

-- 
Ticket URL: <https://code.djangoproject.com/ticket/32648>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/051.601c45294f1bef05cb30e984a8559faf%40djangoproject.com.

Reply via email to