web/lib/django/contrib/sitemaps/views.py
changeset 0 0d40e90630ef
equal deleted inserted replaced
-1:000000000000 0:0d40e90630ef
       
     1 from django.http import HttpResponse, Http404
       
     2 from django.template import loader
       
     3 from django.contrib.sites.models import Site
       
     4 from django.core import urlresolvers
       
     5 from django.utils.encoding import smart_str
       
     6 from django.core.paginator import EmptyPage, PageNotAnInteger
       
     7 
       
     8 def index(request, sitemaps):
       
     9     current_site = Site.objects.get_current()
       
    10     sites = []
       
    11     protocol = request.is_secure() and 'https' or 'http'
       
    12     for section, site in sitemaps.items():
       
    13         if callable(site):
       
    14             pages = site().paginator.num_pages
       
    15         else:
       
    16             pages = site.paginator.num_pages
       
    17         sitemap_url = urlresolvers.reverse('django.contrib.sitemaps.views.sitemap', kwargs={'section': section})
       
    18         sites.append('%s://%s%s' % (protocol, current_site.domain, sitemap_url))
       
    19         if pages > 1:
       
    20             for page in range(2, pages+1):
       
    21                 sites.append('%s://%s%s?p=%s' % (protocol, current_site.domain, sitemap_url, page))
       
    22     xml = loader.render_to_string('sitemap_index.xml', {'sitemaps': sites})
       
    23     return HttpResponse(xml, mimetype='application/xml')
       
    24 
       
    25 def sitemap(request, sitemaps, section=None):
       
    26     maps, urls = [], []
       
    27     if section is not None:
       
    28         if section not in sitemaps:
       
    29             raise Http404("No sitemap available for section: %r" % section)
       
    30         maps.append(sitemaps[section])
       
    31     else:
       
    32         maps = sitemaps.values()
       
    33     page = request.GET.get("p", 1)
       
    34     for site in maps:
       
    35         try:
       
    36             if callable(site):
       
    37                 urls.extend(site().get_urls(page))
       
    38             else:
       
    39                 urls.extend(site.get_urls(page))
       
    40         except EmptyPage:
       
    41             raise Http404("Page %s empty" % page)
       
    42         except PageNotAnInteger:
       
    43             raise Http404("No page '%s'" % page)
       
    44     xml = smart_str(loader.render_to_string('sitemap.xml', {'urlset': urls}))
       
    45     return HttpResponse(xml, mimetype='application/xml')