diff --git a/README.rst b/README.rst index 6ba666f..8dbcb4d 100644 --- a/README.rst +++ b/README.rst @@ -17,7 +17,6 @@ Depends on * django-model-utils * python-pytz - Huboard ------- diff --git a/django_mesh/models.py b/django_mesh/models.py index 392cb53..789a43b 100644 --- a/django_mesh/models.py +++ b/django_mesh/models.py @@ -46,7 +46,7 @@ def get_oembed_markup(self, matchobj): return '%(spacing)s%(url)s' % gd def render(self): - #TODO: strip out dangerous HTML attributes, only allow basic formatting tags + self.rendered_text = oembed_regex.sub(self.get_oembed_markup, self.text) def save(self, *args, **kwargs): @@ -54,11 +54,6 @@ def save(self, *args, **kwargs): self.render() super(_Abstract, self).save(*args, **kwargs) -# try: -# ping_google() -# except Exception: -# # Bare 'except' because we could get a variety of HTTP-related exceptions. -# pass def __str__(self): return self.title diff --git a/django_mesh/tests/test_models.py b/django_mesh/tests/test_models.py index 00ad92c..3305ebf 100644 --- a/django_mesh/tests/test_models.py +++ b/django_mesh/tests/test_models.py @@ -74,7 +74,6 @@ def test_str_unicode(self): self.p1.channel = self.c1 self.p1.save() - returned_title = str(self.p1) self.assertEqual(self.p1.title, returned_title) @@ -101,4 +100,4 @@ def test_get_absolute_url(self): def test_str_unicode(self): self.t1.save() returned_title = str(self.t1) - self.assertEqual(self.t1.title, returned_title) + self.assertEqual(self.t1.title, returned_title) \ No newline at end of file diff --git a/django_mesh/tests/test_sitemaps.py b/django_mesh/tests/test_sitemaps.py new file mode 100644 index 0000000..4591474 --- /dev/null +++ b/django_mesh/tests/test_sitemaps.py @@ -0,0 +1,124 @@ +# -*- coding: utf-8 -*- +#Copyright (C) 2011 Seán Hayes +# +#This program is free software: you can redistribute it and/or modify +#it under the terms of the GNU 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 General Public License for more details. +# +#You should have received a copy of the GNU General Public License +#along with this program. If not, see . + +# Django imports +from django.core.urlresolvers import reverse +from datetime import date, timedelta +# Test imports +from .util import BaseTestCase + +# App imports +from ..models import Post + +class SitemapIndexTestCase(BaseTestCase): + def test_items_returned(self): + self.c1.save() + self.c3.save() + self.p1.channel = self.c1 + self.p1.save() + + self.p2.channel = self.c3 + self.p2.save() + + self.p3.channel = self.c1 + self.p3.save() + + response = self.client.get(reverse('sitemap')) + + self.assertEqual(response.status_code, 200) + self.assertContains(response, "sitemap-channel") + self.assertContains(response, "sitemap-tag") + self.assertContains(response, "sitemap-post") + +class PostSitemapsTestCase(BaseTestCase): + + def test_items_returned(self): + domain_name = 'http://example.com/' + sub_name = 'blog/' + channel = 'posts/' + + self.c1.save() + self.c3.save() + self.t1.save() + self.t2.save() + + self.p1.channel = self.c1 + self.p1.save() + self.p1.tags.add(self.t1) + self.p1.published = date.today() + + self.p2.channel = self.c3 + self.p2.save() + self.p2.tags.add(self.t2) + + self.p3.channel = self.c1 + self.p3.save() + self.p3.tags.add(self.t2) + + response = self.client.get(reverse('sitemaps', kwargs={'section': 'post'})) + + self.assertContains(response, '%(dn)s%(sn)s%(c)s%(slug)s/' %{"dn":domain_name, "sn":sub_name, "c":channel, "slug": self.p1.slug}) + self.assertNotContains(response, '%(dn)s%(sn)s%(c)s%(slug)s/' %{"dn":domain_name, "sn":sub_name, "c":channel, "slug": self.p2.slug}) +# possible tags in sitemap page + self.assertContains(response, '') + self.assertContains(response, '') + self.assertContains(response, '') + + self.assertContains(response, '') + self.assertContains(response, '') + self.assertContains(response, '') + self.assertContains(response, '') + +# p1 tags should be in there + self.assertContains(response, self.p1.title) # + self.assertContains(response, self.t1.title ) # + self.assertContains(response, self.p1.published) # + +# p2 tags should not, since its put in a private channel + self.assertNotContains(response, self.p2.title) + self.assertNotContains(response, self.t2.title ) # + + self.assertNotContains(response, self.p3.title) + +class ChannelSitemapsTestCase(BaseTestCase): + def test_items_returned(self): + self.c1.save() + self.c3.save() + + response = self.client.get(reverse('sitemaps', kwargs={'section': 'channel'})) + + self.assertContains(response, self.c1.title) + self.assertNotContains(response, self.c3.title) + +class TagSitemapsTestCase(BaseTestCase): + def test_items_returned(self): + + self.c1.save() + self.c2.save() + self.p1.channel = self.c1 + self.p2.channel = self.c2 + self.p1.save() + self.p2.save() + + self.t1.save() + self.t2.save() + + self.p1.tags.add(self.t1) + self.p2.tags.add(self.t2) + + response = self.client.get(reverse('sitemaps', kwargs={'section': 'tag'})) + + self.assertContains(response, self.t1.title) \ No newline at end of file diff --git a/django_mesh_test_project/settings.py b/django_mesh_test_project/settings.py index 32112a1..eff8af2 100644 --- a/django_mesh_test_project/settings.py +++ b/django_mesh_test_project/settings.py @@ -25,11 +25,15 @@ # SECURITY WARNING: don't run with debug turned on in production! DEBUG = True +TEMPLATE_LOADERS = ( + 'django.template.loaders.filesystem.Loader', + 'django.template.loaders.app_directories.Loader', + ) + TEMPLATE_DEBUG = True ALLOWED_HOSTS = [] - # Application definition INSTALLED_APPS = ( @@ -84,7 +88,6 @@ USE_TZ = True - # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/1.6/howto/static-files/ diff --git a/django_mesh_test_project/sitemaps.py b/django_mesh_test_project/sitemaps.py new file mode 100644 index 0000000..db09185 --- /dev/null +++ b/django_mesh_test_project/sitemaps.py @@ -0,0 +1,34 @@ +from django.contrib.sitemaps import GenericSitemap + +from django.contrib.sitemaps import Sitemap +from django_mesh.models import Post, Channel, Tag +from django.contrib.sites.models import Site + +class PostSitemap(Sitemap): + changefreq = "always" + priority = 0.9 + + def items(self): + return Post.objects.active().filter(channel__public=True) + + def lastmod(self, obj): + return obj.modified + + @property + def name(self): + site = Site.objects.get_current() + return site + +class ChannelSitemap(Sitemap): + changefreq="always" + priority = 0.5 + + def items(self): + return Channel.objects.filter(public=True) + +class TagSitemap(Sitemap): + changefreq="always" + priority = 0.5 + + def items(self): + return Tag.objects.filter(post__channel__public=True) \ No newline at end of file diff --git a/django_mesh_test_project/templates/sitemaps.html b/django_mesh_test_project/templates/sitemaps.html new file mode 100644 index 0000000..fab1101 --- /dev/null +++ b/django_mesh_test_project/templates/sitemaps.html @@ -0,0 +1,41 @@ + + +{% spaceless %} +{% for url in urlset %} + + {{ url.location }} + {% if url.lastmod %}{{ url.lastmod|date:"Y-m-d" }}{% endif %} + {% if url.changefreq %}{{ url.changefreq }}{% endif %} + {% if url.priority %}{{ url.priority }}{% endif %} + + + {% if url.item.tags %} + + {% for tag in url.item.tags.all %} + {{tag}} + {% endfor %} + + {% endif %} + + {% if url.item.published %} + {{ url.item.published|date:"Y-m-d" }} + {% endif %} + + {% if url.item.title %}{{ url.item.title }}{% endif %} + + {% if url.item.author %} + {% for site in sites %} + + {{ site.name }} + en + + {% endfor %} + {% endif %} + + + +{% endfor %} +{% endspaceless %} + \ No newline at end of file diff --git a/django_mesh_test_project/urls.py b/django_mesh_test_project/urls.py index 22e1fd4..406be97 100644 --- a/django_mesh_test_project/urls.py +++ b/django_mesh_test_project/urls.py @@ -1,9 +1,23 @@ from django.conf.urls import patterns, include, url +from .sitemaps import PostSitemap, ChannelSitemap, TagSitemap +from django.contrib.sitemaps.views import sitemap from django.contrib import admin admin.autodiscover() +sitemaps = { + 'post':PostSitemap, + 'channel':ChannelSitemap, + 'tag':TagSitemap +} + urlpatterns = patterns('', url(r'^blog/', include('django_mesh.urls')), + + url(r'^sitemap\.xml$', 'django.contrib.sitemaps.views.index', {'sitemaps': sitemaps}, name='sitemap'), + + url(r'^sitemap-(?P
.+)\.xml$', 'django.contrib.sitemaps.views.sitemap', {'sitemaps': sitemaps, + 'template_name': "sitemaps.html" + }, name='sitemaps'), url(r'^admin/', include(admin.site.urls)), ) \ No newline at end of file