mirror of
https://github.com/discourse/discourse.git
synced 2025-02-25 18:55:32 -06:00
FEATURE: make pin expiration mandatory
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user