This is an automated email from the ASF dual-hosted git repository. dill0wn pushed a commit to branch dw/8421 in repository https://gitbox.apache.org/repos/asf/allura.git
commit 4d94ca52c9b453bc66bbee9e7867d4e947c6cb71 Author: Dillon Walls <[email protected]> AuthorDate: Fri Mar 18 18:27:07 2022 +0000 [#8421] SEO - omit Discussions from sitemap if no posts --- ForgeDiscussion/forgediscussion/forum_main.py | 24 ++++++++++++++ ForgeDiscussion/forgediscussion/tests/test_app.py | 39 ++++++++++++++++++++++- 2 files changed, 62 insertions(+), 1 deletion(-) diff --git a/ForgeDiscussion/forgediscussion/forum_main.py b/ForgeDiscussion/forgediscussion/forum_main.py index caa19dd..bf64531 100644 --- a/ForgeDiscussion/forgediscussion/forum_main.py +++ b/ForgeDiscussion/forgediscussion/forum_main.py @@ -126,6 +126,30 @@ class ForgeDiscussionApp(Application): return [ SitemapEntry(menu_id, '.')[self.sidebar_menu()]] + def sitemap_xml(self): + """ + Used for generating sitemap.xml. + If the root page has default content, omit it from the sitemap.xml. + Assumes :attr:`main_menu` will return an entry pointing to the root page. + :return: a list of :class:`SitemapEntries <allura.app.SitemapEntry>` + """ + if self.should_noindex(): + return [] + return self.main_menu() + + def should_noindex(self): + forums = self.forums + for forum in forums: + # post = forum.last_post + post = DM.ForumPost.query.get( + discussion_id=forum._id, + status='ok', + deleted=False, + ) + if post: + return False + return True + @property def forums(self): return DM.Forum.query.find(dict(app_config_id=self.config._id)).all() diff --git a/ForgeDiscussion/forgediscussion/tests/test_app.py b/ForgeDiscussion/forgediscussion/tests/test_app.py index 29d6ee5..ea413b7 100644 --- a/ForgeDiscussion/forgediscussion/tests/test_app.py +++ b/ForgeDiscussion/forgediscussion/tests/test_app.py @@ -18,20 +18,25 @@ import tempfile import json import os +import random from operator import attrgetter from cgi import FieldStorage from io import BytesIO +from alluratest.controller import setup_basic_test from alluratest.tools import assert_equal from tg import tmpl_context as c from forgediscussion.site_stats import posts_24hr from ming.orm import ThreadLocalORMSession +from ming.orm.base import session from allura import model as M +from allura.lib import helpers as h from allura.tests import decorators as td from forgediscussion.tests.functional.test_rest import TestDiscussionApiBase -from forgediscussion.model.forum import Forum, ForumPost +from forgediscussion.model.forum import Forum, ForumThread, ForumPost +from forgediscussion import utils class TestApp(TestDiscussionApiBase): # creates some sample data @@ -49,6 +54,38 @@ class TestApp(TestDiscussionApiBase): # creates some sample data assert_equal(2, posts_24hr()) +class TestAppSitemap: + + def setUp(self): + setup_basic_test() + self.user = M.User.query.get(username='root') + + @td.with_discussion + def test_sitemap_xml(self): + assert_equal([], c.app.sitemap_xml()) + forum = utils.create_forum(c.app, dict( + shortname='test-forum', + name="Test Forum", + description="Test Forum Description", + )) + ThreadLocalORMSession.flush_all() + assert_equal([], c.app.sitemap_xml()) + thread = ForumThread( + subject='test-thread', + ) + thread.set_forum(forum) + # session(thread).flush(thread) + ThreadLocalORMSession.flush_all() + + assert_equal([], c.app.sitemap_xml()) + thread.post( + subject='test-post', + text='this is a test post.', + ) + ThreadLocalORMSession.flush_all() + assert_equal(1, len(c.app.sitemap_xml())) + + class TestBulkExport(TestDiscussionApiBase): def test_bulk_export(self):
