mirror of
https://github.com/discourse/discourse.git
synced 2024-11-23 23:54:16 +08:00
101 lines
3.1 KiB
Ruby
101 lines
3.1 KiB
Ruby
class ListController < ApplicationController
|
|
|
|
before_filter :ensure_logged_in, except: [:latest, :hot, :category, :category_feed]
|
|
skip_before_filter :check_xhr
|
|
|
|
# Create our filters
|
|
[:latest, :hot, :favorited, :read, :posted, :unread, :new].each do |filter|
|
|
define_method(filter) do
|
|
list_opts = {
|
|
page: params[:page]
|
|
}
|
|
|
|
if params[:topic_ids]
|
|
list_opts[:topic_ids] = params[:topic_ids].split(",").map(&:to_i)
|
|
end
|
|
|
|
# html format means we need to farm exclude from the site options
|
|
if params[:format].blank? || params[:format] == "html"
|
|
#TODO objectify this stuff
|
|
SiteSetting.top_menu.split('|').each do |f|
|
|
s = f.split(",")
|
|
if s[0] == action_name || (action_name == "index" && s[0] == SiteSetting.homepage)
|
|
list_opts[:exclude_category] = s[1][1..-1] if s.length == 2
|
|
end
|
|
end
|
|
end
|
|
list_opts[:exclude_category] = params[:exclude_category] if params[:exclude_category].present?
|
|
|
|
list = TopicQuery.new(current_user, list_opts).send("list_#{filter}")
|
|
list.more_topics_url = url_for(self.send "#{filter}_path".to_sym, list_opts.merge(format: 'json', page: next_page))
|
|
|
|
respond(list)
|
|
end
|
|
end
|
|
|
|
def category
|
|
query = TopicQuery.new(current_user, page: params[:page])
|
|
list = nil
|
|
|
|
# If they choose uncategorized, return topics NOT in a category
|
|
if params[:category] == 'uncategorized'
|
|
list = query.list_uncategorized
|
|
else
|
|
@category = Category.where("slug = ? or id = ?", params[:category], params[:category].to_i).includes(:featured_users).first
|
|
guardian.ensure_can_see!(@category)
|
|
list = query.list_category(@category)
|
|
end
|
|
|
|
list.more_topics_url = url_for(category_path(params[:category], page: next_page, format: "json"))
|
|
respond(list)
|
|
end
|
|
|
|
def category_feed
|
|
raise Discourse::InvalidParameters.new('Category RSS of "uncategorized"') if params[:category] == Slug.for(SiteSetting.uncategorized_name) || params[:category] == SiteSetting.uncategorized_name
|
|
|
|
@category = Category.where("slug = ?", params[:category]).includes(:featured_users).first
|
|
|
|
guardian.ensure_can_see!(@category)
|
|
|
|
anonymous_etag(@category) do
|
|
@topic_list = TopicQuery.new.list_new_in_category(@category)
|
|
render 'list', formats: [:rss]
|
|
end
|
|
end
|
|
|
|
def popular_redirect
|
|
# We've renamed popular to latest. Use a redirect until we're sure we can
|
|
# safely remove this.
|
|
redirect_to latest_path, :status => 301
|
|
end
|
|
|
|
protected
|
|
|
|
def respond(list)
|
|
|
|
list.draft_key = Draft::NEW_TOPIC
|
|
list.draft_sequence = DraftSequence.current(current_user, Draft::NEW_TOPIC)
|
|
|
|
draft = Draft.get(current_user, list.draft_key, list.draft_sequence) if current_user
|
|
list.draft = draft
|
|
|
|
discourse_expires_in 1.minute
|
|
|
|
respond_to do |format|
|
|
format.html do
|
|
@list = list
|
|
store_preloaded('topic_list', MultiJson.dump(TopicListSerializer.new(list, scope: guardian)))
|
|
render 'list'
|
|
end
|
|
format.json do
|
|
render_serialized(list, TopicListSerializer)
|
|
end
|
|
end
|
|
end
|
|
|
|
def next_page
|
|
params[:page].to_i + 1
|
|
end
|
|
|
|
end
|