DEV: Update plugin to match latest guidelines (#446)
- Define extension modules - Use different files instead of plugin.rb - Make sure the plugin is disabled according to the setting
This commit is contained in:
parent
c95c520a6e
commit
d8ad876368
|
@ -2,6 +2,7 @@
|
|||
|
||||
module DiscourseAssign
|
||||
class AssignController < ApplicationController
|
||||
requires_plugin DiscourseAssign::PLUGIN_NAME
|
||||
requires_login
|
||||
before_action :ensure_logged_in, :ensure_assign_allowed
|
||||
|
||||
|
|
|
@ -1,8 +0,0 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
module ::DiscourseAssign
|
||||
class Engine < ::Rails::Engine
|
||||
engine_name "discourse_assign"
|
||||
isolate_namespace DiscourseAssign
|
||||
end
|
||||
end
|
|
@ -0,0 +1,25 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
module DiscourseAssign
|
||||
module GroupExtension
|
||||
def self.prepended(base)
|
||||
base.class_eval do
|
||||
scope :assignable,
|
||||
->(user) {
|
||||
where(
|
||||
"assignable_level in (:levels) OR
|
||||
(
|
||||
assignable_level = #{Group::ALIAS_LEVELS[:members_mods_and_admins]} AND id in (
|
||||
SELECT group_id FROM group_users WHERE user_id = :user_id)
|
||||
) OR (
|
||||
assignable_level = #{Group::ALIAS_LEVELS[:owners_mods_and_admins]} AND id in (
|
||||
SELECT group_id FROM group_users WHERE user_id = :user_id AND owner IS TRUE)
|
||||
)",
|
||||
levels: alias_levels(user),
|
||||
user_id: user&.id,
|
||||
)
|
||||
}
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
|
@ -0,0 +1,9 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
module DiscourseAssign
|
||||
module ListControllerExtension
|
||||
def self.prepended(base)
|
||||
base.class_eval { generate_message_route(:private_messages_assigned) }
|
||||
end
|
||||
end
|
||||
end
|
|
@ -0,0 +1,9 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
module DiscourseAssign
|
||||
module PostExtension
|
||||
def self.prepended(base)
|
||||
base.class_eval { has_one :assignment, as: :target, dependent: :destroy }
|
||||
end
|
||||
end
|
||||
end
|
|
@ -0,0 +1,9 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
module DiscourseAssign
|
||||
module TopicExtension
|
||||
def self.prepended(base)
|
||||
base.class_eval { has_one :assignment, as: :target, dependent: :destroy }
|
||||
end
|
||||
end
|
||||
end
|
|
@ -0,0 +1,15 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
module DiscourseAssign
|
||||
module WebHookExtension
|
||||
def self.prepended(base)
|
||||
base.class_eval do
|
||||
def self.enqueue_assign_hooks(event, payload)
|
||||
if active_web_hooks("assign").exists?
|
||||
WebHook.enqueue_hooks(:assign, event, payload: payload)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
104
plugin.rb
104
plugin.rb
|
@ -14,13 +14,49 @@ register_asset "stylesheets/mobile/assigns.scss", :mobile
|
|||
|
||||
%w[user-plus user-times group-plus group-times].each { |i| register_svg_icon(i) }
|
||||
|
||||
load File.expand_path("../lib/discourse_assign/engine.rb", __FILE__)
|
||||
load File.expand_path("../lib/discourse_assign/helpers.rb", __FILE__)
|
||||
load File.expand_path("../lib/validators/assign_statuses_validator.rb", __FILE__)
|
||||
load File.expand_path("../lib/discourse_calendar.rb", __FILE__)
|
||||
require_relative "app/models/assign_mailer_site_settings.rb"
|
||||
require_relative "app/models/remind_assigns_frequency_site_settings.rb"
|
||||
require_relative "lib/validators/assign_statuses_validator.rb"
|
||||
|
||||
Discourse::Application.routes.append do
|
||||
after_initialize do
|
||||
module ::DiscourseAssign
|
||||
PLUGIN_NAME = "discourse-assign"
|
||||
|
||||
class Engine < ::Rails::Engine
|
||||
engine_name DiscourseAssign::PLUGIN_NAME
|
||||
isolate_namespace DiscourseAssign
|
||||
end
|
||||
end
|
||||
|
||||
require_relative "app/controllers/discourse_assign/assign_controller.rb"
|
||||
require_relative "app/mailers/assign_mailer.rb"
|
||||
require_relative "app/models/assign_mailer_site_settings.rb"
|
||||
require_relative "app/models/assignment.rb"
|
||||
require_relative "app/models/remind_assigns_frequency_site_settings.rb"
|
||||
require_relative "app/serializers/assigned_group_serializer.rb"
|
||||
require_relative "app/serializers/assigned_topic_serializer.rb"
|
||||
require_relative "app/serializers/group_user_assigned_serializer.rb"
|
||||
require_relative "config/routes.rb"
|
||||
require_relative "jobs/regular/assign_notification.rb"
|
||||
require_relative "jobs/regular/remind_user.rb"
|
||||
require_relative "jobs/regular/unassign_notification.rb"
|
||||
require_relative "jobs/scheduled/enqueue_reminders.rb"
|
||||
require_relative "lib/assigner.rb"
|
||||
require_relative "lib/discourse_assign/discourse_calendar.rb"
|
||||
require_relative "lib/discourse_assign/group_extension.rb"
|
||||
require_relative "lib/discourse_assign/helpers.rb"
|
||||
require_relative "lib/discourse_assign/list_controller_extension.rb"
|
||||
require_relative "lib/discourse_assign/post_extension.rb"
|
||||
require_relative "lib/discourse_assign/topic_extension.rb"
|
||||
require_relative "lib/discourse_assign/web_hook_extension.rb"
|
||||
require_relative "lib/pending_assigns_reminder.rb"
|
||||
require_relative "lib/random_assign_utils.rb"
|
||||
require_relative "lib/topic_assigner.rb"
|
||||
require_relative "lib/validators/assign_statuses_validator.rb"
|
||||
|
||||
Discourse::Application.routes.append do
|
||||
mount ::DiscourseAssign::Engine, at: "/assign"
|
||||
|
||||
get "topics/private-messages-assigned/:username" => "list#private_messages_assigned",
|
||||
:as => "topics_private_messages_assigned",
|
||||
:constraints => {
|
||||
|
@ -38,50 +74,20 @@ Discourse::Application.routes.append do
|
|||
:as => "group_topics_assigned"
|
||||
get "/g/:id/assigned" => "groups#index"
|
||||
get "/g/:id/assigned/:route_type" => "groups#index"
|
||||
end
|
||||
end
|
||||
|
||||
after_initialize do
|
||||
require File.expand_path("../jobs/scheduled/enqueue_reminders.rb", __FILE__)
|
||||
require File.expand_path("../jobs/regular/remind_user.rb", __FILE__)
|
||||
require File.expand_path("../jobs/regular/assign_notification.rb", __FILE__)
|
||||
require File.expand_path("../jobs/regular/unassign_notification.rb", __FILE__)
|
||||
require "topic_assigner"
|
||||
require "assigner"
|
||||
require "pending_assigns_reminder"
|
||||
reloadable_patch do |plugin|
|
||||
Group.class_eval { prepend DiscourseAssign::GroupExtension }
|
||||
Post.class_eval { prepend DiscourseAssign::PostExtension }
|
||||
Topic.class_eval { prepend DiscourseAssign::TopicExtension }
|
||||
WebHook.class_eval { prepend DiscourseAssign::WebHookExtension }
|
||||
end
|
||||
|
||||
register_group_param(:assignable_level)
|
||||
register_groups_callback_for_users_search_controller_action(:assignable_groups) do |groups, user|
|
||||
groups.assignable(user)
|
||||
end
|
||||
|
||||
reloadable_patch do |plugin|
|
||||
class ::Topic
|
||||
has_one :assignment, as: :target, dependent: :destroy
|
||||
end
|
||||
|
||||
class ::Post
|
||||
has_one :assignment, as: :target, dependent: :destroy
|
||||
end
|
||||
|
||||
class ::Group
|
||||
scope :assignable,
|
||||
->(user) {
|
||||
where(
|
||||
"assignable_level in (:levels) OR
|
||||
(
|
||||
assignable_level = #{ALIAS_LEVELS[:members_mods_and_admins]} AND id in (
|
||||
SELECT group_id FROM group_users WHERE user_id = :user_id)
|
||||
) OR (
|
||||
assignable_level = #{ALIAS_LEVELS[:owners_mods_and_admins]} AND id in (
|
||||
SELECT group_id FROM group_users WHERE user_id = :user_id AND owner IS TRUE)
|
||||
)",
|
||||
levels: alias_levels(user),
|
||||
user_id: user && user.id,
|
||||
)
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
frequency_field = PendingAssignsReminder::REMINDERS_FREQUENCY
|
||||
register_editable_user_custom_field frequency_field
|
||||
User.register_custom_field_type frequency_field, :integer
|
||||
|
@ -328,7 +334,6 @@ after_initialize do
|
|||
end
|
||||
|
||||
# TopicQuery
|
||||
require_dependency "topic_query"
|
||||
TopicQuery.add_custom_filter(:assigned) do |results, topic_query|
|
||||
name = topic_query.options[:assigned]
|
||||
next results if name.blank?
|
||||
|
@ -449,11 +454,6 @@ after_initialize do
|
|||
end
|
||||
|
||||
# ListController
|
||||
require_dependency "list_controller"
|
||||
class ::ListController
|
||||
generate_message_route(:private_messages_assigned)
|
||||
end
|
||||
|
||||
add_to_class(:list_controller, :messages_assigned) do
|
||||
user = User.find_by_username(params[:username])
|
||||
raise Discourse::NotFound unless user
|
||||
|
@ -921,12 +921,6 @@ after_initialize do
|
|||
end
|
||||
end
|
||||
|
||||
class ::WebHook
|
||||
def self.enqueue_assign_hooks(event, payload)
|
||||
WebHook.enqueue_hooks(:assign, event, payload: payload) if active_web_hooks("assign").exists?
|
||||
end
|
||||
end
|
||||
|
||||
register_search_advanced_filter(/in:assigned/) do |posts|
|
||||
posts.where(<<~SQL) if @guardian.can_assign?
|
||||
topics.id IN (
|
||||
|
@ -962,8 +956,6 @@ after_initialize do
|
|||
end
|
||||
|
||||
if defined?(DiscourseAutomation)
|
||||
require "random_assign_utils"
|
||||
|
||||
add_automation_scriptable("random_assign") do
|
||||
field :assignees_group, component: :group, required: true
|
||||
field :assigned_topic, component: :text, required: true
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
|
||||
require "rails_helper"
|
||||
require_relative "../support/assign_allowed_group"
|
||||
require "random_assign_utils"
|
||||
|
||||
describe RandomAssignUtils do
|
||||
before do
|
||||
|
|
|
@ -502,10 +502,10 @@ RSpec.describe DiscourseAssign::AssignController do
|
|||
expect(response.status).to eq(403)
|
||||
end
|
||||
|
||||
it "responds with 403 if the assign_enabled setting is disabled" do
|
||||
it "responds with 404 if the assign_enabled setting is disabled" do
|
||||
SiteSetting.assign_enabled = false
|
||||
get "/assign/user-menu-assigns.json"
|
||||
expect(response.status).to eq(403)
|
||||
expect(response.status).to eq(404)
|
||||
end
|
||||
|
||||
it "sends an array of unread assigned notifications" do
|
||||
|
|
Loading…
Reference in New Issue