]> git.openstreetmap.org Git - osqa.git/blob - forum/sitemap.py
Merging in changesets from revisions 809, 811, 812, 825, 826, and 827. These all...
[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, Http404
5 from django.template import loader
6 from django.core import urlresolvers
7 from django.utils.encoding import smart_str
8 from django.core.paginator import EmptyPage, PageNotAnInteger
9
10 def index(request, sitemaps):
11     sites = []
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('forum.sitemap.sitemap', kwargs={'section': section})
18         sites.append('%s%s' % (settings.APP_URL, sitemap_url))
19         if pages > 1:
20             for page in range(2, pages+1):
21                 sites.append('%s%s?p=%s' % (settings.APP_URL, 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     
35     for site in maps:
36         try:
37             if callable(site):
38                 urls.extend(site().get_urls(page=page))
39             else:
40                 urls.extend(site.get_urls(page=page))
41         except EmptyPage:
42             raise Http404("Page %s empty" % page)
43         except PageNotAnInteger:
44             raise Http404("No page '%s'" % page)
45     xml = smart_str(loader.render_to_string('sitemap.xml', {'urlset': urls}))
46     return HttpResponse(xml, mimetype='application/xml')
47
48 class OsqaSitemap(Sitemap):
49     changefreq = 'daily'
50     priority = 0.5
51     def items(self):
52         return Question.objects.filter_state(deleted=False)
53
54     def lastmod(self, obj):
55         return obj.last_activity_at
56
57     def location(self, obj):
58         return obj.get_absolute_url()
59
60     def __get(self, name, obj, default=None):
61         try:
62             attr = getattr(self, name)
63         except AttributeError:
64             return default
65         if callable(attr):
66             return attr(obj)
67         return attr
68
69     def get_urls(self, page=1):
70         urls = []
71         for item in self.paginator.page(page).object_list:
72             loc = "%s%s" % (settings.APP_URL, self.__get('location', item))
73             url_info = {
74                 'location':   loc,
75                 'lastmod':    self.__get('lastmod', item, None),
76                 'changefreq': self.__get('changefreq', item, None),
77                 'priority':   self.__get('priority', item, None)
78             }
79             urls.append(url_info)
80         return urls