Skip to content

Commit

Permalink
Add option to exclude page form sitemap
Browse files Browse the repository at this point in the history
  • Loading branch information
yakky committed Oct 18, 2015
1 parent d22fcaf commit 1f5d93c
Show file tree
Hide file tree
Showing 7 changed files with 145 additions and 16 deletions.
24 changes: 24 additions & 0 deletions djangocms_page_sitemap/migrations/0002_auto_20151018_1451.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('djangocms_page_sitemap', '0001_initial'),
]

operations = [
migrations.AddField(
model_name='pagesitemapproperties',
name='include_in_sitemap',
field=models.BooleanField(default=True, verbose_name='Include in sitemap'),
),
migrations.AlterField(
model_name='pagesitemapproperties',
name='changefreq',
field=models.CharField(max_length=20, choices=[('daily', 'daily'), ('yearly', 'yearly'), ('never', 'never'), ('always', 'always'), ('hourly', 'hourly'), ('weekly', 'weekly'), ('monthly', 'monthly')], verbose_name='Change frequency'),
),
]
1 change: 1 addition & 0 deletions djangocms_page_sitemap/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ class PageSitemapProperties(PageExtension):
priority = models.DecimalField(_('Priority'), decimal_places=1,
max_digits=2,
validators=[MinValueValidator(0), MaxValueValidator(1)])
include_in_sitemap = models.BooleanField(_('Include in sitemap'), default=True)

def __str__(self):
return _('Sitemap values for Page %s') % self.extended_object.pk
Expand Down
5 changes: 5 additions & 0 deletions djangocms_page_sitemap/sitemap.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,11 @@ class ExtendedSitemap(CMSSitemap):
default_changefreq = CMSSitemap.changefreq
default_priority = CMSSitemap.priority

def items(self):
return super(ExtendedSitemap, self).items().exclude(
page__pagesitemapproperties__include_in_sitemap=False
)

def priority(self, title):
ext_key = get_cache_key(title.page)
properties = cache.get(ext_key)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
# -*- coding: utf-8 -*-
from south.utils import datetime_utils as datetime
from south.db import db
from south.v2 import SchemaMigration
from django.db import models


class Migration(SchemaMigration):

def forwards(self, orm):
# Adding field 'PageSitemapProperties.include_in_sitemap'
db.add_column(u'djangocms_page_sitemap_pagesitemapproperties', 'include_in_sitemap',
self.gf('django.db.models.fields.BooleanField')(default=True),
keep_default=False)


def backwards(self, orm):
# Deleting field 'PageSitemapProperties.include_in_sitemap'
db.delete_column(u'djangocms_page_sitemap_pagesitemapproperties', 'include_in_sitemap')


models = {
'cms.page': {
'Meta': {'ordering': "('path',)", 'unique_together': "(('publisher_is_draft', 'site', 'application_namespace'), ('reverse_id', 'site', 'publisher_is_draft'))", 'object_name': 'Page'},
'application_namespace': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}),
'application_urls': ('django.db.models.fields.CharField', [], {'db_index': 'True', 'max_length': '200', 'null': 'True', 'blank': 'True'}),
'changed_by': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'changed_date': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
'created_by': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'creation_date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'depth': ('django.db.models.fields.PositiveIntegerField', [], {}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'in_navigation': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'db_index': 'True'}),
'is_home': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'db_index': 'True'}),
'languages': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
'limit_visibility_in_menu': ('django.db.models.fields.SmallIntegerField', [], {'default': 'None', 'null': 'True', 'db_index': 'True', 'blank': 'True'}),
'login_required': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'navigation_extenders': ('django.db.models.fields.CharField', [], {'db_index': 'True', 'max_length': '80', 'null': 'True', 'blank': 'True'}),
'numchild': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
'parent': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'children'", 'null': 'True', 'to': "orm['cms.Page']"}),
'path': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
'placeholders': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['cms.Placeholder']", 'symmetrical': 'False'}),
'publication_date': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}),
'publication_end_date': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}),
'publisher_is_draft': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'db_index': 'True'}),
'publisher_public': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'publisher_draft'", 'unique': 'True', 'null': 'True', 'to': "orm['cms.Page']"}),
'reverse_id': ('django.db.models.fields.CharField', [], {'db_index': 'True', 'max_length': '40', 'null': 'True', 'blank': 'True'}),
'revision_id': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
'site': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'djangocms_pages'", 'to': u"orm['sites.Site']"}),
'soft_root': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'db_index': 'True'}),
'template': ('django.db.models.fields.CharField', [], {'default': "'INHERIT'", 'max_length': '100'}),
'xframe_options': ('django.db.models.fields.IntegerField', [], {'default': '0'})
},
'cms.placeholder': {
'Meta': {'object_name': 'Placeholder'},
'default_width': ('django.db.models.fields.PositiveSmallIntegerField', [], {'null': 'True'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'slot': ('django.db.models.fields.CharField', [], {'max_length': '255', 'db_index': 'True'})
},
u'djangocms_page_sitemap.pagesitemapproperties': {
'Meta': {'object_name': 'PageSitemapProperties'},
'changefreq': ('django.db.models.fields.CharField', [], {'max_length': '20'}),
'extended_object': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['cms.Page']", 'unique': 'True'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'include_in_sitemap': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'priority': ('django.db.models.fields.DecimalField', [], {'max_digits': '2', 'decimal_places': '1'}),
'public_extension': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'draft_extension'", 'unique': 'True', 'null': 'True', 'to': u"orm['djangocms_page_sitemap.PageSitemapProperties']"})
},
u'sites.site': {
'Meta': {'ordering': "(u'domain',)", 'object_name': 'Site', 'db_table': "u'django_site'"},
'domain': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'})
}
}

complete_apps = ['djangocms_page_sitemap']
14 changes: 9 additions & 5 deletions tests/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,14 +29,18 @@ def setUpClass(cls):

def get_pages(self):
from cms.api import create_page, create_title
page = create_page('page one', 'page.html', language='en')
page_1 = create_page('page one', 'page.html', language='en')
page_2 = create_page('page two', 'page.html', language='en')
create_title(language='fr', title='page un', page=page)
create_title(language='it', title='pagina uno', page=page)
page_3 = create_page('page three', 'page.html', language='en')
create_title(language='fr', title='page un', page=page_1)
create_title(language='it', title='pagina uno', page=page_1)
create_title(language='fr', title='page trois', page=page_3)
for lang in self.languages:
page.publish(lang)
page_1.publish(lang)
page_2.publish('en')
return page.get_draft_object(), page_2.get_draft_object()
page_3.publish('en')
page_3.publish('fr')
return page_1.get_draft_object(), page_2.get_draft_object(), page_3.get_draft_object()

def get_request(self, page, lang):
request = self.request_factory.get(page.get_path(lang))
Expand Down
30 changes: 24 additions & 6 deletions tests/test_sitemap.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,25 +21,43 @@ def test_sitemap_base(self):

def test_sitemap_extended(self):
test_string = '<url><loc>http://example.com/it/</loc><lastmod>%s</lastmod><changefreq>never</changefreq><priority>0.2</priority></url>' % now().strftime('%Y-%m-%d')
page1, page2 = self.get_pages()
page1, page2, page3 = self.get_pages()
PageSitemapProperties.objects.create(
extended_object=page1, priority='0.2', changefreq='never')
extended_object=page1, priority='0.2', changefreq='never'
)
page1.publish('it')
sitemap = self.client.get('/sitemap.xml')
self.assertContains(sitemap, test_string)

