mirror of
https://github.com/django/django.git
synced 2024-12-23 09:36:06 +00:00
16218c2060
Updated the sitemap generator and default template to optionally include link elements with hreflang attribute to alternate language URLs.
254 lines
7.1 KiB
Python
254 lines
7.1 KiB
Python
from datetime import date, datetime
|
|
|
|
from django.conf.urls.i18n import i18n_patterns
|
|
from django.contrib.sitemaps import GenericSitemap, Sitemap, views
|
|
from django.http import HttpResponse
|
|
from django.urls import path
|
|
from django.utils import timezone
|
|
from django.views.decorators.cache import cache_page
|
|
|
|
from ..models import I18nTestModel, TestModel
|
|
|
|
|
|
class SimpleSitemap(Sitemap):
|
|
changefreq = "never"
|
|
priority = 0.5
|
|
location = '/location/'
|
|
lastmod = datetime.now()
|
|
|
|
def items(self):
|
|
return [object()]
|
|
|
|
|
|
class SimplePagedSitemap(Sitemap):
|
|
def items(self):
|
|
return [object() for x in range(Sitemap.limit + 1)]
|
|
|
|
|
|
class SimpleI18nSitemap(Sitemap):
|
|
changefreq = "never"
|
|
priority = 0.5
|
|
i18n = True
|
|
|
|
def items(self):
|
|
return I18nTestModel.objects.order_by('pk').all()
|
|
|
|
|
|
class AlternatesI18nSitemap(SimpleI18nSitemap):
|
|
alternates = True
|
|
|
|
|
|
class LimitedI18nSitemap(AlternatesI18nSitemap):
|
|
languages = ['en', 'es']
|
|
|
|
|
|
class XDefaultI18nSitemap(AlternatesI18nSitemap):
|
|
x_default = True
|
|
|
|
|
|
class EmptySitemap(Sitemap):
|
|
changefreq = "never"
|
|
priority = 0.5
|
|
location = '/location/'
|
|
|
|
|
|
class FixedLastmodSitemap(SimpleSitemap):
|
|
lastmod = datetime(2013, 3, 13, 10, 0, 0)
|
|
|
|
|
|
class FixedLastmodMixedSitemap(Sitemap):
|
|
changefreq = "never"
|
|
priority = 0.5
|
|
location = '/location/'
|
|
loop = 0
|
|
|
|
def items(self):
|
|
o1 = TestModel()
|
|
o1.lastmod = datetime(2013, 3, 13, 10, 0, 0)
|
|
o2 = TestModel()
|
|
return [o1, o2]
|
|
|
|
|
|
class FixedNewerLastmodSitemap(SimpleSitemap):
|
|
lastmod = datetime(2013, 4, 20, 5, 0, 0)
|
|
|
|
|
|
class DateSiteMap(SimpleSitemap):
|
|
lastmod = date(2013, 3, 13)
|
|
|
|
|
|
class TimezoneSiteMap(SimpleSitemap):
|
|
lastmod = datetime(2013, 3, 13, 10, 0, 0, tzinfo=timezone.get_fixed_timezone(-300))
|
|
|
|
|
|
def testmodelview(request, id):
|
|
return HttpResponse()
|
|
|
|
|
|
simple_sitemaps = {
|
|
'simple': SimpleSitemap,
|
|
}
|
|
|
|
simple_i18n_sitemaps = {
|
|
'i18n': SimpleI18nSitemap,
|
|
}
|
|
|
|
alternates_i18n_sitemaps = {
|
|
'i18n-alternates': AlternatesI18nSitemap,
|
|
}
|
|
|
|
limited_i18n_sitemaps = {
|
|
'i18n-limited': LimitedI18nSitemap,
|
|
}
|
|
|
|
xdefault_i18n_sitemaps = {
|
|
'i18n-xdefault': XDefaultI18nSitemap,
|
|
}
|
|
|
|
simple_sitemaps_not_callable = {
|
|
'simple': SimpleSitemap(),
|
|
}
|
|
|
|
simple_sitemaps_paged = {
|
|
'simple': SimplePagedSitemap,
|
|
}
|
|
|
|
empty_sitemaps = {
|
|
'empty': EmptySitemap,
|
|
}
|
|
|
|
fixed_lastmod_sitemaps = {
|
|
'fixed-lastmod': FixedLastmodSitemap,
|
|
}
|
|
|
|
fixed_lastmod_mixed_sitemaps = {
|
|
'fixed-lastmod-mixed': FixedLastmodMixedSitemap,
|
|
}
|
|
|
|
sitemaps_lastmod_mixed_ascending = {
|
|
'no-lastmod': EmptySitemap,
|
|
'lastmod': FixedLastmodSitemap,
|
|
}
|
|
|
|
sitemaps_lastmod_mixed_descending = {
|
|
'lastmod': FixedLastmodSitemap,
|
|
'no-lastmod': EmptySitemap,
|
|
}
|
|
|
|
sitemaps_lastmod_ascending = {
|
|
'date': DateSiteMap,
|
|
'datetime': FixedLastmodSitemap,
|
|
'datetime-newer': FixedNewerLastmodSitemap,
|
|
}
|
|
|
|
sitemaps_lastmod_descending = {
|
|
'datetime-newer': FixedNewerLastmodSitemap,
|
|
'datetime': FixedLastmodSitemap,
|
|
'date': DateSiteMap,
|
|
}
|
|
|
|
generic_sitemaps = {
|
|
'generic': GenericSitemap({'queryset': TestModel.objects.order_by('pk').all()}),
|
|
}
|
|
|
|
generic_sitemaps_lastmod = {
|
|
'generic': GenericSitemap({
|
|
'queryset': TestModel.objects.order_by('pk').all(),
|
|
'date_field': 'lastmod',
|
|
}),
|
|
}
|
|
|
|
urlpatterns = [
|
|
path('simple/index.xml', views.index, {'sitemaps': simple_sitemaps}),
|
|
path('simple-paged/index.xml', views.index, {'sitemaps': simple_sitemaps_paged}),
|
|
path('simple-not-callable/index.xml', views.index, {'sitemaps': simple_sitemaps_not_callable}),
|
|
path(
|
|
'simple/custom-index.xml', views.index,
|
|
{'sitemaps': simple_sitemaps, 'template_name': 'custom_sitemap_index.xml'}),
|
|
path(
|
|
'simple/sitemap-<section>.xml', views.sitemap,
|
|
{'sitemaps': simple_sitemaps},
|
|
name='django.contrib.sitemaps.views.sitemap'),
|
|
path(
|
|
'simple/sitemap.xml', views.sitemap,
|
|
{'sitemaps': simple_sitemaps},
|
|
name='django.contrib.sitemaps.views.sitemap'),
|
|
path(
|
|
'simple/i18n.xml', views.sitemap,
|
|
{'sitemaps': simple_i18n_sitemaps},
|
|
name='django.contrib.sitemaps.views.sitemap'),
|
|
path(
|
|
'alternates/i18n.xml', views.sitemap,
|
|
{'sitemaps': alternates_i18n_sitemaps},
|
|
name='django.contrib.sitemaps.views.sitemap'),
|
|
path(
|
|
'limited/i18n.xml', views.sitemap,
|
|
{'sitemaps': limited_i18n_sitemaps},
|
|
name='django.contrib.sitemaps.views.sitemap'),
|
|
path(
|
|
'x-default/i18n.xml', views.sitemap,
|
|
{'sitemaps': xdefault_i18n_sitemaps},
|
|
name='django.contrib.sitemaps.views.sitemap'),
|
|
path(
|
|
'simple/custom-sitemap.xml', views.sitemap,
|
|
{'sitemaps': simple_sitemaps, 'template_name': 'custom_sitemap.xml'},
|
|
name='django.contrib.sitemaps.views.sitemap'),
|
|
path(
|
|
'empty/sitemap.xml', views.sitemap,
|
|
{'sitemaps': empty_sitemaps},
|
|
name='django.contrib.sitemaps.views.sitemap'),
|
|
path(
|
|
'lastmod/sitemap.xml', views.sitemap,
|
|
{'sitemaps': fixed_lastmod_sitemaps},
|
|
name='django.contrib.sitemaps.views.sitemap'),
|
|
path(
|
|
'lastmod-mixed/sitemap.xml', views.sitemap,
|
|
{'sitemaps': fixed_lastmod_mixed_sitemaps},
|
|
name='django.contrib.sitemaps.views.sitemap'),
|
|
path(
|
|
'lastmod/date-sitemap.xml', views.sitemap,
|
|
{'sitemaps': {'date-sitemap': DateSiteMap}},
|
|
name='django.contrib.sitemaps.views.sitemap'),
|
|
path(
|
|
'lastmod/tz-sitemap.xml', views.sitemap,
|
|
{'sitemaps': {'tz-sitemap': TimezoneSiteMap}},
|
|
name='django.contrib.sitemaps.views.sitemap'),
|
|
path(
|
|
'lastmod-sitemaps/mixed-ascending.xml', views.sitemap,
|
|
{'sitemaps': sitemaps_lastmod_mixed_ascending},
|
|
name='django.contrib.sitemaps.views.sitemap'),
|
|
path(
|
|
'lastmod-sitemaps/mixed-descending.xml', views.sitemap,
|
|
{'sitemaps': sitemaps_lastmod_mixed_descending},
|
|
name='django.contrib.sitemaps.views.sitemap'),
|
|
path(
|
|
'lastmod-sitemaps/ascending.xml', views.sitemap,
|
|
{'sitemaps': sitemaps_lastmod_ascending},
|
|
name='django.contrib.sitemaps.views.sitemap'),
|
|
path(
|
|
'lastmod-sitemaps/descending.xml', views.sitemap,
|
|
{'sitemaps': sitemaps_lastmod_descending},
|
|
name='django.contrib.sitemaps.views.sitemap'),
|
|
path(
|
|
'generic/sitemap.xml', views.sitemap,
|
|
{'sitemaps': generic_sitemaps},
|
|
name='django.contrib.sitemaps.views.sitemap'),
|
|
path(
|
|
'generic-lastmod/sitemap.xml', views.sitemap,
|
|
{'sitemaps': generic_sitemaps_lastmod},
|
|
name='django.contrib.sitemaps.views.sitemap'),
|
|
path(
|
|
'cached/index.xml', cache_page(1)(views.index),
|
|
{'sitemaps': simple_sitemaps, 'sitemap_url_name': 'cached_sitemap'}),
|
|
path(
|
|
'cached/sitemap-<section>.xml', cache_page(1)(views.sitemap),
|
|
{'sitemaps': simple_sitemaps}, name='cached_sitemap'),
|
|
path(
|
|
'sitemap-without-entries/sitemap.xml', views.sitemap,
|
|
{'sitemaps': {}}, name='django.contrib.sitemaps.views.sitemap'),
|
|
]
|
|
|
|
urlpatterns += i18n_patterns(
|
|
path('i18n/testmodel/<int:id>/', testmodelview, name='i18n_testmodel'),
|
|
)
|