]> git.openstreetmap.org Git - osqa.git/blob - forum/sitemap.py
OSQA-561, Changing the Questions sitemap limit from 250 to 2500. This would be more...
[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('sitemap_section_index', kwargs={'section': section})
18         sites.append('%s%s' % (settings.APP_URL, sitemap_url))
19
20     xml = loader.render_to_string('sitemap_index.xml', {'sitemaps': sites})
21     return HttpResponse(xml, mimetype='application/xml')
22
23 def sitemap_section_index(request, section, sitemaps):
24     try:
25         sitemap = sitemaps[section]()
26     except KeyError:
27         raise Http404("Sitemap doesn't exist")
28
29     paginator = sitemap.paginator
30
31     locations = []
32
33     for page in paginator.page_range:
34         location = urlresolvers.reverse('sitemap_section_page', kwargs={ 'page' : page, 'section' : section })
35         location = '%s%s' % (settings.APP_URL, location)
36         locations.append(location)
37
38     xml = loader.render_to_string('sitemap_section_index.xml', { 'locations' : locations, })
39     return HttpResponse(xml, mimetype='application/xml')
40
41 def sitemap(request, sitemaps, section=None, page=1):
42     maps, urls = [], []
43     if section is not None:
44         if section not in sitemaps:
45             raise Http404("No sitemap available for section: %r" % section)
46         maps.append(sitemaps[section])
47     else:
48         maps = sitemaps.values()
49     
50     for site in maps:
51         try:
52             if callable(site):
53                 urls.extend(site().get_urls(page=page))
54             else:
55                 urls.extend(site.get_urls(page=page))
56         except EmptyPage:
57             raise Http404("Page %s empty" % page)
58         except PageNotAnInteger:
59             raise Http404("No page '%s'" % page)
60     xml = smart_str(loader.render_to_string('sitemap.xml', {'urlset': urls}))
61     return HttpResponse(xml, mimetype='application/xml')
62
63 class OsqaSitemap(Sitemap):
64     limit = 2500
65     changefreq = 'daily'
66     priority = 0.5
67     def items(self):
68         return Question.objects.filter_state(deleted=False).order_by('id')
69
70     def lastmod(self, obj):
71         return obj.last_activity_at
72
73     def location(self, obj):
74         return obj.get_absolute_url()
75
76     def __get(self, name, obj, default=None):
77         try:
78             attr = getattr(self, name)
79         except AttributeError:
80             return default
81         if callable(attr):
82             return attr(obj)
83         return attr
84
85     def get_urls(self, page=1):
86         urls = []
87         for item in self.paginator.page(page).object_list:
88             loc = "%s%s" % (settings.APP_URL, self.__get('location', item))
89             url_info = {
90                 'location':   loc,
91                 'lastmod':    self.__get('lastmod', item, None),
92                 'changefreq': self.__get('changefreq', item, None),
93                 'priority':   self.__get('priority', item, None)
94             }
95             urls.append(url_info)
96         return urls