|
0
|
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') |