diff --git a/gems/plugins/account_reports/app/views/accounts/_provisioning_csv_parameters.html.erb b/gems/plugins/account_reports/app/views/accounts/_provisioning_csv_parameters.html.erb
new file mode 100644
index 00000000000..cbca4cf65be
--- /dev/null
+++ b/gems/plugins/account_reports/app/views/accounts/_provisioning_csv_parameters.html.erb
@@ -0,0 +1,99 @@
+
+ <%= render :partial => 'terms_parameters', :locals => { :all_terms_option => true } %>
+
+
+
+ |
+
+
+
+
+ |
+
+
+
+
+ |
+
+
+
+
+ |
+
+
+
+
+ |
+
+
+
+
+ |
+
+
+
+
+ |
+
+
+
+
+ |
+
+
+
+
+ |
+
+
+
+
+ |
+
+
+
+
+ |
+
+
+
+
+ |
+
+ <%= render :partial => 'include_deleted_parameter' %>
+
diff --git a/gems/plugins/account_reports/lib/account_reports/engine.rb b/gems/plugins/account_reports/lib/account_reports/engine.rb
index cf7dbce927f..3db31f43f44 100644
--- a/gems/plugins/account_reports/lib/account_reports/engine.rb
+++ b/gems/plugins/account_reports/lib/account_reports/engine.rb
@@ -110,7 +110,7 @@ module AccountReports
},
'provisioning_csv' => {
:title => proc { I18n.t(:provisioning_title, 'Provisioning') },
- :parameters_partial => 'sis_export_csv_parameters',
+ :parameters_partial => 'provisioning_csv_parameters',
:description_partial => true,
:parameters => {
:enrollment_term_id => {
@@ -138,6 +138,9 @@ module AccountReports
:groups => {
:description => 'Get the Provisioning file for groups'
},
+ :group_categories => {
+ :description => 'Get the Provisioning file for group_categories'
+ },
:group_membership => {
:description => 'Get the Provisioning file for group_membership'
},
diff --git a/gems/plugins/account_reports/lib/account_reports/sis_exporter.rb b/gems/plugins/account_reports/lib/account_reports/sis_exporter.rb
index dc58352e8d8..58e3d2992a7 100644
--- a/gems/plugins/account_reports/lib/account_reports/sis_exporter.rb
+++ b/gems/plugins/account_reports/lib/account_reports/sis_exporter.rb
@@ -22,7 +22,7 @@ module AccountReports
class SisExporter
include ReportHelper
- SIS_CSV_REPORTS = ["users", "accounts", "terms", "courses", "sections", "enrollments", "groups", "group_membership", "xlist"]
+ SIS_CSV_REPORTS = ["users", "accounts", "terms", "courses", "sections", "enrollments", "groups", "group_membership", "group_categories", "xlist"].freeze
def initialize(account_report, params = {})
@account_report = account_report
@@ -490,6 +490,9 @@ module AccountReports
headers << I18n.t('#account_reports.report_header_name', 'name')
headers << I18n.t('#account_reports.report_header_status', 'status')
headers << I18n.t('created_by_sis')
+ headers << I18n.t('context_id')
+ headers << I18n.t('context_type')
+ headers << I18n.t('group_category_id')
end
groups = root_account.all_groups.
@@ -519,11 +522,56 @@ module AccountReports
row << g.name
row << g.workflow_state
row << g.sis_batch_id? unless @sis_format
+ row << g.context_id unless @sis_format
+ row << g.context_type unless @sis_format
+ row << g.group_category_id unless @sis_format
csv << row
end
end
end
+ def group_categories
+ return if @sis_format
+ headers = []
+ headers << I18n.t('canvas_group_category_id')
+ headers << I18n.t('context_id')
+ headers << I18n.t('context_type')
+ headers << I18n.t('name')
+ headers << I18n.t('role')
+ headers << I18n.t('self_signup')
+ headers << I18n.t('group_limit')
+ headers << I18n.t('auto_leader')
+
+ root_account.shard.activate do
+ group_categories = GroupCategory.
+ joins("LEFT JOIN #{Course.quoted_table_name} c ON c.id = group_categories.context_id AND group_categories.context_type = 'Course'").
+ joins("LEFT JOIN #{Account.quoted_table_name} a ON a.id = group_categories.context_id AND group_categories.context_type = 'Account'").
+ where("a.id IN (#{Account.sub_account_ids_recursive_sql(account.id)})
+ OR a.id=?
+ OR EXISTS (?)",
+ account,
+ CourseAccountAssociation.where("course_id=c.id").where(account_id: account))
+
+ unless @include_deleted
+ group_categories.where!('group_categories.deleted_at IS NULL')
+ end
+ generate_and_run_report headers do |csv|
+ group_categories.order('group_categories.id ASC').find_each do |g|
+ row = []
+ row << g.id
+ row << g.context_id
+ row << g.context_type
+ row << g.name
+ row << g.role
+ row << g.self_signup
+ row << g.group_limit
+ row << g.auto_leader
+ csv << row
+ end
+ end
+ end
+ end
+
def group_membership
if @sis_format
# headers are not translated on sis_export to maintain import compatibility
diff --git a/gems/plugins/account_reports/spec_canvas/sis_provisioning_reports_spec.rb b/gems/plugins/account_reports/spec_canvas/sis_provisioning_reports_spec.rb
index 0dce69091bc..cb467f1c495 100644
--- a/gems/plugins/account_reports/spec_canvas/sis_provisioning_reports_spec.rb
+++ b/gems/plugins/account_reports/spec_canvas/sis_provisioning_reports_spec.rb
@@ -95,6 +95,32 @@ describe "Default Account Reports" do
@term1.save!
end
+ def create_some_group_categories()
+ create_some_courses
+ @group_category1 = GroupCategory.create(
+ :name => 'Test Group Category'
+ )
+ @group_category2 = GroupCategory.create(
+ :name => 'Test Group Category2'
+ )
+ @group_category1.save!
+ @group_category2.auto_leader = 'first'
+ @group_category2.group_limit = 2
+ @group_category2.save!
+ @group_category3 = GroupCategory.create(
+ :name => 'Test Group Category Deleted'
+ )
+ @group_category4 = GroupCategory.create(
+ :name => 'Test Group Category Course'
+ )
+ @account.group_categories << @group_category1
+ @account.group_categories << @group_category2
+ @account.group_categories << @group_category3
+ @course3.group_categories << @group_category4
+ @group_category3.destroy
+ @account.save!
+ end
+
def create_some_terms()
create_a_term
@term2 = EnrollmentTerm.create(:name => 'Winter',:start_at => 3.weeks.ago,
@@ -224,13 +250,15 @@ describe "Default Account Reports" do
end
def create_some_groups()
- create_an_account()
+ create_some_group_categories
@group1 = @account.groups.create(:name => 'group1name')
+ @group1.group_category = @group_category1
@group1.sis_source_id = 'group1sis'
@group1.sis_batch_id = @sis.id
@group1.save!
@group2 = @sub_account.groups.create(:name => 'group2name')
@group2.sis_source_id = 'group2sis'
+ @group2.group_category = @group_category2
@group2.sis_batch_id = @sis.id
@group2.save!
@group3 = @sub_account.groups.create(:name => 'group3name')
@@ -240,6 +268,10 @@ describe "Default Account Reports" do
@group4.sis_batch_id = @sis.id
@group4.save!
@group4.destroy
+ @group5 = @course1.groups.create(:name => 'group5name')
+ @group5.sis_source_id = 'group5sis'
+ @group5.sis_batch_id = @sis.id
+ @group5.save!
end
def create_some_group_memberships_n_stuff()
@@ -838,9 +870,10 @@ describe "Default Account Reports" do
parameters["enrollment_term_id"] = @default_term.id
parameters["groups"] = true
parsed = read_report("sis_export_csv",{params: parameters, order: 2})
- expect(parsed.length).to eq 2
+ expect(parsed.length).to eq 3
expect(parsed[0]).to eq ["group1sis",nil,"group1name","available"]
expect(parsed[1]).to eq ["group2sis","sub1","group2name","available"]
+ expect(parsed[2]).to eq ["group5sis","sub1","group5name","available"]
end
it "should run the SIS report with deleted groups" do
@@ -848,23 +881,26 @@ describe "Default Account Reports" do
parameters["include_deleted"] = true
parameters["groups"] = true
parsed = read_report("sis_export_csv",{params: parameters, order: 2})
- expect(parsed.length).to eq 3
+ expect(parsed.length).to eq 4
expect(parsed[0]).to eq ["group1sis",nil,"group1name","available"]
expect(parsed[1]).to eq ["group2sis","sub1","group2name","available"]
expect(parsed[2]).to eq ["group4sis",nil,"group4name","deleted"]
+ expect(parsed[3]).to eq ["group5sis","sub1","group5name","available"]
end
it "should run the provisioning report" do
parameters = {}
parameters["groups"] = true
parsed = read_report("provisioning_csv", {params: parameters, order: 4})
- expect(parsed.length).to eq 3
+ expect(parsed.length).to eq 4
expect(parsed[0]).to eq [@group1.id.to_s, "group1sis", @account.id.to_s,
- nil, "group1name", "available", "true"]
+ nil, "group1name", "available", "true", @account.id.to_s, 'Account', @group1.group_category.id.to_s]
expect(parsed[1]).to eq [@group2.id.to_s, "group2sis", @sub_account.id.to_s,
- "sub1", "group2name", "available", "true"]
+ "sub1", "group2name", "available", "true", @sub_account.id.to_s, 'Account', @group2.group_category.id.to_s]
expect(parsed[2]).to eq [@group3.id.to_s, nil, @sub_account.id.to_s,
- "sub1", "group3name", "available", "false"]
+ "sub1", "group3name", "available", "false", @sub_account.id.to_s,'Account', nil]
+ expect(parsed[3]).to eq [@group5.id.to_s, "group5sis", @sub_account.id.to_s,
+ "sub1", "group5name", "available", "true", @course1.id.to_s,'Course', @group5.group_category.id.to_s]
end
it "should run the provisioning report on a sub account" do
@@ -873,9 +909,48 @@ describe "Default Account Reports" do
parsed = read_report("provisioning_csv", {params: parameters, account: @sub_account, order: 4})
expect(parsed.length).to eq 2
expect(parsed[0]).to eq [@group2.id.to_s, "group2sis", @sub_account.id.to_s,
- "sub1", "group2name", "available", "true"]
+ "sub1", "group2name", "available", "true", @sub_account.id.to_s, 'Account', @group2.group_category.id.to_s]
expect(parsed[1]).to eq [@group3.id.to_s, nil, @sub_account.id.to_s,
- "sub1", "group3name", "available", "false"]
+ "sub1", "group3name", "available", "false", @sub_account.id.to_s, 'Account', nil]
+ end
+ end
+
+ describe "Group Categories" do
+ before(:once) do
+ create_some_groups
+ @student_category = GroupCategory.where(name: "Student Groups").first
+ end
+
+ it 'should run the provisioning report' do
+ parameters = {}
+ parameters["group_categories"] = true
+ parsed = read_report("provisioning_csv", {params: parameters, order: 4})
+ expect(parsed.length).to eq 4
+ expect(parsed[0]).to eq [@group_category1.id.to_s, @account.id.to_s, "Account", "Test Group Category", nil, nil, nil, nil]
+ expect(parsed[1]).to eq [@group_category2.id.to_s, @account.id.to_s, "Account", "Test Group Category2", nil, nil, "2", "first"]
+ expect(parsed[2]).to eq [@group_category4.id.to_s, @course3.id.to_s, "Course", "Test Group Category Course", nil, nil, nil, nil]
+ expect(parsed[3]).to eq [@student_category.id.to_s, @course1.id.to_s, "Course", "Student Groups", "student_organized", nil, nil, nil]
+ end
+
+ it 'should run the provisioning report for a sub account' do
+ parameters = {}
+ parameters["group_categories"] = true
+ parsed = read_report("provisioning_csv", {params: parameters, order: 4, account: @sub_account})
+ expect(parsed.length).to eq 1
+ expect(parsed[0]).to eq [@student_category.id.to_s, @course1.id.to_s, "Course", "Student Groups", "student_organized", nil, nil, nil]
+ end
+
+ it 'should run the report for deleted categories' do
+ parameters = {}
+ parameters["group_categories"] = true
+ parameters["include_deleted"] = true
+ parsed = read_report("provisioning_csv", {params: parameters, order: 4})
+ expect(parsed.length).to eq 5
+ expect(parsed[0]).to eq [@group_category1.id.to_s, @account.id.to_s, "Account", "Test Group Category", nil, nil, nil, nil]
+ expect(parsed[1]).to eq [@group_category2.id.to_s, @account.id.to_s, "Account", "Test Group Category2", nil, nil, "2", "first"]
+ expect(parsed[2]).to eq [@group_category3.id.to_s, @account.id.to_s, "Account", "Test Group Category Deleted", nil, nil, nil, nil]
+ expect(parsed[3]).to eq [@group_category4.id.to_s, @course3.id.to_s, "Course", "Test Group Category Course", nil, nil, nil, nil]
+ expect(parsed[4]).to eq [@student_category.id.to_s, @course1.id.to_s, "Course", "Student Groups", "student_organized", nil, nil, nil]
end
end