FEATURE: Admins should be able to create polls even when plugin is disabled.

This commit is contained in:
Guo Xiang Tan
2016-07-07 15:52:56 +08:00
parent 467b35df14
commit c3cab98998
10 changed files with 50 additions and 13 deletions

View File

@ -7,6 +7,7 @@ export function cook(text) {
const opts = { const opts = {
getURL: Discourse.getURLWithCDN, getURL: Discourse.getURLWithCDN,
currentUser: Discourse.__container__.lookup('current-user:main'),
siteSettings siteSettings
}; };

View File

@ -12,7 +12,17 @@ export function registerOption(fn) {
export function buildOptions(state) { export function buildOptions(state) {
setup(); setup();
const { siteSettings, getURL, lookupAvatar, getTopicInfo, topicId, categoryHashtagLookup } = state; const {
siteSettings,
getURL,
lookupAvatar,
getTopicInfo,
topicId,
categoryHashtagLookup,
userId,
getCurrentUser,
currentUser
} = state;
const features = { const features = {
'bold-italics': true, 'bold-italics': true,
@ -34,6 +44,9 @@ export function buildOptions(state) {
getTopicInfo, getTopicInfo,
topicId, topicId,
categoryHashtagLookup, categoryHashtagLookup,
userId,
getCurrentUser,
currentUser,
mentionLookup: state.mentionLookup, mentionLookup: state.mentionLookup,
}; };

View File

@ -197,12 +197,16 @@ class Post < ActiveRecord::Base
if cook_method == Post.cook_methods[:email] if cook_method == Post.cook_methods[:email]
cooked = EmailCook.new(raw).cook cooked = EmailCook.new(raw).cook
else else
cooked = if !self.user || SiteSetting.tl3_links_no_follow || !self.user.has_trust_level?(TrustLevel[3]) cloned = args.dup
cloned[1] ||= {}
post_user = self.user
cloned[1][:user_id] = post_user.id if post_user
cooked = if !post_user || SiteSetting.tl3_links_no_follow || !post_user.has_trust_level?(TrustLevel[3])
post_analyzer.cook(*args) post_analyzer.cook(*args)
else else
# At trust level 3, we don't apply nofollow to links # At trust level 3, we don't apply nofollow to links
cloned = args.dup
cloned[1] ||= {}
cloned[1][:omit_nofollow] = true cloned[1][:omit_nofollow] = true
post_analyzer.cook(*cloned) post_analyzer.cook(*cloned)
end end

View File

@ -114,7 +114,7 @@ module PrettyText
end end
end end
def self.markdown(text, opts=nil) def self.markdown(text, opts={})
# we use the exact same markdown converter as the client # we use the exact same markdown converter as the client
# TODO: use the same extensions on both client and server (in particular the template for mentions) # TODO: use the same extensions on both client and server (in particular the template for mentions)
baked = nil baked = nil
@ -143,7 +143,10 @@ module PrettyText
context.eval("__optInput.topicId = #{opts[:topicId].to_i};") context.eval("__optInput.topicId = #{opts[:topicId].to_i};")
end end
context.eval("__optInput.userId = #{opts[:user_id].to_i};") if opts[:user_id]
context.eval("__optInput.getURL = __getURL;") context.eval("__optInput.getURL = __getURL;")
context.eval("__optInput.getCurrentUser = __getCurrentUser;")
context.eval("__optInput.lookupAvatar = __lookupAvatar;") context.eval("__optInput.lookupAvatar = __lookupAvatar;")
context.eval("__optInput.getTopicInfo = __getTopicInfo;") context.eval("__optInput.getTopicInfo = __getTopicInfo;")
context.eval("__optInput.categoryHashtagLookup = __categoryLookup;") context.eval("__optInput.categoryHashtagLookup = __categoryLookup;")

View File

@ -68,6 +68,12 @@ module PrettyText
nil nil
end end
end end
def get_current_user(user_id)
user = User.find_by(id: user_id)
staff = user ? user.staff? : false
{ staff: staff }
end
end end
end end

View File

@ -46,6 +46,10 @@ function __lookupAvatar(p) {
return __utils.avatarImg({size: "tiny", avatarTemplate: __helpers.avatar_template(p) }, __getURL); return __utils.avatarImg({size: "tiny", avatarTemplate: __helpers.avatar_template(p) }, __getURL);
} }
function __getCurrentUser(userId) {
return __helpers.get_current_user(userId);
}
I18n = { I18n = {
t: function(a,b) { return __helpers.t(a,b); } t: function(a,b) { return __helpers.t(a,b); }
}; };

View File

@ -2,6 +2,10 @@ import { withPluginApi } from 'discourse/lib/plugin-api';
import showModal from 'discourse/lib/show-modal'; import showModal from 'discourse/lib/show-modal';
function initializePollUIBuilder(api) { function initializePollUIBuilder(api) {
const siteSettings = api.container.lookup('site-settings:main');
if (!siteSettings.poll_enabled && (api.getCurrentUser() && !api.getCurrentUser().staff)) return;
const ComposerController = api.container.lookupFactory("controller:composer"); const ComposerController = api.container.lookupFactory("controller:composer");
ComposerController.reopen({ ComposerController.reopen({
actions: { actions: {

View File

@ -7,7 +7,9 @@ const WHITELISTED_ATTRIBUTES = ["type", "name", "min", "max", "step", "order", "
const ATTRIBUTES_REGEX = new RegExp("(" + WHITELISTED_ATTRIBUTES.join("|") + ")=['\"]?[^\\s\\]]+['\"]?", "g"); const ATTRIBUTES_REGEX = new RegExp("(" + WHITELISTED_ATTRIBUTES.join("|") + ")=['\"]?[^\\s\\]]+['\"]?", "g");
registerOption((siteSettings, opts) => { registerOption((siteSettings, opts) => {
opts.features.poll = !!siteSettings.poll_enabled; const currentUser = (opts.getCurrentUser && opts.getCurrentUser(opts.userId)) || opts.currentUser;
opts.features.poll = !!siteSettings.poll_enabled || currentUser.staff;
opts.pollMaximumOptions = siteSettings.poll_maximum_options; opts.pollMaximumOptions = siteSettings.poll_maximum_options;
}); });
@ -179,11 +181,11 @@ export function setup(helper) {
/*! /*!
* Joseph Myer's md5() algorithm wrapped in a self-invoked function to prevent * Joseph Myer's md5() algorithm wrapped in a self-invoked function to prevent
* global namespace polution, modified to hash unicode characters as UTF-8. * global namespace polution, modified to hash unicode characters as UTF-8.
* *
* Copyright 1999-2010, Joseph Myers, Paul Johnston, Greg Holt, Will Bond <will@wbond.net> * Copyright 1999-2010, Joseph Myers, Paul Johnston, Greg Holt, Will Bond <will@wbond.net>
* http://www.myersdaily.org/joseph/javascript/md5-text.html * http://www.myersdaily.org/joseph/javascript/md5-text.html
* http://pajhome.org.uk/crypt/md5 * http://pajhome.org.uk/crypt/md5
* *
* Released under the BSD license * Released under the BSD license
* http://www.opensource.org/licenses/bsd-license * http://www.opensource.org/licenses/bsd-license
*/ */

View File

@ -7,7 +7,7 @@ module DiscoursePoll
def validate_polls def validate_polls
polls = {} polls = {}
extracted_polls = DiscoursePoll::Poll::extract(@post.raw, @post.topic_id) extracted_polls = DiscoursePoll::Poll::extract(@post.raw, @post.topic_id, @post.user_id)
extracted_polls.each do |poll| extracted_polls.each do |poll|
# polls should have a unique name # polls should have a unique name

View File

@ -4,8 +4,6 @@
# authors: Vikhyat Korrapati (vikhyat), Régis Hanol (zogstrip) # authors: Vikhyat Korrapati (vikhyat), Régis Hanol (zogstrip)
# url: https://github.com/discourse/discourse/tree/master/plugins/poll # url: https://github.com/discourse/discourse/tree/master/plugins/poll
enabled_site_setting :poll_enabled
register_asset "stylesheets/common/poll.scss" register_asset "stylesheets/common/poll.scss"
register_asset "stylesheets/common/poll-ui-builder.scss" register_asset "stylesheets/common/poll-ui-builder.scss"
register_asset "stylesheets/desktop/poll.scss", :desktop register_asset "stylesheets/desktop/poll.scss", :desktop
@ -145,10 +143,10 @@ after_initialize do
end end
end end
def extract(raw, topic_id) def extract(raw, topic_id, user_id = nil)
# TODO: we should fix the callback mess so that the cooked version is available # TODO: we should fix the callback mess so that the cooked version is available
# in the validators instead of cooking twice # in the validators instead of cooking twice
cooked = PrettyText.cook(raw, topic_id: topic_id) cooked = PrettyText.cook(raw, topic_id: topic_id, user_id: user_id)
parsed = Nokogiri::HTML(cooked) parsed = Nokogiri::HTML(cooked)
extracted_polls = [] extracted_polls = []
@ -252,6 +250,8 @@ after_initialize do
end end
validate(:post, :validate_polls) do validate(:post, :validate_polls) do
return if !SiteSetting.poll_enabled? && (self.user && !self.user.staff?)
# only care when raw has changed! # only care when raw has changed!
return unless self.raw_changed? return unless self.raw_changed?