diff options
Diffstat (limited to 'objectapp/sitemaps.py')
-rw-r--r-- | objectapp/sitemaps.py | 183 |
1 files changed, 183 insertions, 0 deletions
diff --git a/objectapp/sitemaps.py b/objectapp/sitemaps.py new file mode 100644 index 00000000..3696622d --- /dev/null +++ b/objectapp/sitemaps.py @@ -0,0 +1,183 @@ + +# Copyright (c) 2011, 2012 Free Software Foundation + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. + +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + + +# Copyright (c) 2011, 2012 Free Software Foundation + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. + +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + + +# This project incorporates work covered by the following copyright and permission notice: + +# Copyright (c) 2009, Julien Fache +# All rights reserved. + +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: + +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# * Neither the name of the author nor the names of other +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. + +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +# OF THE POSSIBILITY OF SUCH DAMAGE. + + +"""Sitemaps for Objectapp""" +from django.contrib.sitemaps import Sitemap +from django.core.urlresolvers import reverse + +from tagging.models import TaggedItem + +from objectapp.models import Gbobject +from objectapp.models import Author +from objectapp.models import Objecttype +from objectapp.managers import tags_published + + +class GbobjectSitemap(Sitemap): + """Sitemap for gbobjects""" + priority = 0.5 + changefreq = 'weekly' + + def items(self): + """Return published gbobjects""" + return Gbobject.published.all() + + def lastmod(self, obj): + """Return last modification of an gbobject""" + return obj.last_update + + +class ObjecttypeSitemap(Sitemap): + """Sitemap for objecttypes""" + changefreq = 'monthly' + + def cache(self, objecttypes): + """Cache categorie's gbobjects percent on total gbobjects""" + len_gbobjects = float(Gbobject.published.count()) + self.cache_objecttypes = {} + for cat in objecttypes: + if len_gbobjects: + self.cache_objecttypes[cat.pk] = cat.gbobjects_published( + ).count() / len_gbobjects + else: + self.cache_objecttypes[cat.pk] = 0.0 + + def items(self): + """Return all objecttypes with coeff""" + objecttypes = Objecttype.objects.all() + self.cache(objecttypes) + return objecttypes + + def lastmod(self, obj): + """Return last modification of a Objecttype""" + gbobjects = obj.gbobjects_published() + if not gbobjects: + return None + return gbobjects[0].creation_date + + def priority(self, obj): + """Compute priority with cached coeffs""" + priority = 0.5 + self.cache_objecttypes[obj.pk] + if priority > 1.0: + priority = 1.0 + return '%.1f' % priority + + +class AuthorSitemap(Sitemap): + """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""" + gbobjects = obj.gbobjects_published() + if not gbobjects: + return None + return gbobjects[0].creation_date + + def location(self, obj): + """Return url of an author""" + return reverse('objectapp_author_detail', args=[obj.username]) + + +class TagSitemap(Sitemap): + """Sitemap for tags""" + changefreq = 'monthly' + + def cache(self, tags): + """Cache tag's gbobjects percent on total gbobjects""" + len_gbobjects = float(Gbobject.published.count()) + self.cache_tags = {} + for tag in tags: + gbobjects = TaggedItem.objects.get_by_model( + Gbobject.published.all(), tag) + self.cache_tags[tag.pk] = (gbobjects, gbobjects.count() / len_gbobjects) + + 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""" + gbobjects = self.cache_tags[obj.pk][0] + return gbobjects[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('objectapp_tag_detail', args=[obj.name]) |