]> git.openstreetmap.org Git - osqa.git/blob - forum/sitemap.py
#OSQA-385, fixing the links of sitemaps when site is running using SCRIPT_ALIAS.
[osqa.git] / forum / sitemap.py
1 from django.contrib.sitemaps import Sitemap
2 from forum.models import Question
3 from django.conf import settings
4 from django.http import HttpResponse
5 from django.template import loader
6 from django.core import urlresolvers
7 from django.contrib.sites.models import get_current_site
8 from django.utils.encoding import smart_str
9 from django.core.paginator import EmptyPage, PageNotAnInteger
10
11 def index(request, sitemaps):
12     sites = []
13     for section, site in sitemaps.items():
14         if callable(site):
15             pages = site().paginator.num_pages
16         else:
17             pages = site.paginator.num_pages
18         sitemap_url = urlresolvers.reverse('forum.sitemap.sitemap', kwargs={'section': section})
19         sites.append('%s%s' % (settings.APP_URL, sitemap_url))
20         if pages > 1:
21             for page in range(2, pages+1):
22                 sites.append('%s%s?p=%s' % (settings.APP_URL, sitemap_url, page))
23     xml = loader.render_to_string('sitemap_index.xml', {'sitemaps': sites})
24     return HttpResponse(xml, mimetype='application/xml')
25
26 def sitemap(request, sitemaps, section=None):
27     maps, urls = [], []
28     if section is not None:
29         if section not in sitemaps:
30             raise Http404("No sitemap available for section: %r" % section)
31         maps.append(sitemaps[section])
32     else:
33         maps = sitemaps.values()
34     page = request.GET.get("p", 1)
35     
36     for site in maps:
37         try:
38             if callable(site):
39                 urls.extend(site().get_urls(page=page))
40             else:
41                 urls.extend(site.get_urls(page=page))
42         except EmptyPage:
43             raise Http404("Page %s empty" % page)
44         except PageNotAnInteger:
45             raise Http404("No page '%s'" % page)
46     xml = smart_str(loader.render_to_string('sitemap.xml', {'urlset': urls}))
47     return HttpResponse(xml, mimetype='application/xml')
48
49 class OsqaSitemap(Sitemap):
50     changefreq = 'daily'
51     priority = 0.5
52     def items(self):
53         return Question.objects.filter_state(deleted=False)
54
55     def lastmod(self, obj):
56         return obj.last_activity_at
57
58     def location(self, obj):
59         return obj.get_absolute_url()
60
61     def __get(self, name, obj, default=None):
62         try:
63             attr = getattr(self, name)
64         except AttributeError:
65             return default
66         if callable(attr):
67             return attr(obj)
68         return attr
69
70     def get_urls(self, page=1):
71         urls = []
72         for item in self.paginator.page(page).object_list:
73             loc = "%s%s" % (settings.APP_URL, self.__get('location', item))
74             url_info = {
75                 'location':   loc,
76                 'lastmod':    self.__get('lastmod', item, None),
77                 'changefreq': self.__get('changefreq', item, None),
78                 'priority':   self.__get('priority', item, None)
79             }
80             urls.append(url_info)
81         return urls