--- loncom/interface/lonuserutils.pm 2009/10/31 14:27:48 1.102 +++ loncom/interface/lonuserutils.pm 2010/01/19 18:02:20 1.113 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Utility functions for managing LON-CAPA user accounts # -# $Id: lonuserutils.pm,v 1.102 2009/10/31 14:27:48 raeburn Exp $ +# $Id: lonuserutils.pm,v 1.113 2010/01/19 18:02:20 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -91,7 +91,7 @@ sub modifyuserrole { if ($setting eq 'course' || $context eq 'course') { $scope = '/'.$cid; $scope =~ s/\_/\//g; - if ($role ne 'cc' && $sec ne '') { + if (($role ne 'cc') && ($role ne 'co') && ($sec ne '')) { $scope .='/'.$sec; } } elsif ($context eq 'domain') { @@ -295,7 +295,7 @@ sub hidden_input { } sub print_upload_manager_header { - my ($r,$datatoken,$distotal,$krbdefdom,$context,$permission)=@_; + my ($r,$datatoken,$distotal,$krbdefdom,$context,$permission,$crstype)=@_; my $javascript; # if (! exists($env{'form.upfile_associate'})) { @@ -332,7 +332,7 @@ sub print_upload_manager_header { my $javascript_validations = &javascript_validations('upload',$krbdefdom,$password_choice,undef, $env{'request.role.domain'},$context, - $groupslist); + $groupslist,$crstype); my $checked=(($env{'form.noFirstLine'})?' checked="checked"':''); $r->print('<p>' .&mt('Total number of records found in file: [_1]' @@ -365,7 +365,7 @@ sub print_upload_manager_header { ############################################################### sub javascript_validations { my ($mode,$krbdefdom,$curr_authtype,$curr_authfield,$domain, - $context,$groupslist)=@_; + $context,$groupslist,$crstype)=@_; my %param = ( kerb_def_dom => $krbdefdom, curr_authtype => $curr_authtype, @@ -386,10 +386,10 @@ sub javascript_validations { if (($context eq 'course') || ($context eq 'domain')) { if ($context eq 'course') { if ($env{'request.course.sec'} eq '') { - $setsection_call = 'setSections(document.'.$param{'formname'}.');'; + $setsection_call = 'setSections(document.'.$param{'formname'}.",'$crstype'".');'; $setsections_js = &setsections_javascript($param{'formname'},$groupslist, - $mode); + $mode,'',$crstype); } else { $setsection_call = "'ok'"; } @@ -830,7 +830,7 @@ sub print_upload_manager_footer { .' '.&mt('Add a domain role').'</label>' .' <label>' .'<input type="radio" name="roleaction" value="course" />' - .' '.&mt('Add a course role').'</label>' + .' '.&mt('Add a course/community role').'</label>' .'</span>'; } elsif ($context eq 'author') { $Str .= &Apache::lonhtmlcommon::row_title( @@ -899,7 +899,7 @@ sub print_upload_manager_footer { .'<hr />'; if ($context eq 'course') { $Str .= '<p class="LC_info">' - .&mt('Note: For large courses, this operation may be time consuming.') + .&mt('Note: This operation may be time consuming when adding several users.') .'</p>'; } $Str .= '<p><input type="button"' @@ -979,7 +979,7 @@ sub print_upload_manager_form { &Apache::loncommon::get_kerberos_defaults($defdom); # &print_upload_manager_header($r,$datatoken,$distotal,$krbdefdom,$context, - $permission); + $permission,$crstype); my $i; my $keyfields; if ($total>=0) { @@ -1176,7 +1176,7 @@ sub default_role_selector { my %customroles; my ($options,$coursepick,$cb_jscript); if ($context ne 'author') { - %customroles = &my_custom_roles(); + %customroles = &my_custom_roles($crstype); } my %lt=&Apache::lonlocal::texthash( @@ -1202,16 +1202,16 @@ sub default_role_selector { $options .= ' <option value="'.$role.'">'.$plrole.'</option>'; } my $courseform = &Apache::loncommon::selectcourse_link - ('studentform','dccourse','dcdomain','coursedesc',"$env{'request.role.domain'}",undef,'Course'); + ('studentform','dccourse','dcdomain','coursedesc',"$env{'request.role.domain'}",undef,'Course/Community'); $cb_jscript = - &Apache::loncommon::coursebrowser_javascript($env{'request.role.domain'},'currsec','studentform'); + &Apache::loncommon::coursebrowser_javascript($env{'request.role.domain'},'currsec','studentform','courserole','Course/Community'); $coursepick = &Apache::loncommon::start_data_table(). &Apache::loncommon::start_data_table_header_row(). '<th>'.$courseform.'</th><th>'.$lt{'rol'}.'</th>'. '<th>'.$lt{'grs'}.'</th>'. &Apache::loncommon::end_data_table_header_row(). &Apache::loncommon::start_data_table_row()."\n". - '<td><input type="text" name="coursedesc" value="" onfocus="this.blur();opencrsbrowser('."'studentform','dccourse','dcdomain','coursedesc',''".')" /></td>'."\n". + '<td><input type="text" name="coursedesc" value="" onfocus="this.blur();opencrsbrowser('."'studentform','dccourse','dcdomain','coursedesc','','','','crstype'".')" /></td>'."\n". '<td><select name="courserole">'."\n". &default_course_roles($context,$checkpriv,'Course',%customroles)."\n". '</select></td><td>'. @@ -1229,6 +1229,7 @@ sub default_role_selector { $env{'request.role.domain'}.'" />'. '<input type="hidden" name="dccourse" value="" />'. '<input type="hidden" name="dcdomain" value="" />'. + '<input type="hidden" name="crstype" value="" />'. '</td></tr></table></td>'. &Apache::loncommon::end_data_table_row(). &Apache::loncommon::end_data_table()."\n"; @@ -1349,10 +1350,14 @@ sub curr_role_permissions { # ======================================================= Existing Custom Roles sub my_custom_roles { + my ($crstype) = @_; my %returnhash=(); my %rolehash=&Apache::lonnet::dump('roles'); - foreach my $key (keys %rolehash) { + foreach my $key (keys(%rolehash)) { if ($key=~/^rolesdef\_(\w+)$/) { + if ($crstype eq 'Community') { + next if ($rolehash{$key} =~ /bre\&S/); + } $returnhash{$1}=$1; } } @@ -1441,12 +1446,17 @@ sub print_userlist { '<input type="hidden" name="phase" value="" /></form>'); return; } - if (!(($context eq 'domain') && ($env{'form.roletype'} eq 'course'))) { - $r->print(' '.&list_submit_button(&mt('Update Display')). - "\n</p>\n"); + if (!(($context eq 'domain') && + (($env{'form.roletype'} eq 'course') || ($env{'form.roletype'} eq 'community')))) { + $r->print( + "\n</p>\n" + .'<p>' + .&list_submit_button(&mt('Update Display')) + ."</p>\n" + ); } my ($indexhash,$keylist) = &make_keylist_array(); - my (%userlist,%userinfo); + my (%userlist,%userinfo,$clearcoursepick); if (($context eq 'domain') && ($env{'form.roletype'} eq 'course') || ($env{'form.roletype'} eq 'community')) { @@ -1471,9 +1481,15 @@ sub print_userlist { $courseform."\n". &Apache::lonhtmlcommon::row_closure(1). &Apache::lonhtmlcommon::end_pick_box().'</p>'. - '<p>'.&list_submit_button(&mt('Update Display')). + '<p><input type="hidden" name="origroletype" value="'.$env{'form.roletype'}.'" />'. + &list_submit_button(&mt('Update Display')). "\n".'</p><span class="LC_warning">'.$warning.'</span>'."\n"); - if ($env{'form.coursepick'}) { + $clearcoursepick = 0; + if (($env{'form.origroletype'} ne '') && + ($env{'form.origroletype'} ne $env{'form.roletype'})) { + $clearcoursepick = 1; + } + if (($env{'form.coursepick'}) && (!$clearcoursepick)) { $r->print('<hr />'.&mt('Searching').' ...<br /> <br />'); } } else { @@ -1548,7 +1564,7 @@ sub print_userlist { } } elsif (($env{'form.roletype'} eq 'course') || ($env{'form.roletype'} eq 'community')) { - if ($env{'form.coursepick'}) { + if (($env{'form.coursepick'}) && (!$clearcoursepick)) { my %courses = &process_coursepick(); my %allusers; my $hidepriv = 1; @@ -1676,7 +1692,7 @@ sub role_filter { $role_select .= '</select>'; $output = '<label><span class="LC_nobreak">' .&mt('Role: [_1]',$role_select) - .'</span></label>'; + .'</span></label> '; } return $output; } @@ -1705,7 +1721,7 @@ sub section_group_filter { $env{'form.'.$name{$item}} = 'all'; } if ($item eq 'sec') { - if ($env{'form.showrole'} eq 'cc') { + if (($env{'form.showrole'} eq 'cc') || ($env{'form.showrole'} eq 'co')) { $env{'form.'.$name{$item}} = 'none'; } my %sections_count = &Apache::loncommon::get_sections($cdom,$cnum); @@ -1716,7 +1732,7 @@ sub section_group_filter { } if (@options > 0) { my $currsel; - $markup = '<select name="'.$name{$item}.'" />'."\n"; + $markup = '<select name="'.$name{$item}.'">'."\n"; foreach my $option ('all','none',@options) { $currsel = ''; if ($env{'form.'.$name{$item}} eq $option) { @@ -1731,7 +1747,9 @@ sub section_group_filter { $markup .= '</option>'."\n"; } $markup .= '</select>'."\n"; - $output .= (' 'x3).'<label>'.$title{$item}.': '.$markup.'</label>'; + $output .= (' 'x3).'<span class="LC_nobreak">' + .'<label>'.$title{$item}.': '.$markup.'</label>' + .'</span> '; } } return $output; @@ -1951,13 +1969,17 @@ sub process_coursepick { my $coursefilter = $env{'form.coursepick'}; my $cdom = $env{'request.role.domain'}; my %courses; + my $crssrch = 'Course'; + if ($env{'form.roletype'} eq 'community') { + $crssrch = 'Community'; + } if ($coursefilter eq 'all') { %courses = &Apache::lonnet::courseiddump($cdom,'.','.','.','.','.', - undef,undef,'Course'); + undef,undef,$crssrch); } elsif ($coursefilter eq 'category') { my $instcode = &instcode_from_coursefilter(); %courses = &Apache::lonnet::courseiddump($cdom,'.','.',$instcode,'.','.', - undef,undef,'Course'); + undef,undef,$crssrch); } elsif ($coursefilter eq 'specific') { if ($env{'form.coursetotal'} > 1) { my @course_ids = split(/&&/,$env{'form.courselist'}); @@ -2142,7 +2164,7 @@ END } elsif ($context eq 'domain') { if ($setting eq 'community') { $crstype = 'Community'; - } elsif ($crstype eq 'course') { + } elsif ($setting eq 'course') { $crstype = 'Course'; } } @@ -2293,7 +2315,11 @@ END if ($mode eq 'html' || $mode eq 'view' || $mode eq 'autoenroll' || $mode eq 'pickauthor') { if ($mode ne 'autoenroll' && $mode ne 'pickauthor') { if ($permission->{'cusr'}) { - $actionselect = &select_actions($context,$setting,$statusmode,$formname); + unless (($context eq 'domain') && + (($setting eq 'course') || ($setting eq 'community'))) { + $actionselect = + &select_actions($context,$setting,$statusmode,$formname); + } } $r->print(<<END); <input type="hidden" name="srchby" value="uname" /> @@ -2377,7 +2403,7 @@ END if ($env{'form.userwin'}) { $checkwin = ' checked="checked"'; } - $output .= '</td><td valign="top"><span class="LC_nobreak"><input type="checkbox" name="userwin" value="1"'.$checkwin.' />'.$lt{'owin'}.'</span></td></tr></table></fieldset></div>'; + $output .= '</td><td valign="top" style="border-left: 1px solid;"><span class="LC_nobreak"><input type="checkbox" name="userwin" value="1"'.$checkwin.' />'.$lt{'owin'}.'</span></td></tr></table></fieldset></div>'; } $output .= "\n".'<div class="LC_clear_float_footer"> </div>'."\n". &Apache::loncommon::start_data_table(). @@ -2387,11 +2413,7 @@ END <th><a href=\"javascript:document.$formname.sortby.value='type';document.$formname.submit();\">$lt{'type'}</a></th> "; } else { - if ($mode eq 'pickauthor') { - $output .= "\n".'<th> </th>'."\n"; - } else { - $output .= "\n".'<th>'.&mt('Count').'</th>'."\n"; - } + $output .= "\n".'<th> </th>'."\n"; if ($actionselect) { $output .= '<th>'.&mt('Select').'</th>'."\n"; } @@ -2446,9 +2468,13 @@ END time.'_'.rand(1000000000).'.csv'; unless ($CSVfile = Apache::File->new('>/home/httpd'.$CSVfilename)) { $r->log_error("Couldn't open $CSVfilename for output $!"); - $r->print(&mt('Problems occurred in writing the CSV file. ' - .'This error has been logged. ' - .'Please alert your LON-CAPA administrator.')); + $r->print( + '<p class="LC_error">' + .&mt('Problems occurred in writing the CSV file.') + .' '.&mt('This error has been logged.') + .' '.&mt('Please alert your LON-CAPA administrator.') + .'</p>' + ); $CSVfile = undef; } # @@ -2917,7 +2943,7 @@ sub print_username_link { $output = $in->{'username'}; } else { $output = '<a href="javascript:username_display_launch('. - "'$in->{'username'}','$in->{'domain'}'".')" />'. + "'$in->{'username'}','$in->{'domain'}'".')">'. $in->{'username'}.'</a>'; } return $output; @@ -3090,7 +3116,7 @@ END } else { opener.document.$callingform.retainsec.value = formname.retainsec.value; } - setSections(formname); + setSections(formname,'$crstype'); if (seccheck == 'ok') { opener.document.$callingform.newsecs.value = formname.sections.value; } @@ -3150,7 +3176,7 @@ ENDJS fors => 'For student roles changing the section, will result in a section switch as students may only be in one section of a course at a time.', forn => 'For a role in a course that is not a student role, a user may have roles in more than one section of a course at a time.', reta => "Retain each user's current section affiliations?", - dnap => '(Does not apply to student roles).', + dnap => '(Does not apply to student roles).', ); my ($date_items,$headertext); if ($env{'form.bulkaction'} eq 'chgsec') { @@ -3172,6 +3198,11 @@ ENDJS if ($context eq 'course' && $env{'form.bulkaction'} eq 'chgsec') { my ($cnum,$cdom) = &get_course_identity(); my $crstype = &Apache::loncommon::course_type(); + if ($crstype eq 'Community') { + $lt{'fors'} = &mt('For member roles changing the section, will result in a section switch as members may only be in one section of a community at a time.'); + $lt{'forn'} = &mt('For a role in a community that is not a member role, a user may have roles in more than one section of a community at a time.'); + $lt{'dnap'} = &mt('(Does not apply to member roles).'); + } my $info; if ($env{'form.showrole'} eq 'st') { $output .= '<p>'.$lt{'fors'}.'</p>'; @@ -3288,7 +3319,7 @@ sub results_header_row { if ($viewablesec ne '') { if ($env{'form.showrole'} eq 'st') { $constraint = &mt('only users in section "[_1]"',$viewablesec); - } elsif ($env{'form.showrole'} ne 'cc') { + } elsif (($env{'form.showrole'} ne 'cc') && ($env{'form.showrole'} ne 'co')) { $constraint = &mt('only users affiliated with no section or section "[_1]"',$viewablesec); } if (($env{'form.grpfilter'} ne 'all') && ($env{'form.grpfilter'} ne '')) { @@ -3633,20 +3664,23 @@ sub print_first_users_upload_form { $str .= '<h2>'.&mt('Upload a file containing information about users').'</h2>'."\n"; # Excel and CSV Help - $str .= '<p>' + $str .= '<div class="LC_left_float">' .&Apache::loncommon::help_open_topic("Course_Create_Class_List", &mt("How do I create a users list from a spreadsheet")) - ."<br />\n" + .'</div><div class="LC_left_float">'."\n" .&Apache::loncommon::help_open_topic("Course_Convert_To_CSV", &mt("How do I create a CSV file from a spreadsheet")) - ."</p>\n"; - + .'</div><br clear="all" />'."\n"; $str .= &Apache::lonhtmlcommon::start_pick_box() - .&Apache::lonhtmlcommon::row_title(&mt('File')) - .'<p class="LC_info">'."\n" - .&mt('Please upload an UTF8 encoded file to ensure a correct character encoding in your classlist.')."\n" - .'</p>'."\n" - .&Apache::loncommon::upfile_select_html() + .&Apache::lonhtmlcommon::row_title(&mt('File')); + if (&Apache::lonlocal::current_language() ne 'en') { + if ($context eq 'course') { + $str .= '<p class="LC_info">'."\n" + .&mt('Please upload an UTF8 encoded file to ensure a correct character encoding in your classlist.')."\n" + .'</p>'."\n"; + } + } + $str .= &Apache::loncommon::upfile_select_html() .&Apache::lonhtmlcommon::row_closure() .&Apache::lonhtmlcommon::row_title( '<label for="noFirstLine">' @@ -3660,8 +3694,6 @@ sub print_first_users_upload_form { .'<input type="submit" name="fileupload" value="'.&mt('Next').'" />' .'</p>'; - $str .= &Apache::loncommon::end_page(); - $r->print($str); return; } @@ -3890,7 +3922,7 @@ sub upfile_drop_add { } } my (%curr_rules,%got_rules,%alerts); - my %customroles = &my_custom_roles(); + my %customroles = &my_custom_roles($crstype); my @permitted_roles = &roles_on_upload($context,$setting,$crstype,%customroles); # Get new users list @@ -4134,7 +4166,7 @@ sub upfile_drop_add { $role = 'cr_'.$env{'user.domain'}.'_'. $env{'user.name'}.'_'.$role; } - if ($role ne 'cc') { + if (($role ne 'cc') && ($role ne 'co')) { if (@secs > 1) { $multiple = 1; foreach my $sec (@secs) { @@ -4495,7 +4527,7 @@ sub update_user_list { } } elsif ($choice eq 'chgsec') { my (@newsecs,$revresult,$nochg,@retained); - if ($role ne 'cc') { + if (($role ne 'cc') && ($role ne 'co')) { @newsecs = split(/,/,$env{'form.newsecs'}); } # remove existing section if not to be retained. @@ -4750,7 +4782,7 @@ sub get_groupslist { } sub setsections_javascript { - my ($formname,$groupslist,$mode,$checkauth) = @_; + my ($formname,$groupslist,$mode,$checkauth,$crstype) = @_; my ($checkincluded,$finish,$rolecode,$setsection_js); if ($mode eq 'upload') { $checkincluded = 'formname.name == "'.$formname.'"'; @@ -4789,8 +4821,11 @@ sub setsections_javascript { } my %alerts = &Apache::lonlocal::texthash( secd => 'Section designations do not apply to Course Coordinator roles.', + sedn => 'Section designations do not apply to Coordinator roles.', accr => 'A course coordinator role will be added with access to all sections.', + acor => 'A coordinator role will be added with access to all sections', inea => 'In each course, each user may only have one student role at a time.', + inec => 'In each community, each user may only have on member role at a time.', youh => 'You had selected ', secs => 'sections.', plmo => 'Please modify your selections so they include no more than one section.', @@ -4798,11 +4833,13 @@ sub setsections_javascript { plch => 'Please choose a different section name.', mnot => 'may not be used as a section name, as it is the name of a course group.', secn => 'Section names and group names must be distinct. Please choose a different section name.', + nonw => 'Section names may only contain letters or numbers.', ); $setsection_js .= <<"ENDSECCODE"; -function setSections(formname) { +function setSections(formname,crstype) { var re1 = /^currsec_/; + var re2 =/\\W/; var groups = new Array($groupslist); for (var i=0;i<formname.elements.length;i++) { var str = formname.elements[i].name; @@ -4810,10 +4847,13 @@ function setSections(formname) { if (checkcurr != null) { if ($checkincluded) { $rolecode - if (role == 'cc') { - alert("$alerts{'secd'}\\n$alerts{'accr'}"); - } - else { + if (role == 'cc' || role == 'co') { + if (role == 'cc') { + alert("$alerts{'secd'}\\n$alerts{'accr'}"); + } else { + alert("$alerts{'sedn'}\\n$alerts{'acor'}"); + } + } else { var sections = ''; var numsec = 0; var sections; @@ -4843,13 +4883,30 @@ function setSections(formname) { } var newsecs = formname.elements[i+1].value; var numsplit; + var validsecs = new Array(); + var badsecs = new Array(); if (newsecs != null && newsecs != "") { numsplit = newsecs.split(/,/g); - numsec = numsec + numsplit.length; + for (var i=0; i<numsplit.length; i++) { + if (re2.test(numsplit[i]) == true) { + badsecs.push(numsplit[i]); + } else { + validsecs.push(numsplit[i]); + } + } + if (badsecs.length > 0) { + alert("$alerts{'nonw'}\\n$alerts{'plch'}"); + return; + } + numsec = numsec + validsecs.length; } if ((role == 'st') && (numsec > 1)) { - alert("$alerts{'inea'} $alerts{'youh'} "+numsec+" $alerts{'secs'}\\n$alerts{'plmo'}") + if (crstype == 'Community') { + alert("$alerts{'inea'} $alerts{'youh'} "+numsec+" $alerts{'secs'}\\n$alerts{'plmo'}"); + } else { + alert("$alerts{'inco'} $alerts{'youh'} "+numsec+" $alerts{'secs'}\\n$alerts{'plmo'}"); + } return; } else { @@ -5123,6 +5180,7 @@ sub dc_setcourse_js { my ($formname,$mode,$context) = @_; my ($dc_setcourse_code,$authen_check); my $cctext = &Apache::lonnet::plaintext('cc'); + my $cotext = &Apache::lonnet::plaintext('co'); my %alerts = §ioncheck_alerts(); my $role = 'role'; if ($mode eq 'upload') { @@ -5169,7 +5227,11 @@ function setCourse() { numsections = numsections + newsecs.length; } if ((userrole == 'st') && (numsections > 1)) { - alert("$alerts{'inea'}. $alerts{'youh'} "+numsections+" $alerts{'sect'}.\\n$alerts{'plsm'}.") + if (document.$formname.crstype.value == 'Community') { + alert("$alerts{'inco'}. $alerts{'youh'} "+numsections+" $alerts{'sect'}.\\n$alerts{'plsm'}.") + } else { + alert("$alerts{'inea'}. $alerts{'youh'} "+numsections+" $alerts{'sect'}.\\n$alerts{'plsm'}.") + } return; } for (var j=0; j<newsecs.length; j++) { @@ -5181,7 +5243,11 @@ function setCourse() { var groups = document.$formname.groups.value.split(/,/g); for (var k=0; k<groups.length; k++) { if (newsecs[j] == groups[k]) { - alert("'"+newsecs[j]+"' $alerts{'mayt'}.\\n$alerts{'secn'}. $alerts{'plsc'}."); + if (document.$formname.crstype.value == 'Community') { + alert("'"+newsecs[j]+"' $alerts{'mayc'}.\\n$alerts{'secn'}. $alerts{'plsc'}."); + } else { + alert("'"+newsecs[j]+"' $alerts{'mayt'}.\\n$alerts{'secn'}. $alerts{'plsc'}."); + } return; } } @@ -5191,13 +5257,21 @@ function setCourse() { alert("$alerts{'secd'} $cctext $alerts{'role'}.\\n$alerts{'accr'}."); section = ""; } + if ((userrole == 'co') && (numsections > 0)) { + alert("$alerts{'secd'} $cotext $alerts{'role'}.\\n$alerts{'accr'}."); + section = ""; + } SCRIPTTOP if ($mode ne 'upload') { $dc_setcourse_code .= (<<"ENDSCRIPT"); var coursename = "_$env{'request.role.domain'}"+"_"+course+"_"+userrole var numcourse = getIndex(document.$formname.dccourse); if (numcourse == "-1") { - alert("$alerts{'thwa'}"); + if (document.$formname.type == 'Community') { + alert("$alerts{'thwc'}"); + } else { + alert("$alerts{'thwa'}"); + } return; } else { @@ -5306,19 +5380,22 @@ ENDSCRIPT sub sectioncheck_alerts { my %alerts = &Apache::lonlocal::texthash( - curd => 'You must select a course in the current domain', + curd => 'You must select a course or community in the current domain', inea => 'In each course, each user may only have one student role at a time', + inco => 'In each community, each user may only have one member role at a time', youh => 'You had selected', sect => 'sections', plsm => 'Please modify your selections so they include no more than one section', mayn => 'may not be used as the name for a section, as it is a reserved word', plsc => 'Please choose a different section name', mayt => 'may not be used as the name for a section, as it is the name of a course group', + mayc => 'may not be used as the name for a section, as it is the name of a community group', secn => 'Section names and group names must be distinct', secd => 'Section designations do not apply to ', role => 'roles', accr => 'role will be added with access to all sections', - thwa => 'There was a problem with your course selection' + thwa => 'There was a problem with your course selection', + thwc => 'There was a problem with your community selection', ); return %alerts; }