2013-02-06 03:16:51 +08:00
|
|
|
require_dependency 'category_serializer'
|
|
|
|
|
|
|
|
class CategoriesController < ApplicationController
|
|
|
|
|
2014-10-17 00:15:31 +08:00
|
|
|
before_filter :ensure_logged_in, except: [:index, :show, :redirect]
|
2013-04-19 05:07:06 +08:00
|
|
|
before_filter :fetch_category, only: [:show, :update, :destroy]
|
2014-10-17 00:15:31 +08:00
|
|
|
skip_before_filter :check_xhr, only: [:index, :redirect]
|
|
|
|
|
|
|
|
def redirect
|
2015-03-09 08:45:36 +08:00
|
|
|
redirect_to path("/c/#{params[:path]}")
|
2014-10-17 00:15:31 +08:00
|
|
|
end
|
2013-02-06 03:16:51 +08:00
|
|
|
|
|
|
|
def index
|
2013-09-12 03:33:05 +08:00
|
|
|
@description = SiteSetting.site_description
|
|
|
|
|
2013-10-17 14:44:56 +08:00
|
|
|
options = {}
|
2013-12-12 04:23:41 +08:00
|
|
|
options[:latest_posts] = params[:latest_posts] || SiteSetting.category_featured_topics
|
2014-07-03 03:10:39 +08:00
|
|
|
options[:parent_category_id] = params[:parent_category_id]
|
2013-10-17 14:44:56 +08:00
|
|
|
|
2014-07-03 03:10:39 +08:00
|
|
|
@list = CategoryList.new(guardian, options)
|
2013-05-29 09:15:30 +08:00
|
|
|
@list.draft_key = Draft::NEW_TOPIC
|
|
|
|
@list.draft_sequence = DraftSequence.current(current_user, Draft::NEW_TOPIC)
|
|
|
|
@list.draft = Draft.get(current_user, @list.draft_key, @list.draft_sequence) if current_user
|
|
|
|
|
2013-04-11 14:24:08 +08:00
|
|
|
discourse_expires_in 1.minute
|
2013-05-29 02:54:00 +08:00
|
|
|
|
2015-06-09 00:07:35 +08:00
|
|
|
unless current_homepage == 'categories'
|
|
|
|
@title = I18n.t('js.filters.categories.title')
|
|
|
|
end
|
|
|
|
|
2013-05-29 02:54:00 +08:00
|
|
|
store_preloaded("categories_list", MultiJson.dump(CategoryListSerializer.new(@list, scope: guardian)))
|
2013-04-27 01:10:41 +08:00
|
|
|
respond_to do |format|
|
|
|
|
format.html { render }
|
|
|
|
format.json { render_serialized(@list, CategoryListSerializer) }
|
|
|
|
end
|
2013-02-06 03:16:51 +08:00
|
|
|
end
|
2013-02-07 23:45:24 +08:00
|
|
|
|
2013-10-21 12:24:37 +08:00
|
|
|
def move
|
2013-10-21 12:33:42 +08:00
|
|
|
guardian.ensure_can_create!(Category)
|
|
|
|
|
2013-10-21 12:24:37 +08:00
|
|
|
params.require("category_id")
|
|
|
|
params.require("position")
|
|
|
|
|
|
|
|
if category = Category.find(params["category_id"])
|
|
|
|
category.move_to(params["position"].to_i)
|
|
|
|
render json: success_json
|
|
|
|
else
|
|
|
|
render status: 500, json: failed_json
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2013-02-06 03:16:51 +08:00
|
|
|
def show
|
2014-03-06 06:21:55 +08:00
|
|
|
if Category.topic_create_allowed(guardian).where(id: @category.id).exists?
|
|
|
|
@category.permission = CategoryGroup.permission_types[:full]
|
|
|
|
end
|
2013-02-06 03:16:51 +08:00
|
|
|
render_serialized(@category, CategorySerializer)
|
|
|
|
end
|
|
|
|
|
|
|
|
def create
|
|
|
|
guardian.ensure_can_create!(Category)
|
|
|
|
|
2014-05-16 23:33:44 +08:00
|
|
|
position = category_params.delete(:position)
|
|
|
|
|
2013-02-06 03:16:51 +08:00
|
|
|
@category = Category.create(category_params.merge(user: current_user))
|
|
|
|
return render_json_error(@category) unless @category.save
|
2013-02-07 23:45:24 +08:00
|
|
|
|
2014-05-16 23:33:44 +08:00
|
|
|
@category.move_to(position.to_i) if position
|
2013-02-06 03:16:51 +08:00
|
|
|
render_serialized(@category, CategorySerializer)
|
|
|
|
end
|
|
|
|
|
|
|
|
def update
|
|
|
|
guardian.ensure_can_edit!(@category)
|
2014-10-11 00:21:44 +08:00
|
|
|
|
|
|
|
json_result(@category, serializer: CategorySerializer) do |cat|
|
|
|
|
|
2014-05-16 23:33:44 +08:00
|
|
|
cat.move_to(category_params[:position].to_i) if category_params[:position]
|
2014-10-11 00:21:44 +08:00
|
|
|
|
2014-03-05 07:42:05 +08:00
|
|
|
if category_params.key? :email_in and category_params[:email_in].length == 0
|
|
|
|
# properly null the value so the database constrain doesn't catch us
|
|
|
|
category_params[:email_in] = nil
|
2015-04-16 18:39:48 +08:00
|
|
|
elsif category_params.key? :email_in and existing_category = Category.find_by(email_in: category_params[:email_in]) and existing_category.id != @category.id
|
|
|
|
# check if email_in address is already in use for other category
|
|
|
|
return render_json_error I18n.t('category.errors.email_in_already_exist', {email_in: category_params[:email_in], category_name: existing_category.name})
|
2014-03-05 07:42:05 +08:00
|
|
|
end
|
2014-10-11 00:21:44 +08:00
|
|
|
|
2013-10-21 14:21:16 +08:00
|
|
|
category_params.delete(:position)
|
2014-10-11 00:21:44 +08:00
|
|
|
|
2013-10-21 14:21:16 +08:00
|
|
|
cat.update_attributes(category_params)
|
2014-10-11 00:21:44 +08:00
|
|
|
end
|
2013-02-06 03:16:51 +08:00
|
|
|
end
|
|
|
|
|
2014-12-20 22:07:29 +08:00
|
|
|
def update_slug
|
|
|
|
@category = Category.find(params[:category_id].to_i)
|
|
|
|
guardian.ensure_can_edit!(@category)
|
|
|
|
|
|
|
|
custom_slug = params[:slug].to_s
|
|
|
|
|
|
|
|
if custom_slug.present? && @category.update_attributes(slug: custom_slug)
|
|
|
|
render json: success_json
|
|
|
|
else
|
|
|
|
render_json_error(@category)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2014-04-17 17:17:39 +08:00
|
|
|
def set_notifications
|
|
|
|
category_id = params[:category_id].to_i
|
|
|
|
notification_level = params[:notification_level].to_i
|
|
|
|
|
2014-11-03 23:57:50 +08:00
|
|
|
CategoryUser.set_notification_level_for_category(current_user, notification_level, category_id)
|
2014-04-17 17:17:39 +08:00
|
|
|
render json: success_json
|
|
|
|
end
|
|
|
|
|
2013-02-06 03:16:51 +08:00
|
|
|
def destroy
|
2013-04-19 05:07:06 +08:00
|
|
|
guardian.ensure_can_delete!(@category)
|
|
|
|
@category.destroy
|
2013-10-21 12:24:37 +08:00
|
|
|
|
|
|
|
render json: success_json
|
2013-02-06 03:16:51 +08:00
|
|
|
end
|
|
|
|
|
|
|
|
private
|
|
|
|
|
2013-03-27 06:06:21 +08:00
|
|
|
def required_param_keys
|
2013-03-14 21:16:57 +08:00
|
|
|
[:name, :color, :text_color]
|
2013-02-06 03:16:51 +08:00
|
|
|
end
|
|
|
|
|
|
|
|
def category_params
|
2013-10-21 14:17:40 +08:00
|
|
|
@category_params ||= begin
|
|
|
|
required_param_keys.each do |key|
|
|
|
|
params.require(key)
|
|
|
|
end
|
2013-06-05 14:45:25 +08:00
|
|
|
|
2013-10-21 14:17:40 +08:00
|
|
|
if p = params[:permissions]
|
|
|
|
p.each do |k,v|
|
|
|
|
p[k] = v.to_i
|
|
|
|
end
|
2013-07-16 13:44:07 +08:00
|
|
|
end
|
|
|
|
|
2014-07-10 10:01:46 +08:00
|
|
|
params.permit(*required_param_keys,
|
|
|
|
:position,
|
|
|
|
:email_in,
|
|
|
|
:email_in_allow_strangers,
|
|
|
|
:parent_category_id,
|
|
|
|
:auto_close_hours,
|
2014-10-11 00:21:44 +08:00
|
|
|
:auto_close_based_on_last_post,
|
2014-07-10 10:01:46 +08:00
|
|
|
:logo_url,
|
|
|
|
:background_url,
|
|
|
|
:allow_badges,
|
2014-12-04 08:23:59 +08:00
|
|
|
:slug,
|
2014-07-10 10:01:46 +08:00
|
|
|
:permissions => [*p.try(:keys)])
|
2013-10-21 14:17:40 +08:00
|
|
|
end
|
2013-02-06 03:16:51 +08:00
|
|
|
end
|
2013-04-19 05:07:06 +08:00
|
|
|
|
|
|
|
def fetch_category
|
2014-05-06 21:41:59 +08:00
|
|
|
@category = Category.find_by(slug: params[:id]) || Category.find_by(id: params[:id].to_i)
|
2013-04-19 05:07:06 +08:00
|
|
|
end
|
2013-02-06 03:16:51 +08:00
|
|
|
end
|