FEATURE: make pin expiration mandatory

This commit is contained in:
Régis Hanol
2015-07-29 16:34:21 +02:00
parent 9e2632badd
commit faf4f44776
18 changed files with 192 additions and 97 deletions

View File

@@ -465,7 +465,7 @@ SQL
# the threshold has been reached, we will close the topic waiting for intervention
message = I18n.t("temporarily_closed_due_to_flags")
topic.update_status("closed", true, Discourse.system_user, message)
topic.update_status("closed", true, Discourse.system_user, message: message)
end
def self.auto_hide_if_needed(acting_user, post, post_action_type)

View File

@@ -406,8 +406,8 @@ class Topic < ActiveRecord::Base
similar
end
def update_status(status, enabled, user, message=nil)
TopicStatusUpdate.new(self, user).update!(status, enabled, message)
def update_status(status, enabled, user, opts={})
TopicStatusUpdate.new(self, user).update!(status, enabled, opts)
end
# Atomically creates the next post number
@@ -726,9 +726,17 @@ class Topic < ActiveRecord::Base
TopicUser.change(user.id, id, cleared_pinned_at: nil)
end
def update_pinned(status, global=false)
update_column(:pinned_at, status ? Time.now : nil)
update_column(:pinned_globally, global)
def update_pinned(status, global=false, pinned_until=nil)
pinned_until = Time.parse(pinned_until) rescue nil
update_columns(
pinned_at: status ? Time.now : nil,
pinned_globally: global,
pinned_until: pinned_until
)
Jobs.cancel_scheduled_job(:unpin_topic, topic_id: self.id)
Jobs.enqueue_at(pinned_until, :unpin_topic, topic_id: self.id) if pinned_until
end
def draft_key
@@ -745,6 +753,11 @@ class Topic < ActiveRecord::Base
end
end
def self.ensure_consistency!
# unpin topics that might have been missed
Topic.where("pinned_until < now()").update_all(pinned_at: nil, pinned_globally: false, pinned_until: nil)
end
def self.auto_close
Topic.where("NOT closed AND auto_close_at < ? AND auto_close_user_id IS NOT NULL", 1.minute.ago).each do |t|
t.auto_close

View File

@@ -1,21 +1,20 @@
TopicStatusUpdate = Struct.new(:topic, :user) do
def update!(status, enabled, message=nil)
def update!(status, enabled, opts={})
status = Status.new(status, enabled)
Topic.transaction do
change(status)
change(status, opts)
highest_post_number = topic.highest_post_number
create_moderator_post_for(status, message)
create_moderator_post_for(status, opts[:message])
update_read_state_for(status, highest_post_number)
end
end
private
def change(status)
def change(status, opts={})
if status.pinned? || status.pinned_globally?
topic.update_pinned(status.enabled?, status.pinned_globally?)
topic.update_pinned(status.enabled?, status.pinned_globally?, opts[:until])
elsif status.autoclosed?
topic.update_column('closed', status.enabled?)
else