canvas-lms/lib/canvas/plugins/ticketing_system.rb

110 lines
4.3 KiB
Ruby

#
# Copyright (C) 2015 - present Instructure, Inc.
#
# This file is part of Canvas.
#
# Canvas is free software: you can redistribute it and/or modify it under
# the terms of the GNU Affero General Public License as published by the Free
# Software Foundation, version 3 of the License.
#
# Canvas is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
# A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
# details.
#
# You should have received a copy of the GNU Affero General Public License along
# with this program. If not, see <http://www.gnu.org/licenses/>.
# Plugin and module for Bring Your Own Ticketing System
#
# The idea is that other connectors for specific ticketing systems
# (zendesk, servicecloud, etc) could be registersed
# as another plugin with "byots" as their tag and use the settings
# from this one to decide which ticketing system to use per account.
#
module Canvas::Plugins
module TicketingSystem
# can use this constant as the "tag" for other connectors
PLUGIN_ID = 'ticketing_system'
class << self
# public, but not for you to use. this method wraps the registration
# that "default_plugins.rb" does, so since there's a little behavior
# this plugin needs anyway, may as well let it manage it's own
# registration
def register!
Canvas::Plugin.register(PLUGIN_ID, nil, {
name: ->{ I18n.t 'Ticketing System' },
description: ->{ I18n.t 'Ticketing system configurations' },
author: 'Instructure',
author_website: 'http://www.instructure.com',
version: '1.0.0',
settings_partial: 'plugins/ticketing_system_settings',
validator: 'TicketingSystemValidator'
})
TicketingSystem::EmailPlugin.new(self).register!
TicketingSystem::WebPostPlugin.new(self).register!
end
# any child plugin can use this method to register itself
# without having to know about Canvas's plugin architecture,
# or the tag it needs to use, or the way to register a callback
# with error_report.rb
#
# Params:
# plugin_id -> String, some unique string identifier for this plugin
# options -> Hash, a settings hash similar to the one this plugin uses
# above in ".register!"
# callback -> Block<ErrorReport>, the thing that should run everytime
# an error report is created in Canvas
def register_plugin(plugin_id, options, &callback)
Canvas::Plugin.register(plugin_id, PLUGIN_ID, options)
::ErrorReport.set_callback(:on_send_to_external) do |report|
callback.call(report)
end
end
# grabs the settings for a given plugin ID from the plugins
# module, but gives some nil protection with a default empty hash
#
# returns Hash
def get_settings(plugin_id)
Canvas::Plugin.find(plugin_id).try(:settings) || {}
end
# provided for each connector to check and see if they're the contextually
# selected plugin to use. For example, if there were a connector to
# the MeerkatSupport ticekting service, it would have registered itself
# as the "meerkat_support" plugin with "byots" as it's tag,
# and when checking to see if it needed
# to execute its behavior for a given callback, it might check:
#
# Canvas::TicketingSystem.is_selected?("meerkat_support")
#
# to see if it was enabled (that is, selected as the BYOTS connector
# for this given account).
#
# returns true/false
def is_selected?(plugin_id, setting_registry = PluginSetting)
setting = setting_registry.settings_for_plugin(PLUGIN_ID)
return false if setting.nil?
plugin_id.to_s == setting[:type].to_s
end
# Helper that returns other plugins that have been registered
# with this tag, useful for generating a list of these (in the
# select box for picking which plugin to use in the settings
# area, for example) without just having to repeat this id
# everywhere
#
# returns Array<Canvas::Plugin>
def registered_extensions
Canvas::Plugin.all_for_tag(PLUGIN_ID)
end
end
end
end