FEATURE: do not suggest users on vacation (#395)
This commit is contained in:
parent
feca27b6bd
commit
31d1a798f4
|
@ -6,22 +6,7 @@ module DiscourseAssign
|
|||
before_action :ensure_logged_in, :ensure_assign_allowed
|
||||
|
||||
def suggestions
|
||||
users = [current_user]
|
||||
users +=
|
||||
User
|
||||
.where("users.id <> ?", current_user.id)
|
||||
.joins(<<~SQL)
|
||||
JOIN(
|
||||
SELECT assigned_to_id user_id, MAX(created_at) last_assigned
|
||||
FROM assignments
|
||||
WHERE assignments.assigned_to_type = 'User'
|
||||
GROUP BY assigned_to_id
|
||||
HAVING COUNT(*) < #{SiteSetting.max_assigned_topics}
|
||||
) as X ON X.user_id = users.id
|
||||
SQL
|
||||
.assign_allowed
|
||||
.order("X.last_assigned DESC")
|
||||
.limit(6)
|
||||
users = [current_user, *recent_assignees]
|
||||
|
||||
render json: {
|
||||
assign_allowed_on_groups:
|
||||
|
@ -279,5 +264,30 @@ module DiscourseAssign
|
|||
def user_menu_limit
|
||||
UsersController::USER_MENU_LIST_LIMIT
|
||||
end
|
||||
|
||||
def recent_assignees
|
||||
User
|
||||
.where("users.id <> ?", current_user.id)
|
||||
.joins(<<~SQL)
|
||||
JOIN(
|
||||
SELECT assigned_to_id user_id, MAX(created_at) last_assigned
|
||||
FROM assignments
|
||||
WHERE assignments.assigned_to_type = 'User'
|
||||
GROUP BY assigned_to_id
|
||||
HAVING COUNT(*) < #{SiteSetting.max_assigned_topics}
|
||||
) as X ON X.user_id = users.id
|
||||
SQL
|
||||
.joins(<<~SQL)
|
||||
LEFT JOIN(
|
||||
SELECT DISTINCT ON (user_id) name, user_id
|
||||
FROM user_custom_fields
|
||||
WHERE name = '#{DiscourseCalendar::HOLIDAY_CUSTOM_FIELD}'
|
||||
) AS ucf on ucf.user_id = users.id
|
||||
SQL
|
||||
.where("ucf.name is NULL")
|
||||
.assign_allowed
|
||||
.order("X.last_assigned DESC")
|
||||
.limit(6)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -0,0 +1,7 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
module DiscourseAssign
|
||||
module DiscourseCalendar
|
||||
HOLIDAY_CUSTOM_FIELD ||= 'on_holiday'
|
||||
end
|
||||
end
|
|
@ -17,6 +17,7 @@ register_asset "stylesheets/mobile/assigns.scss", :mobile
|
|||
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__)
|
||||
|
||||
Discourse::Application.routes.append do
|
||||
mount ::DiscourseAssign::Engine, at: "/assign"
|
||||
|
|
|
@ -94,11 +94,39 @@ RSpec.describe DiscourseAssign::AssignController do
|
|||
|
||||
describe "#suggestions" do
|
||||
before do
|
||||
SiteSetting.max_assigned_topics = 1
|
||||
sign_in(user)
|
||||
end
|
||||
|
||||
it "suggests the current user + the last 6 previously assigned users" do
|
||||
assignees = 10.times.map { |_| assign_user_to_post.username }
|
||||
|
||||
get "/assign/suggestions.json"
|
||||
|
||||
suggestions = response.parsed_body["suggestions"].map { |u| u["username"] }
|
||||
expect(suggestions).to contain_exactly(user.username, *assignees[4..9])
|
||||
end
|
||||
|
||||
it "doesn't suggest users on holiday" do
|
||||
user_on_vacation = assign_user_to_post
|
||||
user_on_vacation.upsert_custom_fields(DiscourseAssign::DiscourseCalendar::HOLIDAY_CUSTOM_FIELD => "t")
|
||||
|
||||
get "/assign/suggestions.json"
|
||||
|
||||
suggestions = response.parsed_body["suggestions"].map { |u| u["username"] }
|
||||
expect(suggestions).to_not include(user_on_vacation.username)
|
||||
end
|
||||
|
||||
it "suggests the current user even if they're on holiday" do
|
||||
user.upsert_custom_fields(DiscourseAssign::DiscourseCalendar::HOLIDAY_CUSTOM_FIELD => "t")
|
||||
|
||||
get "/assign/suggestions.json"
|
||||
|
||||
suggestions = response.parsed_body["suggestions"].map { |u| u["username"] }
|
||||
expect(suggestions).to include(user.username)
|
||||
end
|
||||
|
||||
it "excludes other users from the suggestions when they already reached the max assigns limit" do
|
||||
SiteSetting.max_assigned_topics = 1
|
||||
another_admin = Fabricate(:admin, groups: [default_allowed_group])
|
||||
Assigner.new(post.topic, user).assign(another_admin)
|
||||
|
||||
|
@ -107,6 +135,13 @@ RSpec.describe DiscourseAssign::AssignController do
|
|||
|
||||
expect(suggestions).to contain_exactly(user.username)
|
||||
end
|
||||
|
||||
def assign_user_to_post
|
||||
assignee = Fabricate(:user, groups: [default_allowed_group])
|
||||
post = Fabricate(:post)
|
||||
Assigner.new(post.topic, user).assign(assignee)
|
||||
assignee
|
||||
end
|
||||
end
|
||||
|
||||
describe "#assign" do
|
||||
|
|
Loading…
Reference in New Issue