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