def test_sitemap_exclude(self):
page1, page2, page3 = self.get_pages()
PageSitemapProperties.objects.create(
extended_object=page3, priority='0.2', changefreq='never', include_in_sitemap=False
)
sitemap = ExtendedSitemap()
# unpublished since change, still in the sitemap
self.assertEqual(len(sitemap.items()), 6)

page3.publish('en')
page3.publish('fr')
sitemap = ExtendedSitemap()
# published, then no longer in the sitemap
self.assertEqual(len(sitemap.items()), 4)

def test_sitemap_cache(self):
page1, page2 = self.get_pages()
page1, page2, page3 = self.get_pages()
PageSitemapProperties.objects.create(
extended_object=page1, priority='0.2', changefreq='never')
extended_object=page1, priority='0.2', changefreq='never'
)
PageSitemapProperties.objects.create(
extended_object=page2, priority='0.8', changefreq='hourly')
extended_object=page2, priority='0.8', changefreq='hourly'
)
page1.publish('it')
page1 = page1.get_public_object()
page2.publish('it')
page2 = page2.get_public_object()
sitemap = ExtendedSitemap()
self.assertEqual(len(sitemap.items()), 4)
self.assertEqual(len(sitemap.items()), 6)
for item in sitemap.items():
if item.page.pk == page1.pk:
self.assertEqual(sitemap.changefreq(item), 'never')
Expand Down
10 changes: 5 additions & 5 deletions tests/test_toolbar.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ def test_no_perm(self):
Test that no page menu is present if user has no perm
"""
from cms.toolbar.toolbar import CMSToolbar
page1, page2 = self.get_pages()
page1, page2, page3 = self.get_pages()
request = self.get_page_request(page1, self.user_staff, '/', edit=True)
toolbar = CMSToolbar(request)
toolbar.get_left_items()
Expand All @@ -44,7 +44,7 @@ def test_perm(self):
Test that page meta menu is present if user has Page.change_perm
"""
from cms.toolbar.toolbar import CMSToolbar
page1, page2 = self.get_pages()
page1, page2, page3 = self.get_pages()
self.user_staff.user_permissions.add(Permission.objects.get(codename='change_page'))
self.user_staff = User.objects.get(pk=self.user_staff.pk)
request = self.get_page_request(page1, self.user_staff, '/', edit=True)
Expand All @@ -59,7 +59,7 @@ def test_perm_permissions(self):
Test that no page menu is present if user has general page Page.change_perm but not permission on current page
"""
from cms.toolbar.toolbar import CMSToolbar
page1, page2 = self.get_pages()
page1, page2, page3 = self.get_pages()
self.user_staff.user_permissions.add(Permission.objects.get(codename='change_page'))
self.user_staff = User.objects.get(pk=self.user_staff.pk)
request = self.get_page_request(page1, self.user_staff, '/', edit=True)
Expand All @@ -73,7 +73,7 @@ def test_toolbar(self):
Test that PageSitemapProperties item is present for superuser
"""
from cms.toolbar.toolbar import CMSToolbar
page1, page2 = self.get_pages()
page1, page2, page3 = self.get_pages()
request = self.get_page_request(page1, self.user, '/', edit=True)
toolbar = CMSToolbar(request)
toolbar.get_left_items()
Expand All @@ -85,7 +85,7 @@ def test_toolbar_with_items(self):
Test that PageSitemapProperties item is present for superuser if PageSitemapProperties exists for current page
"""
from cms.toolbar.toolbar import CMSToolbar
page1, page2 = self.get_pages()
page1, page2, page3 = self.get_pages()
page_ext = PageSitemapProperties.objects.create(
extended_object=page1, priority='0.2', changefreq='never')
request = self.get_page_request(page1, self.user, '/', edit=True)
Expand Down

0 comments on commit 1f5d93c

Please sign in to comment.