mirror of
https://github.com/discourse/discourse.git
synced 2025-06-04 23:36:11 +08:00
FEATURE: Admins should be able to create polls even when plugin is disabled.
This commit is contained in:
@ -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
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -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,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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;")
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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); }
|
||||||
};
|
};
|
||||||
|
@ -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: {
|
||||||
|
@ -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
|
||||||
*/
|
*/
|
||||||
|
@ -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
|
||||||
|
@ -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?
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user