FEATURE: do not redirect to top page when number of topis is low

This commit is contained in:
Régis Hanol 2014-02-17 14:28:12 +01:00
parent 90d20c4373
commit aac4b55926
3 changed files with 34 additions and 7 deletions

View File

@ -354,16 +354,18 @@ Discourse.User = Discourse.Model.extend({
@type {String} @type {String}
**/ **/
homepage: function() { homepage: function() {
// top is the default for: // when there are enough topics, /top is the default for
// - new users // - new users
// - long-time-no-see user (ie. > 1 month) // - long-time-no-see user (ie. > 1 month)
if (Discourse.Site.currentProp("has_enough_topic_to_redirect_to_top_page")) {
if (Discourse.SiteSettings.top_menu.indexOf("top") >= 0) { if (Discourse.SiteSettings.top_menu.indexOf("top") >= 0) {
if (this.get("trust_level") === 0 || !this.get("hasBeenSeenInTheLastMonth")) { if (this.get("trust_level") === 0 || !this.get("hasBeenSeenInTheLastMonth")) {
return "top"; return "top";
} }
} }
}
return Discourse.Utilities.defaultHomepage(); return Discourse.Utilities.defaultHomepage();
}.property("trust_level", "hasBeenSeenInTheLastMonth"), }.property("trust_level", "hasBeenSeenInTheLastMonth", "Discourse.Site.has_enough_topic_to_redirect_to_top_page"),
updateMutedCategories: function() { updateMutedCategories: function() {
this.set("mutedCategories", Discourse.Category.findByIds(this.muted_category_ids)); this.set("mutedCategories", Discourse.Category.findByIds(this.muted_category_ids));

View File

@ -9,7 +9,8 @@ class SiteSerializer < ApplicationSerializer
:top_menu_items, :top_menu_items,
:anonymous_top_menu_items, :anonymous_top_menu_items,
:uncategorized_category_id, # this is hidden so putting it here :uncategorized_category_id, # this is hidden so putting it here
:is_readonly :is_readonly,
:has_enough_topic_to_redirect_to_top_page
has_many :categories, serializer: BasicCategorySerializer, embed: :objects has_many :categories, serializer: BasicCategorySerializer, embed: :objects
has_many :post_action_types, embed: :objects has_many :post_action_types, embed: :objects
@ -50,4 +51,12 @@ class SiteSerializer < ApplicationSerializer
Discourse.readonly_mode? Discourse.readonly_mode?
end end
def has_enough_topic_to_redirect_to_top_page
Topic.listable_topics
.visible
.includes(:category).references(:category)
.where('COALESCE(categories.topic_id, 0) <> topics.id')
.count > SiteSetting.topics_per_period_in_top_page
end
end end

View File

@ -40,12 +40,28 @@ test("homepage when top is disabled", function() {
equal(oldUser.get("homepage"), defaultHomepage, "long-time-no-see old user's homepage is default when top is disabled"); equal(oldUser.get("homepage"), defaultHomepage, "long-time-no-see old user's homepage is default when top is disabled");
}); });
test("homepage when top is enabled", function() { test("homepage when top is enabled and not enought topics", function() {
var newUser = Discourse.User.create({ trust_level: 0, last_seen_at: moment() }), var newUser = Discourse.User.create({ trust_level: 0, last_seen_at: moment() }),
oldUser = Discourse.User.create({ trust_level: 1, last_seen_at: moment() }), oldUser = Discourse.User.create({ trust_level: 1, last_seen_at: moment() }),
defaultHomepage = Discourse.Utilities.defaultHomepage(); defaultHomepage = Discourse.Utilities.defaultHomepage();
Discourse.SiteSettings.top_menu = "latest|top"; Discourse.SiteSettings.top_menu = "latest|top";
Discourse.Site.currentProp("has_enough_topic_to_redirect_to_top_page", false);
equal(newUser.get("homepage"), defaultHomepage, "new user's homepage is default");
equal(oldUser.get("homepage"), defaultHomepage, "old user's homepage is default");
oldUser.set("last_seen_at", moment().subtract('month', 2));
equal(oldUser.get("homepage"), defaultHomepage, "long-time-no-see old user's homepage is default");
});
test("homepage when top is enabled and has enough topics", function() {
var newUser = Discourse.User.create({ trust_level: 0, last_seen_at: moment() }),
oldUser = Discourse.User.create({ trust_level: 1, last_seen_at: moment() }),
defaultHomepage = Discourse.Utilities.defaultHomepage();
Discourse.SiteSettings.top_menu = "latest|top";
Discourse.Site.currentProp("has_enough_topic_to_redirect_to_top_page", true);
equal(newUser.get("homepage"), "top", "new user's homepage is top when top is enabled"); equal(newUser.get("homepage"), "top", "new user's homepage is top when top is enabled");
equal(oldUser.get("homepage"), defaultHomepage, "old user's homepage is default when top is enabled"); equal(oldUser.get("homepage"), defaultHomepage, "old user's homepage is default when top is enabled");