-
Notifications
You must be signed in to change notification settings - Fork 731
/
sitemaps.py
123 lines (97 loc) · 3.49 KB
/
sitemaps.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
"""Sitemaps for Zinnia"""
from django.contrib.sitemaps import Sitemap
from django.core.urlresolvers import reverse
from tagging.models import TaggedItem
from zinnia.models.entry import Entry
from zinnia.models.author import Author
from zinnia.models.category import Category
from zinnia.settings import PROTOCOL
from zinnia.managers import tags_published
class ZinniaSitemap(Sitemap):
"""Base Sitemap class for Zinnia"""
protocol = PROTOCOL
class EntrySitemap(ZinniaSitemap):
"""Sitemap for entries"""
priority = 0.5
changefreq = 'weekly'
def items(self):
"""Return published entries"""
return Entry.published.all()
def lastmod(self, obj):
"""Return last modification of an entry"""
return obj.last_update
class CategorySitemap(ZinniaSitemap):
"""Sitemap for categories"""
changefreq = 'monthly'
def cache(self, categories):
"""Cache categorie's entries percent on total entries"""
len_entries = float(Entry.published.count())
self.cache_categories = {}
for cat in categories:
if len_entries:
self.cache_categories[cat.pk] = cat.entries_published(
).count() / len_entries
else:
self.cache_categories[cat.pk] = 0.0
def items(self):
"""Return all categories with coeff"""
categories = Category.objects.all()
self.cache(categories)
return categories
def lastmod(self, obj):
"""Return last modification of a category"""
entries = obj.entries_published()
if not entries:
return None
return entries[0].creation_date
def priority(self, obj):
"""Compute priority with cached coeffs"""
priority = 0.5 + self.cache_categories[obj.pk]
if priority > 1.0:
priority = 1.0
return '%.1f' % priority
class AuthorSitemap(ZinniaSitemap):
"""Sitemap for authors"""
priority = 0.5
changefreq = 'monthly'
def items(self):
"""Return published authors"""
return Author.published.all()
def lastmod(self, obj):
"""Return last modification of an author"""
entries = obj.entries_published()
if not entries:
return None
return entries[0].creation_date
def location(self, obj):
"""Return url of an author"""
return reverse('zinnia_author_detail', args=[obj.username])
class TagSitemap(ZinniaSitemap):
"""Sitemap for tags"""
changefreq = 'monthly'
def cache(self, tags):
"""Cache tag's entries percent on total entries"""
len_entries = float(Entry.published.count())
self.cache_tags = {}
for tag in tags:
entries = TaggedItem.objects.get_by_model(
Entry.published.all(), tag)
self.cache_tags[tag.pk] = (entries, entries.count() / len_entries)
def items(self):
"""Return all tags with coeff"""
tags = tags_published()
self.cache(tags)
return tags
def lastmod(self, obj):
"""Return last modification of a tag"""
entries = self.cache_tags[obj.pk][0]
return entries[0].creation_date
def priority(self, obj):
"""Compute priority with cached coeffs"""
priority = 0.5 + self.cache_tags[obj.pk][1]
if priority > 1.0:
priority = 1.0
return '%.1f' % priority
def location(self, obj):
"""Return url of a tag"""
return reverse('zinnia_tag_detail', args=[obj.name])