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 = {
getURL: Discourse.getURLWithCDN,
currentUser: Discourse.__container__.lookup('current-user:main'),
siteSettings
};

View File

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

View File

@ -197,12 +197,16 @@ class Post < ActiveRecord::Base
if cook_method == Post.cook_methods[:email]
cooked = EmailCook.new(raw).cook
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)
else
# At trust level 3, we don't apply nofollow to links
cloned = args.dup
cloned[1] ||= {}
cloned[1][:omit_nofollow] = true
post_analyzer.cook(*cloned)
end

View File

@ -114,7 +114,7 @@ module PrettyText
end
end
def self.markdown(text, opts=nil)
def self.markdown(text, opts={})
# 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)
baked = nil
@ -143,7 +143,10 @@ module PrettyText
context.eval("__optInput.topicId = #{opts[:topicId].to_i};")
end
context.eval("__optInput.userId = #{opts[:user_id].to_i};") if opts[:user_id]
context.eval("__optInput.getURL = __getURL;")
context.eval("__optInput.getCurrentUser = __getCurrentUser;")
context.eval("__optInput.lookupAvatar = __lookupAvatar;")
context.eval("__optInput.getTopicInfo = __getTopicInfo;")
context.eval("__optInput.categoryHashtagLookup = __categoryLookup;")

View File

@ -68,6 +68,12 @@ module PrettyText
nil
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

View File

@ -46,6 +46,10 @@ function __lookupAvatar(p) {
return __utils.avatarImg({size: "tiny", avatarTemplate: __helpers.avatar_template(p) }, __getURL);
}
function __getCurrentUser(userId) {
return __helpers.get_current_user(userId);
}
I18n = {
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';
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");
ComposerController.reopen({
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");
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;
});
@ -179,11 +181,11 @@ export function setup(helper) {
/*!
* Joseph Myer's md5() algorithm wrapped in a self-invoked function to prevent
* 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>
* http://www.myersdaily.org/joseph/javascript/md5-text.html
* http://pajhome.org.uk/crypt/md5
*
*
* Released under the BSD license
* http://www.opensource.org/licenses/bsd-license
*/

View File

@ -7,7 +7,7 @@ module DiscoursePoll
def validate_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|
# polls should have a unique name

View File

@ -4,8 +4,6 @@
# authors: Vikhyat Korrapati (vikhyat), Régis Hanol (zogstrip)
# 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-ui-builder.scss"
register_asset "stylesheets/desktop/poll.scss", :desktop
@ -145,10 +143,10 @@ after_initialize do
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
# 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)
extracted_polls = []
@ -252,6 +250,8 @@ after_initialize do
end
validate(:post, :validate_polls) do
return if !SiteSetting.poll_enabled? && (self.user && !self.user.staff?)
# only care when raw has changed!
return unless self.raw_changed?