mirror of
https://github.com/discourse/discourse.git
synced 2025-02-25 18:55:32 -06:00
FIX: select appropriate period when redirecting to top
This commit is contained in:
@@ -10,7 +10,7 @@ const controllerOpts = {
|
||||
canStar: Em.computed.alias('controllers.discovery/topics.currentUser.id'),
|
||||
showTopicPostBadges: Em.computed.not('controllers.discovery/topics.new'),
|
||||
|
||||
redirectedReason: Em.computed.alias('currentUser.redirected_to_top_reason'),
|
||||
redirectedReason: Em.computed.alias('currentUser.redirected_to_top.reason'),
|
||||
|
||||
order: 'default',
|
||||
ascending: false,
|
||||
|
||||
@@ -24,7 +24,7 @@ export default {
|
||||
willTransition: function() {
|
||||
this._super();
|
||||
Discourse.User.currentProp("should_be_redirected_to_top", false);
|
||||
Discourse.User.currentProp("redirected_to_top_reason", null);
|
||||
Discourse.User.currentProp("redirected_to_top.reason", null);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,7 +15,8 @@ const DiscoveryRoute = Discourse.Route.extend(OpenComposer, {
|
||||
transition.targetName.indexOf("discovery.top") === -1 &&
|
||||
Discourse.User.currentProp("should_be_redirected_to_top")) {
|
||||
Discourse.User.currentProp("should_be_redirected_to_top", false);
|
||||
this.replaceWith("discovery.top");
|
||||
const period = Discourse.User.currentProp("redirect_to_top.period") || "all";
|
||||
this.replaceWith(`discovery.top${period.capitalize()}`);
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
@@ -3,8 +3,7 @@ module Jobs
|
||||
class UpdateTopRedirection < Jobs::Base
|
||||
|
||||
def execute(args)
|
||||
user = User.find_by(id: args[:user_id])
|
||||
if user
|
||||
if user = User.find_by(id: args[:user_id])
|
||||
user.update_column(:last_redirected_to_top_at, args[:redirected_at])
|
||||
end
|
||||
end
|
||||
|
||||
@@ -88,17 +88,6 @@ class SiteSetting < ActiveRecord::Base
|
||||
use_https? ? "https" : "http"
|
||||
end
|
||||
|
||||
def self.has_enough_topics_to_redirect_to_top
|
||||
TopTopic.periods.each do |period|
|
||||
topics_per_period = TopTopic.where("#{period}_score > 0")
|
||||
.limit(SiteSetting.topics_per_period_in_top_page)
|
||||
.count
|
||||
return true if topics_per_period >= SiteSetting.topics_per_period_in_top_page
|
||||
end
|
||||
# nothing
|
||||
false
|
||||
end
|
||||
|
||||
def self.default_categories_selected
|
||||
[
|
||||
SiteSetting.default_categories_watching.split("|"),
|
||||
@@ -107,6 +96,15 @@ class SiteSetting < ActiveRecord::Base
|
||||
].flatten.to_set
|
||||
end
|
||||
|
||||
def self.min_redirected_to_top_period
|
||||
TopTopic.sorted_periods.each do |p|
|
||||
period = p[0]
|
||||
return period if TopTopic.topics_per_period(period) >= SiteSetting.topics_per_period_in_top_page
|
||||
end
|
||||
# not enough topics
|
||||
nil
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
# == Schema Information
|
||||
|
||||
@@ -1,7 +1,15 @@
|
||||
require_dependency "distributed_memoizer"
|
||||
|
||||
class TopTopic < ActiveRecord::Base
|
||||
|
||||
belongs_to :topic
|
||||
|
||||
def self.topics_per_period(period)
|
||||
DistributedMemoizer.memoize("#{Discourse.current_hostname}_topics_per_period_#{period}", 1.day) do
|
||||
TopTopic.where("#{period}_score > 0").count
|
||||
end.to_i
|
||||
end
|
||||
|
||||
# The top topics we want to refresh often
|
||||
def self.refresh_daily!
|
||||
transaction do
|
||||
@@ -35,6 +43,10 @@ class TopTopic < ActiveRecord::Base
|
||||
@@periods ||= [:all, :yearly, :quarterly, :monthly, :weekly, :daily].freeze
|
||||
end
|
||||
|
||||
def self.sorted_periods
|
||||
ascending_periods ||= Enum.new(:daily, :weekly, :monthly, :quarterly, :yearly, :all)
|
||||
end
|
||||
|
||||
def self.sort_orders
|
||||
@@sort_orders ||= [:posts, :views, :likes, :op_likes].freeze
|
||||
end
|
||||
|
||||
@@ -698,26 +698,32 @@ class User < ActiveRecord::Base
|
||||
end
|
||||
|
||||
def should_be_redirected_to_top
|
||||
redirected_to_top_reason.present?
|
||||
redirected_to_top.present?
|
||||
end
|
||||
|
||||
def redirected_to_top_reason
|
||||
def redirected_to_top
|
||||
# redirect is enabled
|
||||
return unless SiteSetting.redirect_users_to_top_page
|
||||
# top must be in the top_menu
|
||||
return unless SiteSetting.top_menu =~ /top/i
|
||||
# there should be enough topics
|
||||
return unless SiteSetting.has_enough_topics_to_redirect_to_top
|
||||
return unless SiteSetting.top_menu =~ /(^|\|)top(\||$)/i
|
||||
# not enough topics
|
||||
return unless period = SiteSetting.min_redirected_to_top_period
|
||||
|
||||
if !seen_before? || (trust_level == 0 && !redirected_to_top_yet?)
|
||||
update_last_redirected_to_top!
|
||||
return I18n.t('redirected_to_top_reasons.new_user')
|
||||
return {
|
||||
reason: I18n.t('redirected_to_top_reasons.new_user'),
|
||||
period: period
|
||||
}
|
||||
elsif last_seen_at < 1.month.ago
|
||||
update_last_redirected_to_top!
|
||||
return I18n.t('redirected_to_top_reasons.not_seen_in_a_month')
|
||||
return {
|
||||
reason: I18n.t('redirected_to_top_reasons.not_seen_in_a_month'),
|
||||
period: period
|
||||
}
|
||||
end
|
||||
|
||||
# no reason
|
||||
# don't redirect to top
|
||||
nil
|
||||
end
|
||||
|
||||
|
||||
@@ -23,7 +23,7 @@ class CurrentUserSerializer < BasicUserSerializer
|
||||
:no_password,
|
||||
:can_delete_account,
|
||||
:should_be_redirected_to_top,
|
||||
:redirected_to_top_reason,
|
||||
:redirected_to_top,
|
||||
:disable_jump_reply,
|
||||
:custom_fields,
|
||||
:muted_category_ids,
|
||||
@@ -81,8 +81,8 @@ class CurrentUserSerializer < BasicUserSerializer
|
||||
true
|
||||
end
|
||||
|
||||
def include_redirected_to_top_reason?
|
||||
object.redirected_to_top_reason.present?
|
||||
def include_redirected_to_top?
|
||||
object.redirected_to_top.present?
|
||||
end
|
||||
|
||||
def custom_fields
|
||||
|
||||
Reference in New Issue
Block a user