diff --git a/app/assets/javascripts/discourse/controllers/topic-bulk-actions.js.es6 b/app/assets/javascripts/discourse/controllers/topic-bulk-actions.js.es6 index 97dd5accc..144c6f082 100644 --- a/app/assets/javascripts/discourse/controllers/topic-bulk-actions.js.es6 +++ b/app/assets/javascripts/discourse/controllers/topic-bulk-actions.js.es6 @@ -67,10 +67,10 @@ export default Ember.ArrayController.extend(Discourse.ModalFunctionality, { }, changeCategory: function() { - var category = Discourse.Category.findById(parseInt(this.get('newCategoryId'), 10)), - categoryName = (category ? category.get('name') : null), + var categoryId = parseInt(this.get('newCategoryId'), 10) || 0, + category = Discourse.Category.findById(categoryId), self = this; - this.perform({type: 'change_category', category_name: categoryName}).then(function(topics) { + this.perform({type: 'change_category', category_id: categoryId}).then(function(topics) { topics.forEach(function(t) { t.set('category', category); }); diff --git a/app/assets/javascripts/discourse/controllers/topic_controller.js b/app/assets/javascripts/discourse/controllers/topic_controller.js index 15f9c1b59..c52c72e46 100644 --- a/app/assets/javascripts/discourse/controllers/topic_controller.js +++ b/app/assets/javascripts/discourse/controllers/topic_controller.js @@ -214,7 +214,6 @@ Discourse.TopicController = Discourse.ObjectController.extend(Discourse.Selected }, finishedEditingTopic: function() { - var topicController = this; if (this.get('editingTopic')) { var topic = this.get('model'); @@ -230,6 +229,7 @@ Discourse.TopicController = Discourse.ObjectController.extend(Discourse.Selected }); // save the modifications + var self = this; topic.save().then(function(result){ // update the title if it has been changed (cleaned up) server-side var title = result.basic_topic.title; @@ -238,10 +238,10 @@ Discourse.TopicController = Discourse.ObjectController.extend(Discourse.Selected title: title, fancy_title: fancy_title }); - topicController.set('topicSaving', false); + self.set('topicSaving', false); }, function(error) { - topicController.set('editingTopic', true); - topicController.set('topicSaving', false); + self.set('editingTopic', true); + self.set('topicSaving', false); if (error && error.responseText) { bootbox.alert($.parseJSON(error.responseText).errors[0]); } else { @@ -250,7 +250,7 @@ Discourse.TopicController = Discourse.ObjectController.extend(Discourse.Selected }); // close editing mode - topicController.set('editingTopic', false); + self.set('editingTopic', false); } }, diff --git a/app/assets/javascripts/discourse/models/topic.js b/app/assets/javascripts/discourse/models/topic.js index 7a309f3fe..cb6943d9b 100644 --- a/app/assets/javascripts/discourse/models/topic.js +++ b/app/assets/javascripts/discourse/models/topic.js @@ -193,7 +193,7 @@ Discourse.Topic = Discourse.Model.extend({ return Discourse.ajax(this.get('url'), { type: 'PUT', - data: { title: this.get('title'), category: this.get('category.name') } + data: { title: this.get('title'), category_id: this.get('category.id') } }); }, diff --git a/app/assets/javascripts/discourse/models/topic_tracking_state.js b/app/assets/javascripts/discourse/models/topic_tracking_state.js index 29b79e7f4..94d009cfe 100644 --- a/app/assets/javascripts/discourse/models/topic_tracking_state.js +++ b/app/assets/javascripts/discourse/models/topic_tracking_state.js @@ -124,7 +124,7 @@ Discourse.TopicTrackingState = Discourse.Model.extend({ row.highest_post_number = topic.highest_post_number; if (topic.category) { - row.category_name = topic.category.name; + row.category_id = topic.category.id; } tracker.states["t" + topic.id] = row; @@ -137,7 +137,7 @@ Discourse.TopicTrackingState = Discourse.Model.extend({ this.set("messageCount", this.get("messageCount") + 1); }, - countNew: function(category_name){ + countNew: function(category_id){ return _.chain(this.states) .where({last_read_post_number: null}) .where(function(topic) { @@ -145,7 +145,7 @@ Discourse.TopicTrackingState = Discourse.Model.extend({ return (topic.notification_level !== 0 && !topic.notification_level) || topic.notification_level >= Discourse.Topic.NotificationLevel.TRACKING; }) - .where(function(topic){ return topic.category_name === category_name || !category_name;}) + .where(function(topic){ return topic.category_id === category_id || !category_id;}) .value() .length; }, @@ -159,22 +159,22 @@ Discourse.TopicTrackingState = Discourse.Model.extend({ }); }, - countUnread: function(category_name){ + countUnread: function(category_id){ return _.chain(this.states) .where(function(topic){ return topic.last_read_post_number !== null && topic.last_read_post_number < topic.highest_post_number; }) .where(function(topic) { return topic.notification_level >= Discourse.Topic.NotificationLevel.TRACKING}) - .where(function(topic){ return topic.category_name === category_name || !category_name;}) + .where(function(topic){ return topic.category_id === category_id || !category_id;}) .value() .length; }, - countCategory: function(category) { + countCategory: function(category_id) { var count = 0; _.each(this.states, function(topic){ - if (topic.category_name === category) { + if (topic.category_id === category_id) { count += (topic.last_read_post_number === null || topic.last_read_post_number < topic.highest_post_number) ? 1 : 0; } diff --git a/app/controllers/posts_controller.rb b/app/controllers/posts_controller.rb index 674ebc4cf..1d42fc4b3 100644 --- a/app/controllers/posts_controller.rb +++ b/app/controllers/posts_controller.rb @@ -106,11 +106,11 @@ class PostsController < ApplicationController # to stay consistent with the create api, # we should allow for title changes and category changes here # we should also move all of this to a post updater. - if post.post_number == 1 && (params[:title] || params[:post][:category]) + if post.post_number == 1 && (params[:title] || params[:post][:category_id]) post.topic.acting_user = current_user post.topic.title = params[:title] if params[:title] Topic.transaction do - post.topic.change_category(params[:post][:category]) + post.topic.change_category_to_id(params[:post][:category_id].to_i) post.topic.save end diff --git a/app/controllers/topics_controller.rb b/app/controllers/topics_controller.rb index 3328fcf60..0949e9d48 100644 --- a/app/controllers/topics_controller.rb +++ b/app/controllers/topics_controller.rb @@ -113,7 +113,7 @@ class TopicsController < ApplicationController success = false Topic.transaction do - success = topic.save && topic.change_category(params[:category]) + success = topic.save && topic.change_category_to_id(params[:category_id].to_i) end # this is used to return the title to the client as it may have been changed by "TextCleaner" diff --git a/app/models/topic.rb b/app/models/topic.rb index 87816f92b..71fde80df 100644 --- a/app/models/topic.rb +++ b/app/models/topic.rb @@ -493,13 +493,12 @@ class Topic < ActiveRecord::Base new_post end - # Changes the category to a new name - def change_category(name) + def change_category_to_id(category_id) # If the category name is blank, reset the attribute - if name.blank? + if (category_id.nil? || category_id.to_i == 0) cat = Category.find_by(id: SiteSetting.uncategorized_category_id) else - cat = Category.find_by(name: name) + cat = Category.where(id: category_id).first end return true if cat == category @@ -507,7 +506,6 @@ class Topic < ActiveRecord::Base changed_to_category(cat) end - def remove_allowed_user(username) user = User.find_by(username: username) if user diff --git a/app/models/topic_tracking_state.rb b/app/models/topic_tracking_state.rb index 1e1bd25a2..fbc5325ec 100644 --- a/app/models/topic_tracking_state.rb +++ b/app/models/topic_tracking_state.rb @@ -14,7 +14,7 @@ class TopicTrackingState :highest_post_number, :last_read_post_number, :created_at, - :category_name, + :category_id, :notification_level def self.publish_new(topic) @@ -118,7 +118,7 @@ class TopicTrackingState topics.created_at, highest_post_number, last_read_post_number, - c.name AS category_name, + c.id AS category_id, tu.notification_level FROM users u INNER JOIN user_stats AS us ON us.user_id = u.id diff --git a/app/serializers/topic_tracking_state_serializer.rb b/app/serializers/topic_tracking_state_serializer.rb index f90e8f646..f023863bf 100644 --- a/app/serializers/topic_tracking_state_serializer.rb +++ b/app/serializers/topic_tracking_state_serializer.rb @@ -1,3 +1,8 @@ class TopicTrackingStateSerializer < ApplicationSerializer - attributes :topic_id, :highest_post_number, :last_read_post_number, :created_at, :category_name, :notification_level + attributes :topic_id, + :highest_post_number, + :last_read_post_number, + :created_at, + :category_id, + :notification_level end diff --git a/lib/topics_bulk_action.rb b/lib/topics_bulk_action.rb index a0ee6f4ad..eb04a2903 100644 --- a/lib/topics_bulk_action.rb +++ b/lib/topics_bulk_action.rb @@ -26,7 +26,7 @@ class TopicsBulkAction def change_category topics.each do |t| if guardian.can_edit?(t) - @changed_ids << t.id if t.change_category(@operation[:category_name]) + @changed_ids << t.id if t.change_category_to_id(@operation[:category_id]) end end end diff --git a/spec/components/topics_bulk_action_spec.rb b/spec/components/topics_bulk_action_spec.rb index 1473677e9..00e56aa3a 100644 --- a/spec/components/topics_bulk_action_spec.rb +++ b/spec/components/topics_bulk_action_spec.rb @@ -18,7 +18,7 @@ describe TopicsBulkAction do context "when the user can edit the topic" do it "changes the category and returns the topic_id" do - tba = TopicsBulkAction.new(topic.user, [topic.id], type: 'change_category', category_name: category.name) + tba = TopicsBulkAction.new(topic.user, [topic.id], type: 'change_category', category_id: category.id) topic_ids = tba.perform! topic_ids.should == [topic.id] topic.reload @@ -29,7 +29,7 @@ describe TopicsBulkAction do context "when the user can't edit the topic" do it "doesn't change the category" do Guardian.any_instance.expects(:can_edit?).returns(false) - tba = TopicsBulkAction.new(topic.user, [topic.id], type: 'change_category', category_name: category.name) + tba = TopicsBulkAction.new(topic.user, [topic.id], type: 'change_category', category_id: category.id) topic_ids = tba.perform! topic_ids.should == [] topic.reload diff --git a/spec/controllers/topics_controller_spec.rb b/spec/controllers/topics_controller_spec.rb index e69c6b516..897c008f3 100644 --- a/spec/controllers/topics_controller_spec.rb +++ b/spec/controllers/topics_controller_spec.rb @@ -719,8 +719,8 @@ describe TopicsController do end it 'triggers a change of category' do - Topic.any_instance.expects(:change_category).with('incredible').returns(true) - xhr :put, :update, topic_id: @topic.id, slug: @topic.title, category: 'incredible' + Topic.any_instance.expects(:change_category_to_id).with(123).returns(true) + xhr :put, :update, topic_id: @topic.id, slug: @topic.title, category_id: 123 end it "returns errors with invalid titles" do @@ -729,8 +729,8 @@ describe TopicsController do end it "returns errors with invalid categories" do - Topic.any_instance.expects(:change_category).returns(false) - xhr :put, :update, topic_id: @topic.id, slug: @topic.title, category: '' + Topic.any_instance.expects(:change_category_to_id).returns(false) + xhr :put, :update, topic_id: @topic.id, slug: @topic.title expect(response).not_to be_success end @@ -740,8 +740,8 @@ describe TopicsController do end it "can add a category to an uncategorized topic" do - Topic.any_instance.expects(:change_category).with('incredible').returns(true) - xhr :put, :update, topic_id: @topic.id, slug: @topic.title, category: 'incredible' + Topic.any_instance.expects(:change_category_to_id).with(456).returns(true) + xhr :put, :update, topic_id: @topic.id, slug: @topic.title, category_id: 456 response.should be_success end end diff --git a/spec/models/category_spec.rb b/spec/models/category_spec.rb index f29c38331..04f88ee1b 100644 --- a/spec/models/category_spec.rb +++ b/spec/models/category_spec.rb @@ -236,7 +236,7 @@ describe Category do describe "trying to change the category topic's category" do before do @new_cat = Fabricate(:category, name: '2nd Category', user: @category.user) - @topic.change_category(@new_cat.name) + @topic.change_category_to_id(@new_cat.id) @topic.reload @category.reload end diff --git a/spec/models/topic_spec.rb b/spec/models/topic_spec.rb index fb41d5693..ca1b5676d 100644 --- a/spec/models/topic_spec.rb +++ b/spec/models/topic_spec.rb @@ -802,7 +802,7 @@ describe Topic do let(:category) { Fabricate(:category) } before do - topic.change_category(category.name) + topic.change_category_to_id(category.id) end it "creates a new revision" do @@ -811,7 +811,7 @@ describe Topic do context "removing a category" do before do - topic.change_category(nil) + topic.change_category_to_id(nil) end it "creates a new revision" do @@ -850,12 +850,12 @@ describe Topic do describe 'without a previous category' do it 'should not change the topic_count when not changed' do - lambda { @topic.change_category(@topic.category.name); @category.reload }.should_not change(@category, :topic_count) + lambda { @topic.change_category_to_id(@topic.category.id); @category.reload }.should_not change(@category, :topic_count) end describe 'changed category' do before do - @topic.change_category(@category.name) + @topic.change_category_to_id(@category.id) @category.reload end @@ -867,14 +867,14 @@ describe Topic do end it "doesn't change the category when it can't be found" do - @topic.change_category('made up') + @topic.change_category_to_id(12312312) @topic.category_id.should == SiteSetting.uncategorized_category_id end end describe 'with a previous category' do before do - @topic.change_category(@category.name) + @topic.change_category_to_id(@category.id) @topic.reload @category.reload end @@ -884,18 +884,18 @@ describe Topic do end it "doesn't change the topic_count when the value doesn't change" do - lambda { @topic.change_category(@category.name); @category.reload }.should_not change(@category, :topic_count) + lambda { @topic.change_category_to_id(@category.id); @category.reload }.should_not change(@category, :topic_count) end it "doesn't reset the category when given a name that doesn't exist" do - @topic.change_category('made up') + @topic.change_category_to_id(55556) @topic.category_id.should be_present end describe 'to a different category' do before do @new_category = Fabricate(:category, user: @user, name: '2nd category') - @topic.change_category(@new_category.name) + @topic.change_category_to_id(@new_category.id) @topic.reload @new_category.reload @category.reload @@ -918,13 +918,13 @@ describe Topic do let!(:topic) { Fabricate(:topic, category: Fabricate(:category)) } it 'returns false' do - topic.change_category('').should eq(false) # don't use "be_false" here because it would also match nil + topic.change_category_to_id(nil).should eq(false) # don't use "be_false" here because it would also match nil end end describe 'when the category exists' do before do - @topic.change_category(nil) + @topic.change_category_to_id(nil) @category.reload end