--- loncom/interface/lonuserutils.pm 2012/08/21 15:43:27 1.141 +++ loncom/interface/lonuserutils.pm 2013/12/09 18:47:18 1.158 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Utility functions for managing LON-CAPA user accounts # -# $Id: lonuserutils.pm,v 1.141 2012/08/21 15:43:27 raeburn Exp $ +# $Id: lonuserutils.pm,v 1.158 2013/12/09 18:47:18 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -237,6 +237,8 @@ sub domain_roles_select { # Role types my @roletypes = ('domain','author','course','community'); my %lt = &role_type_names(); + my $onchangefirst = "updateCols('showrole')"; + my $onchangesecond = "updateCols('showrole')"; # # build up the menu information to be passed to # &Apache::loncommon::linked_select_forms @@ -283,7 +285,8 @@ sub domain_roles_select { my $result = &Apache::loncommon::linked_select_forms ('studentform',(' 'x3).&mt('Role: '),$env{'form.roletype'}, 'roletype','showrole',\%select_menus, - ['domain','author','course','community']); + ['domain','author','course','community'],$onchangefirst, + $onchangesecond); return $result; } @@ -335,13 +338,22 @@ sub print_upload_manager_header { $env{'request.role.domain'},$context, $groupslist,$crstype); my $checked=(($env{'form.noFirstLine'})?' checked="checked"':''); - $r->print('<p>' - .&mt('Total number of records found in file: [_1]' - ,'<b>'.$distotal.'</b>') - ."</p>\n"); - $r->print('<div class="LC_left_float"><h3>'. - &mt('Identify fields in uploaded list')."</h3>\n"); - $r->print(&mt('Enter as many fields as you can.<br /> The system will inform you and bring you back to this page, <br /> if the data selected are insufficient to add users.')."<br />\n"); + $r->print( + '<h3>'.&mt('Identify fields in uploaded list')."</h3>\n". + '<p class="LC_info">'. + &mt('Total number of records found in file: [_1]' + ,'<b>'.$distotal.'</b>'). + "</p>\n" + ); + if ($distotal == 0) { + $r->print('<p class="LC_warning">'.&mt('None found').'</p>'); + } + $r->print( + '<p>'. + &mt('Enter as many fields as you can.').'<br />'. + &mt('The system will inform you and bring you back to this page,[_1]if the data selected are insufficient to add users.','<br />'). + "</p>\n" + ); $r->print(&hidden_input('action','upload'). &hidden_input('state','got_file'). &hidden_input('associate',''). @@ -349,17 +361,23 @@ sub print_upload_manager_header { &hidden_input('fileupload',$env{'form.fileupload'}). &hidden_input('upfiletype',$env{'form.upfiletype'}). &hidden_input('upfile_associate',$env{'form.upfile_associate'})); - $r->print('<br /><label><input type="checkbox" name="noFirstLine"'.$checked.' />'. - &mt('Ignore First Line').'</label><br />'); - $r->print('<br /><input type="button" value="'.&mt('Reverse Association').'" '. + $r->print( + '<div class="LC_left_float">'. + '<fieldset><legend>'.&mt('Functions').'</legend>'. + '<label><input type="checkbox" name="noFirstLine"'.$checked.' />'. + &mt('Ignore First Line').'</label>'. + ' <input type="button" value="'.&mt('Reverse Association').'" '. 'name="Reverse Association" '. - 'onclick="javascript:this.form.associate.value=\'Reverse Association\';submit(this.form);" />'); - $r->print("<br /><br />\n". - '<script type="text/javascript" language="Javascript">'."\n". - '// <![CDATA['."\n". - $javascript."\n".$javascript_validations."\n". - '// ]]>'."\n". - '</script>'); + 'onclick="javascript:this.form.associate.value=\'Reverse Association\';submit(this.form);" />'. + '</fieldset></div><br clear="all" />' + ); + $r->print( + '<script type="text/javascript" language="Javascript">'."\n". + '// <![CDATA['."\n". + $javascript."\n".$javascript_validations."\n". + '// ]]>'."\n". + '</script>' + ); } ############################################################### @@ -381,6 +399,12 @@ sub javascript_validations { $param{'curr_autharg'} = $curr_authfield; } + my $showcredits; + my %domdefaults = &Apache::lonnet::get_domain_defaults($domain); + if ($domdefaults{'officialcredits'} || $domdefaults{'unofficialcredits'}) { + $showcredits = 1; + } + my ($setsection_call,$setsections_js); my $finish = " vf.submit();\n"; if ($mode eq 'upload') { @@ -390,13 +414,14 @@ sub javascript_validations { $setsection_call = 'setSections(document.'.$param{'formname'}.",'$crstype'".');'; $setsections_js = &setsections_javascript($param{'formname'},$groupslist, - $mode,'',$crstype); + $mode,'',$crstype,$showcredits); } else { $setsection_call = "'ok'"; } } elsif ($context eq 'domain') { $setsection_call = 'setCourse()'; - $setsections_js = &dc_setcourse_js($param{'formname'},$mode,$context); + $setsections_js = &dc_setcourse_js($param{'formname'},$mode, + $context,$showcredits); } $finish = " var checkSec = $setsection_call\n". " if (checkSec == 'ok') {\n". @@ -419,13 +444,16 @@ sub javascript_validations { domain => 'The optional domain field was not specified.', continue => 'Continue adding users?', ); + if ($showcredits) { + $alert{'credits'} = &mt('The optional credits field was not specified'); + } if (($mode eq 'upload') && ($context eq 'domain')) { $alert{'inststatus'} = &mt('The optional affiliation field was not specified'); } my $function_name = <<"END"; $setsections_js -function verify_message (vf,founduname,foundpwd,foundname,foundid,foundsec,foundemail,foundrole,founddomain,foundinststatus) { +function verify_message (vf,founduname,foundpwd,foundname,foundid,foundsec,foundemail,foundrole,founddomain,foundinststatus,foundcredits) { END my ($authnum,%can_assign) = &Apache::loncommon::get_assignable_auth($domain); my $auth_checks; @@ -482,6 +510,7 @@ END return; } } +/* regexp here to check for non \d \. in credits */ END } else { $auth_checks .= (<<END); @@ -554,6 +583,16 @@ END message+='$alert{'domain'}'; } END + if ($showcredits) { + $optional_checks .= <<END; + if (foundcredits==0) { + if (message!='') { + message+='\\n'; + } + message+='$alert{'credits'}'; + } +END + } if (($mode eq 'upload') && ($context eq 'domain')) { $optional_checks .= (<<END); @@ -603,7 +642,7 @@ sub upload_manager_javascript_forward_as $numbuttons ++; } if (!$can_assign->{'int'}) { - my $warning = &mt('You may not specify an initial password for each user, as this is only available when new users use LON-CAPA internal authentication.\n'). + my $warning = &mt('You may not specify an initial password for each user, as this is only available when new users use LON-CAPA internal authentication.').'\n'. &mt('Your current role does not have rights to create users with that authentication type.'); $auth_update = <<"END"; // Currently the initial password field is only supported for internal auth @@ -638,6 +677,7 @@ function verify(vf,sec_caller) { var foundrole=0; var founddomain=0; var foundinststatus=0; + var foundcredits=0; var tw; for (i=0;i<=vf.nfields.value;i++) { tw=eval('vf.f'+i+'.selectedIndex'); @@ -650,8 +690,9 @@ function verify(vf,sec_caller) { if (tw==11) { foundrole=1; } if (tw==12) { founddomain=1; } if (tw==13) { foundinststatus=1; } + if (tw==14) { foundcredits=1; } } - verify_message(vf,founduname,foundpwd,foundname,foundid,foundsec,foundemail,foundrole,founddomain,foundinststatus); + verify_message(vf,founduname,foundpwd,foundname,foundid,foundsec,foundemail,foundrole,founddomain,foundinststatus,foundcredits); } // @@ -674,6 +715,7 @@ function verify(vf,sec_caller) { // 11 = role // 12 = domain // 13 = inststatus +// 14 = foundcredits function flip(vf,tf) { var nw=eval('vf.f'+tf+'.selectedIndex'); @@ -771,6 +813,7 @@ function verify(vf,sec_caller) { var foundrole=0; var founddomain=0; var foundinststatus=0; + var foundcredits=0; var tw; for (i=0;i<=vf.nfields.value;i++) { tw=eval('vf.f'+i+'.selectedIndex'); @@ -783,8 +826,9 @@ function verify(vf,sec_caller) { if (i==10 && tw!=0) { foundrole=1; } if (i==11 && tw!=0) { founddomain=1; } if (i==12 && tw!=0) { foundinstatus=1; } + if (i==13 && tw!=0) { foundcredits=1; } } - verify_message(vf,founduname,foundpwd,foundname,foundid,foundsec,foundemail,foundrole,founddomain,foundinststatus); + verify_message(vf,founduname,foundpwd,foundname,foundid,foundsec,foundemail,foundrole,founddomain,foundinststatus,foundcredits); } function flip(vf,tf) { @@ -816,7 +860,8 @@ ENDPICK ############################################################### ############################################################### sub print_upload_manager_footer { - my ($r,$i,$keyfields,$defdom,$today,$halfyear,$context,$permission,$crstype) = @_; + my ($r,$i,$keyfields,$defdom,$today,$halfyear,$context,$permission,$crstype, + $showcredits) = @_; my $form = 'document.studentform'; my $formname = 'studentform'; my ($krbdef,$krbdefdom) = @@ -905,9 +950,15 @@ sub print_upload_manager_footer { &mt('Default role')) .&mt('Choose the role to assign to users without a value specified in the uploaded file.') } elsif ($context eq 'course') { - $Str .= &Apache::lonhtmlcommon::row_title( + if ($showcredits) { + $Str .= &Apache::lonhtmlcommon::row_title( + &mt('Default role, section and credits')) + .&mt('Choose the role and/or section(s) and/or credits to assign to users without values specified in the uploaded file.'); + } else { + $Str .= &Apache::lonhtmlcommon::row_title( &mt('Default role and section')) - .&mt('Choose the role and/or section(s) to assign to users without values specified in the uploaded file.'); + .&mt('Choose the role and/or section(s) to assign to users without values specified in the uploaded file.'); + } } else { $Str .= &Apache::lonhtmlcommon::row_title( &mt('Default role and/or section(s)')) @@ -915,7 +966,8 @@ sub print_upload_manager_footer { } if (($context eq 'domain') || ($context eq 'author')) { $Str .= '<br />'; - my ($options,$cb_script,$coursepick) = &default_role_selector($context,1); + my ($options,$cb_script,$coursepick) = + &default_role_selector($context,1,'',$showcredits); if ($context eq 'domain') { $Str .= '<p>' .'<b>'.&mt('Domain Level').'</b><br />' @@ -932,8 +984,13 @@ sub print_upload_manager_footer { } else { my ($cnum,$cdom) = &get_course_identity(); my $rowtitle = &mt('section'); - my $secbox = §ion_picker($cdom,$cnum,'Any',$rowtitle, - $permission,$context,'upload',$crstype); + my $defaultcredits; + if ($showcredits) { + $defaultcredits = &get_defaultcredits(); + } + my $secbox = §ion_picker($cdom,$cnum,'Any',$rowtitle,$permission, + $context,'upload',$crstype,$showcredits, + $defaultcredits); $Str .= $secbox .&Apache::lonhtmlcommon::row_closure(); my %lt; @@ -979,6 +1036,43 @@ sub print_upload_manager_footer { return; } +sub get_defaultcredits { + my ($cdom,$cnum) = @_; + + if ($cdom eq '' || $cnum eq '') { + return unless ($env{'request.course.id'}); + $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; + $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; + } + return unless(($cdom =~ /^$match_domain$/) && ($cnum =~ /^$match_courseid$/)); + my ($defaultcredits,$domdefcredits); + my %domdefaults = &Apache::lonnet::get_domain_defaults($cdom); + if ($domdefaults{'officialcredits'} || $domdefaults{'unofficialcredits'}) { + my $instcode = $env{'course.'.$cdom.'_'.$cnum.'.internal.coursecode'}; + if ($instcode) { + $domdefcredits = $domdefaults{'officialcredits'}; + } else { + $domdefcredits = $domdefaults{'unofficialcredits'}; + } + } else { + return; + } + + if ($env{'request.course.id'} eq $cdom.'_'.$cnum) { + $defaultcredits = $env{'course.'.$cdom.'_'.$cnum.'.internal.defaultcredits'}; + } elsif (exists($env{'course.'.$cdom.'_'.$cnum.'.internal.defaultcredits'})) { + $defaultcredits = $env{'course.'.$cdom.'_'.$cnum.'.internal.defaultcredits'}; + } else { + my %crsinfo = + &Apache::lonnet::coursedescription("$cdom/$cnum",{'one_time' => 1}); + $defaultcredits = $crsinfo{'internal.defaultcredits'}; + } + if ($defaultcredits eq '') { + $defaultcredits = $domdefcredits; + } + return $defaultcredits; +} + sub forceid_change { my ($context) = @_; my $output = @@ -1000,7 +1094,7 @@ sub forceid_change { ############################################################### ############################################################### sub print_upload_manager_form { - my ($r,$context,$permission,$crstype) = @_; + my ($r,$context,$permission,$crstype,$showcredits) = @_; my $firstLine; my $datatoken; if (!$env{'form.datatoken'}) { @@ -1033,7 +1127,9 @@ sub print_upload_manager_form { 'domain_choice' => 'scalar', 'inststatus_choice' => 'scalar', }; - my $defdom = $env{'request.role.domain'}; + if ($showcredits) { + $col_setting_names->{'credits_choice'} = 'scalar'; + } if ($context eq 'course') { &Apache::loncommon::restore_course_settings('enrollment_upload', $col_setting_names); @@ -1041,6 +1137,7 @@ sub print_upload_manager_form { &Apache::loncommon::restore_settings($context,'user_upload', $col_setting_names); } + my $defdom = $env{'request.role.domain'}; # # Determine kerberos parameters as appropriate my ($krbdef,$krbdefdom) = @@ -1066,6 +1163,10 @@ sub print_upload_manager_form { ['role',&mt('Role'), $env{'form.role_choice'}], ['domain',&mt('Domain'), $env{'form.domain_choice'}], ['inststatus',&mt('Affiliation'), $env{'form.inststatus_choice'}]); + if ($showcredits) { + push(@field, + ['credits',&mt('Student Credits'), $env{'form.credits_choice'}]); + } if ($env{'form.upfile_associate'} eq 'reverse') { &Apache::loncommon::csv_print_samples($r,\@records); $i=&Apache::loncommon::csv_print_select_table($r,\@records, @@ -1082,9 +1183,8 @@ sub print_upload_manager_form { $keyfields=join(',',sort(keys(%sone))); } } - $r->print('</div>'); &print_upload_manager_footer($r,$i,$keyfields,$defdom,$today,$halfyear, - $context,$permission,$crstype); + $context,$permission,$crstype,$showcredits); } sub setup_date_selectors { @@ -1241,7 +1341,7 @@ sub make_dates_default { } sub default_role_selector { - my ($context,$checkpriv,$crstype) = @_; + my ($context,$checkpriv,$crstype,$showcredits) = @_; my %customroles; my ($options,$coursepick,$cb_jscript); if ($context ne 'author') { @@ -1253,6 +1353,7 @@ sub default_role_selector { 'grs' => "Section", 'exs' => "Existing sections", 'new' => "New section", + 'crd' => "Credits", ); $options = '<select name="defaultrole">'."\n". ' <option value="">'.&mt('Please select').'</option>'."\n"; @@ -1272,12 +1373,18 @@ sub default_role_selector { } my $courseform = &Apache::loncommon::selectcourse_link ('studentform','dccourse','dcdomain','coursedesc',"$env{'request.role.domain'}",undef,'Course/Community'); + my ($credit_elem,$creditsinput); + if ($showcredits) { + $credit_elem = 'credits'; + $creditsinput = '<td><input type="text" name="credits" value="" /></td>'; + } $cb_jscript = - &Apache::loncommon::coursebrowser_javascript($env{'request.role.domain'},'currsec','studentform','courserole','Course/Community'); + &Apache::loncommon::coursebrowser_javascript($env{'request.role.domain'},'currsec','studentform','courserole','Course/Community',$credit_elem); $coursepick = &Apache::loncommon::start_data_table(). &Apache::loncommon::start_data_table_header_row(). '<th>'.$courseform.'</th><th>'.$lt{'rol'}.'</th>'. '<th>'.$lt{'grs'}.'</th>'. + '<th>'.$lt{'crd'}.'</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','','','','crstype'".')" /></td>'."\n". @@ -1299,7 +1406,7 @@ sub default_role_selector { '<input type="hidden" name="dccourse" value="" />'. '<input type="hidden" name="dcdomain" value="" />'. '<input type="hidden" name="crstype" value="" />'. - '</td></tr></table></td>'. + '</td></tr></table></td>'.$creditsinput. &Apache::loncommon::end_data_table_row(). &Apache::loncommon::end_data_table()."\n"; } @@ -1436,7 +1543,7 @@ sub my_custom_roles { sub print_userlist { my ($r,$mode,$permission,$context,$formname,$totcodes,$codetitles, - $idlist,$idlist_titles) = @_; + $idlist,$idlist_titles,$showcredits) = @_; my $format = $env{'form.output'}; if (! exists($env{'form.sortby'})) { $env{'form.sortby'} = 'username'; @@ -1471,10 +1578,6 @@ sub print_userlist { @statuses = ('future'); } -# if ($context eq 'course') { -# $r->print(&display_adv_courseroles()); -# } - # # Interface output $r->print('<form name="studentform" method="post" action="/adm/createuser">'."\n". '<input type="hidden" name="action" value="'. @@ -1512,21 +1615,23 @@ sub print_userlist { $r->print(§ion_group_filter($cnum,$cdom)); } $r->print('</div><div class="LC_left_float">'. - &column_checkboxes($context,$mode,$formname). - '</div><br clear="all" />'); + &column_checkboxes($context,$mode,$formname,$showcredits). + '</div>'); if ($env{'form.phase'} eq '') { - $r->print(&list_submit_button(&mt('Display List of Users'))."\n". + $r->print('<br clear="all" />'. + &list_submit_button(&mt('Display List of Users'))."\n". '<input type="hidden" name="phase" value="" /></form>'); return; } if (!(($context eq 'domain') && (($env{'form.roletype'} eq 'course') || ($env{'form.roletype'} eq 'community')))) { - $r->print(&list_submit_button(&mt('Update Display'))."\n"); + $r->print('<br clear="all" />'. + &list_submit_button(&mt('Update Display'))."\n"); } - my @cols = &infocolumns($context,$mode); + my @cols = &infocolumns($context,$mode,$showcredits); if (!@cols) { - $r->print('<hr /><span class="LC_warning">'. + $r->print('<hr style="clear:both;" /><span class="LC_warning">'. &mt('No user information selected for display.').'</span>'. '<input type="hidden" name="phase" value="display" /></form>'."\n"); return; @@ -1553,12 +1658,10 @@ sub print_userlist { &Apache::lonhtmlcommon::course_selection($formname,$numcodes, $codetitles,$idlist,$idlist_titles,$crstype, \@standardnames); - $r->print('<p>'.&Apache::lonhtmlcommon::start_pick_box()."\n". - &Apache::lonhtmlcommon::start_pick_box()."\n". - &Apache::lonhtmlcommon::row_title($title,'LC_oddrow_value')."\n". + $r->print('<div class="LC_left_float">'. + '<fieldset><legend>'.$title.'</legend>'."\n". $courseform."\n". - &Apache::lonhtmlcommon::row_closure(1). - &Apache::lonhtmlcommon::end_pick_box().'</p>'. + '</fieldset></div><br clear="all" />'. '<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"); @@ -1568,10 +1671,10 @@ sub print_userlist { $clearcoursepick = 1; } if (($env{'form.coursepick'}) && (!$clearcoursepick)) { - $r->print('<hr />'.&mt('Searching').' ...<br /> <br />'); + $r->print('<hr />'.&mt('Searching ...').'<br /> <br />'); } } else { - $r->print('<hr /><div id="searching">'.&mt('Searching').' ...</div>'); + $r->print('<hr style="clear:both;" /><div id="searching">'.&mt('Searching ...').'</div>'); } $r->rflush(); if ($context eq 'course') { @@ -1691,33 +1794,37 @@ sub print_userlist { } } if (keys(%userlist) == 0) { + my $msg = ''; if ($context eq 'author') { - $r->print(&mt('There are no co-authors to display.')."\n"); + $msg = &mt('There are no co-authors to display.'); } elsif ($context eq 'domain') { if ($env{'form.roletype'} eq 'domain') { - $r->print(&mt('There are no users with domain roles to display.')."\n"); + $msg = &mt('There are no users with domain roles to display.'); } elsif ($env{'form.roletype'} eq 'author') { - $r->print(&mt('There are no authors or co-authors to display.')."\n"); + $msg = &mt('There are no authors or co-authors to display.'); } elsif ($env{'form.roletype'} eq 'course') { - $r->print(&mt('There are no course users to display')."\n"); + $msg = &mt('There are no course users to display'); } elsif ($env{'form.roletype'} eq 'community') { - $r->print(&mt('There are no community users to display')."\n"); + $msg = &mt('There are no community users to display'); } } elsif ($context eq 'course') { $r->print(&mt('There are no course users to display.')."\n"); } + $r->print('<p class="LC_info">'.$msg.'</p>'."\n") if $msg; } else { # Print out the available choices my $usercount; if ($env{'form.action'} eq 'modifystudent') { ($usercount) = &show_users_list($r,$context,'view',$permission, - $env{'form.Status'},\%userlist,$keylist); + $env{'form.Status'},\%userlist,$keylist,'', + $showcredits); } else { ($usercount) = &show_users_list($r,$context,$env{'form.output'}, - $permission,$env{'form.Status'},\%userlist,$keylist); + $permission,$env{'form.Status'},\%userlist, + $keylist,'',$showcredits); } if (!$usercount) { - $r->print('<br /><span class="LC_warning">' + $r->print('<br /><span class="LC_info">' .&mt('There are no users matching the search criteria.') .'</span>' ); @@ -1835,12 +1942,12 @@ sub section_group_filter { } sub infocolumns { - my ($context,$mode) = @_; + my ($context,$mode,$showcredits) = @_; my @cols; if (($mode eq 'pickauthor') || ($mode eq 'autoenroll')) { - @cols = &get_cols_array($context,$mode); + @cols = &get_cols_array($context,$mode,$showcredits); } else { - my @posscols = &get_cols_array($context,$mode); + my @posscols = &get_cols_array($context,$mode,$showcredits); if ($env{'form.phase'} ne '') { my @checkedcols = &Apache::loncommon::get_env_multiple('form.showcol'); foreach my $col (@checkedcols) { @@ -1856,7 +1963,7 @@ sub infocolumns { } sub get_cols_array { - my ($context,$mode) = @_; + my ($context,$mode,$showcredits) = @_; my @cols; if ($mode eq 'pickauthor') { @cols = ('username','fullname','status','email'); @@ -1866,9 +1973,6 @@ sub get_cols_array { push(@cols,'section'); } push(@cols,('start','end','role')); - if ($context eq 'domain') { - push (@cols,'extent'); - } unless (($mode eq 'autoenroll') && ($env{'form.Status'} ne 'Any')) { push(@cols,'status'); } @@ -1877,19 +1981,25 @@ sub get_cols_array { } push(@cols,'email'); if (($context eq 'course') && ($mode ne 'autoenroll')) { + if ($showcredits) { + push(@cols,'credits'); + } push(@cols,'lastlogin','clicker'); } if (($context eq 'course') && ($mode ne 'autoenroll') && ($env{'course.'.$env{'request.course.id'}.'.internal.showphoto'})) { - push(@cols,'photos'); + push(@cols,'photo'); + } + if ($context eq 'domain') { + push (@cols,'extent'); } } return @cols; } sub column_checkboxes { - my ($context,$mode,$formname) = @_; - my @cols = &get_cols_array($context,$mode); + my ($context,$mode,$formname,$showcredits) = @_; + my @cols = &get_cols_array($context,$mode,$showcredits); my @showncols = &Apache::loncommon::get_env_multiple('form.showcol'); my (%disabledchk,%unchecked); if ($env{'form.phase'} eq '') { @@ -1897,20 +2007,33 @@ sub column_checkboxes { if ($context eq 'course') { $disabledchk{'role'} = 1; $unchecked{'photo'} = 1; + $unchecked{'clicker'} = 1; + if ($showcredits) { + $unchecked{'credits'} = 1; + } + } elsif ($context eq 'domain') { + $unchecked{'extent'} = 1; } - $unchecked{'clicker'} = 1; $unchecked{'start'} = 1; $unchecked{'end'} = 1; } else { if ($env{'form.Status'} ne 'Any') { $disabledchk{'status'} = 1; } - if ($env{'form.showrole'} ne 'Any') { - $disabledchk{'role'} = 1; + if (($env{'form.showrole'} ne 'Any') && ($env{'form.showrole'} ne 'cr')) { + $disabledchk{'role'} = 1; + } + if ($context eq 'domain') { + if (($env{'form.roletype'} eq 'course') || + ($env{'form.roletype'} eq 'community')) { + $disabledchk{'status'} = 1; + } elsif ($env{'form.roletype'} eq 'domain') { + $disabledchk{'extent'} = 1; + } } } my $numposs = scalar(@cols); - my $numinrow = 8; + my $numinrow = 7; my %lt = &get_column_names($context); my $output = '<fieldset><legend>'.&mt('Information to show').'</legend>'."\n".'<span class="LC_nobreak">'. '<input type="button" onclick="javascript:checkAll(document.'.$formname.'.showcol);" value="'.&mt('check all').'" />'. @@ -1950,9 +2073,16 @@ sub column_checkboxes { } else { $output .= '<td>'; } - $output .= '<label><input id="showcol'.$cols[$i].'" type="checkbox" name="showcol" value="'.$cols[$i].'"'.$checked.' />'. - $lt{$cols[$i]}.'</label></td>'; - + my $style; + if ($cols[$i] eq 'extent') { + if (($env{'form.roletype'} eq 'domain') || ($env{'form.roletype'} eq '')) { + $style = ' style="display: none;"'; + } + } + $output .= '<span id="show'.$cols[$i].'"'.$style.'><label>'. + '<input id="showcol'.$cols[$i].'" type="checkbox" name="showcol" value="'.$cols[$i].'"'.$checked.' /><span id="showcoltext'.$cols[$i].'">'. + $lt{$cols[$i]}.'</span>'. + '</label></span></td>'; } $output .= '</tr></table></fieldset>'; return $output; @@ -1976,6 +2106,7 @@ sub get_column_names { 'end' => "end date", 'status' => "status", 'role' => "role", + 'credits' => "credits", 'type' => "enroll type/action", 'email' => "e-mail address", 'photo' => "photo", @@ -1986,11 +2117,12 @@ sub get_column_names { 'clicker' => "clicker-ID", ); if ($context eq 'domain' && $env{'form.roletype'} eq 'course') { - $lt{'extent'} = &mt('Course(s): description, section(s), status'); + $lt{'extent'} = &mt('course(s): description, section(s), status'); } elsif ($context eq 'domain' && $env{'form.roletype'} eq 'community') { - $lt{'extent'} = &mt('Communities: description, section(s), status'); - } elsif ($context eq 'author') { - $lt{'extent'} = &mt('Author'); + $lt{'extent'} = &mt('community(s): description, section(s), status'); + } elsif (($context eq 'author') || + ($context eq 'domain' && $env{'form.roletype'} eq 'author')) { + $lt{'extent'} = &mt('author'); } return %lt; } @@ -2244,29 +2376,6 @@ sub instcode_from_coursefilter { return $instcode; } -sub display_adv_courseroles { - my $output; - # - # List course personnel - my %coursepersonnel = - &Apache::lonnet::get_course_adv_roles($env{'request.course.id'}); - # - $output = '<br />'.&Apache::loncommon::start_data_table(); - foreach my $role (sort(keys(%coursepersonnel))) { - next if ($role =~ /^\s*$/); - $output .= &Apache::loncommon::start_data_table_row(). - '<td>'.$role.'</td><td>'; - foreach my $user (split(',',$coursepersonnel{$role})) { - my ($puname,$pudom)=split(':',$user); - $output .= ' '.&Apache::loncommon::aboutmewrapper( - &Apache::loncommon::plainname($puname,$pudom), - $puname,$pudom); - } - $output .= '</td>'.&Apache::loncommon::end_data_table_row(); - } - $output .= &Apache::loncommon::end_data_table(); -} - sub make_keylist_array { my ($index,$keylist); $index->{'domain'} = &Apache::loncoursedata::CL_SDOM(); @@ -2285,6 +2394,7 @@ sub make_keylist_array { $index->{'extent'} = &Apache::loncoursedata::CL_EXTENT(); $index->{'photo'} = &Apache::loncoursedata::CL_PHOTO(); $index->{'thumbnail'} = &Apache::loncoursedata::CL_THUMBNAIL(); + $index->{'credits'} = &Apache::loncoursedata::CL_CREDITS(); foreach my $key (keys(%{$index})) { $keylist->[$index->{$key}] = $key; } @@ -2333,7 +2443,8 @@ sub process_date_info { } sub show_users_list { - my ($r,$context,$mode,$permission,$statusmode,$userlist,$keylist,$formname)=@_; + my ($r,$context,$mode,$permission,$statusmode,$userlist,$keylist,$formname, + $showcredits)=@_; if ($formname eq '') { $formname = 'studentform'; } @@ -2348,21 +2459,27 @@ sub show_users_list { my @sortable = ('username','domain','id','fullname','start','end','email','role'); if ($context eq 'course') { push(@sortable,('section','groups','type')); + if ($showcredits) { + push(@sortable,'credits'); + } } else { push(@sortable,'extent'); } if ($mode eq 'pickauthor') { @sortable = ('username','fullname','email','status'); } - if (!grep(/^\Q$sortby\E$/,@sortable)) { + my %is_sortable; + map { $is_sortable{$_} = 1; } @sortable; + unless ($is_sortable{$sortby}) { $sortby = 'username'; } my $setting = $env{'form.roletype'}; - my ($cid,$cdom,$cnum,$classgroups,$crstype); + my ($cid,$cdom,$cnum,$classgroups,$crstype,$defaultcredits); if ($context eq 'course') { $cid = $env{'request.course.id'}; $crstype = &Apache::loncommon::course_type(); ($cnum,$cdom) = &get_course_identity($cid); + $defaultcredits = $env{'course.'.$cid.'.internal.defaultcredits'}; ($classgroups) = &Apache::loncoursedata::get_group_memberships( $userlist,$keylist,$cdom,$cnum); if ($mode eq 'autoenroll') { @@ -2455,7 +2572,7 @@ END $r->print(<<END); <input type="hidden" name="sortby" value="$sortby" /> END - my @cols = &infocolumns($context,$mode); + my @cols = &infocolumns($context,$mode,$showcredits); my %coltxt = &get_column_names($context); my %acttxt = &Apache::lonlocal::texthash( 'pr' => "Proceed", @@ -2577,7 +2694,11 @@ END if ($env{'form.userwin'}) { $checkwin = ' checked="checked"'; } - $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 .= + '</td><td valign="top" style="border-left: 1px solid;">' + .'<span class="LC_nobreak"><label>' + .'<input type="checkbox" name="userwin" value="1"'.$checkwin.' />'.$lt{'owin'} + .'</label></span></td></tr></table></fieldset></div>'; } $output .= "\n".'<br clear="all" />'."\n". &Apache::loncommon::start_data_table(). @@ -2593,7 +2714,13 @@ END } } foreach my $item (@cols) { - $output .= "<th><a href=\"javascript:document.$formname.sortby.value='$item';document.$formname.submit();\">$lt{$item}</a></th>\n"; + $output .= "<th>"; + if ($is_sortable{$item}) { + $output .= "<a href=\"javascript:document.$formname.sortby.value='$item';document.$formname.submit();\">$lt{$item}</a>"; + } else { + $output .= $lt{$item}; + } + $output .= "</th>\n"; } my %role_types = &role_type_names(); $output .= &Apache::loncommon::end_data_table_header_row(); @@ -2753,6 +2880,11 @@ END 'gif','thumbnail'); } } + if (($role eq 'st') && ($defaultcredits)) { + if ($userlist->{$user}->[$index{'credits'}] eq '') { + $userlist->{$user}->[$index{'credits'}] = $defaultcredits; + } + } } } my %emails = &Apache::loncommon::getemails($uname,$udom); @@ -2870,7 +3002,8 @@ END $checkval .= ':'.$in{'section'}; if ($role eq 'st') { $checkval .= ':'.$in{'type'}.':'. - $in{'lockedtype'}; + $in{'lockedtype'}.':'. + $in{'credits'}; } } } @@ -2917,7 +3050,7 @@ END } else { $r->print('<td> </td>'."\n"); } - } + } } else { $r->print('<td>'.$in{$item}.'</td>'."\n"); } @@ -3118,6 +3251,7 @@ sub select_actions { chgdates => "Change starting/ending dates", chgsec => "Change section associated with user roles", ); + # FIXME Add an option to change credits for student roles. my ($output,$options,%choices); # FIXME Disable actions for now for roletype=course in domain context if ($context eq 'domain' && $setting eq 'course') { @@ -3245,11 +3379,13 @@ ENDTWO } sub date_section_selector { - my ($context,$permission,$crstype) = @_; + my ($context,$permission,$crstype,$showcredits) = @_; my $callingform = $env{'form.callingform'}; my $formname = 'dateselect'; my $groupslist = &get_groupslist(); - my $sec_js = &setsections_javascript($formname,$groupslist); + my $sec_js = + &setsections_javascript($formname,$groupslist,undef,undef,$crstype, + $showcredits); my $output = <<"END"; <script type="text/javascript"> // <![CDATA[ @@ -3381,7 +3517,8 @@ ENDJS $info = '<input type="hidden" name="retainsec" value="0" />'; } my $rowtitle = &mt('New section to assign'); - my $secbox = §ion_picker($cdom,$cnum,$env{'form.showrole'},$rowtitle,$permission,$context,'',$crstype); + my $secbox = §ion_picker($cdom,$cnum,$env{'form.showrole'},$rowtitle, + $permission,$context,'chgsec',$crstype); $output .= $info.$secbox; } $output .= '<p>'. @@ -3391,13 +3528,14 @@ ENDJS } sub section_picker { - my ($cdom,$cnum,$role,$rowtitle,$permission,$context,$mode,$crstype) = @_; + my ($cdom,$cnum,$role,$rowtitle,$permission,$context,$mode,$crstype, + $showcredits,$credits) = @_; my %sections_count = &Apache::loncommon::get_sections($cdom,$cnum); my $sections_select .= &course_sections(\%sections_count,$role); my $secbox = '<div>'.&Apache::lonhtmlcommon::start_pick_box()."\n"; if ($mode eq 'upload') { my ($options,$cb_script,$coursepick) = - &default_role_selector($context,1,$crstype); + &default_role_selector($context,1,$crstype,$showcredits); $secbox .= &Apache::lonhtmlcommon::row_title(&mt('role'),'LC_oddrow_value'). $options. &Apache::lonhtmlcommon::row_closure(1)."\n"; } @@ -3411,12 +3549,21 @@ sub section_picker { '<input type="hidden" name="sections" value="" />'."\n". '</td></tr></table>'."\n"; } else { - $secbox .= '<input type="hidden" name="sections" value="'. + $secbox .= '<input type="hidden" name="sections" value="'. $env{'request.course.sec'}.'" />'. $env{'request.course.sec'}; } - $secbox .= &Apache::lonhtmlcommon::row_closure(1)."\n". - &Apache::lonhtmlcommon::end_pick_box().'</div>'; + $secbox .= &Apache::lonhtmlcommon::row_closure(1)."\n"; + unless ($mode eq 'chgsec') { + if ($showcredits) { + $secbox .= + &Apache::lonhtmlcommon::row_title(&mt('credits (students)'), + 'LC_evenrow_value')."\n". + '<input type="text" name="credits" size="3" value="'.$credits.'" />'."\n". + &Apache::lonhtmlcommon::row_closure(1)."\n"; + } + } + $secbox .= &Apache::lonhtmlcommon::end_pick_box().'</div>'; return $secbox; } @@ -3664,11 +3811,13 @@ END } } if (!$studentcount) { + my $msg = ''; if ($crstype eq 'Community') { - $r->print(&mt('There are no members to drop.')); + $msg = &mt('There are no members to drop.'); } else { - $r->print(&mt('There are no students to drop.')); + $msg = &mt('There are no students to drop.'); } + $r->print('<p class="LC_info">'.$msg.'</p>'); return; } my ($classgroups) = &Apache::loncoursedata::get_group_memberships( @@ -3814,16 +3963,17 @@ sub print_first_users_upload_form { $str .= '<input type="hidden" name="action" value="upload" />'; $str .= '<input type="hidden" name="state" value="got_file" />'; + $str .= &Apache::grades::checkforfile_js(); + $str .= '<h2>'.&mt('Upload a file containing information about users').'</h2>'."\n"; # Excel and CSV Help - $str .= '<div class="LC_left_float">' + $str .= '<div class="LC_columnSection">' .&Apache::loncommon::help_open_topic("Course_Create_Class_List", &mt("How do I create a users list from a spreadsheet")) - .'</div><div class="LC_left_float">'."\n" - .&Apache::loncommon::help_open_topic("Course_Convert_To_CSV", + .' '.&Apache::loncommon::help_open_topic("Course_Convert_To_CSV", &mt("How do I create a CSV file from a spreadsheet")) - .'</div><br clear="all" />'."\n"; + ."</div>\n"; $str .= &Apache::lonhtmlcommon::start_pick_box() .&Apache::lonhtmlcommon::row_title(&mt('File')); if (&Apache::lonlocal::current_language() ne 'en') { @@ -3844,7 +3994,8 @@ sub print_first_users_upload_form { .&Apache::lonhtmlcommon::end_pick_box(); $str .= '<p>' - .'<input type="submit" name="fileupload" value="'.&mt('Next').'" />' + .'<input type="submit" name="fileupload" value="'.&mt('Next').'"' + .' onclick="javascript:checkUpload(this.form);" />' .'</p>'; $r->print($str); @@ -3853,7 +4004,7 @@ sub print_first_users_upload_form { # ================================================= Drop/Add from uploaded file sub upfile_drop_add { - my ($r,$context,$permission) = @_; + my ($r,$context,$permission,$showcredits) = @_; &Apache::loncommon::load_tmp_file($r); my @userdata=&Apache::loncommon::upfile_record_sep(); if($env{'form.noFirstLine'}){shift(@userdata);} @@ -3874,25 +4025,17 @@ sub upfile_drop_add { } # # Store the field choices away - foreach my $field (qw/username names - fname mname lname gen id sec ipwd email role domain/) { + my @storefields = qw/username names fname mname lname gen id + sec ipwd email role domain inststatus/; + if ($showcredits) { + push (@storefields,'credits'); + } + my %fieldstype; + foreach my $field (@storefields) { $env{'form.'.$field.'_choice'}=$fields{$field}; + $fieldstype{$field.'_choice'} = 'scalar'; } - &Apache::loncommon::store_course_settings('enrollment_upload', - { 'username_choice' => 'scalar', - 'names_choice' => 'scalar', - 'fname_choice' => 'scalar', - 'mname_choice' => 'scalar', - 'lname_choice' => 'scalar', - 'gen_choice' => 'scalar', - 'id_choice' => 'scalar', - 'sec_choice' => 'scalar', - 'ipwd_choice' => 'scalar', - 'email_choice' => 'scalar', - 'role_choice' => 'scalar', - 'domain_choice' => 'scalar', - 'inststatus_choice' => 'scalar'}); - # + &Apache::loncommon::store_course_settings('enrollment_upload',\%fieldstype); my ($cid,$crstype,$setting); if ($context eq 'domain') { $setting = $env{'form.roleaction'}; @@ -3960,19 +4103,30 @@ sub upfile_drop_add { $amode = ''; # This causes the loop below to be skipped } } - my ($defaultsec,$defaultrole); + my ($defaultsec,$defaultrole,$defaultcredits,$commoncredits); if ($context eq 'domain') { if ($setting eq 'domain') { $defaultrole = $env{'form.defaultrole'}; } elsif ($setting eq 'course') { $defaultrole = $env{'form.courserole'}; $defaultsec = $env{'form.sections'}; - } + if ($showcredits) { + $commoncredits = $env{'form.credits'}; + if ($crstype ne 'Community') { + my %coursehash=&Apache::lonnet::coursedescription($cid); + $defaultcredits = $coursehash{'internal.defaultcredits'}; + } + } + } } elsif ($context eq 'author') { $defaultrole = $env{'form.defaultrole'}; } elsif ($context eq 'course') { $defaultrole = $env{'form.defaultrole'}; $defaultsec = $env{'form.sections'}; + if ($showcredits) { + $commoncredits = $env{'form.credits'}; + $defaultcredits = $env{'course.'.$cid.'.internal.defaultcredits'}; + } } # Check to see if user information can be changed my @userinfo = ('firstname','middlename','lastname','generation', @@ -4117,18 +4271,23 @@ sub upfile_drop_add { if ($entries{$fields{'username'}} =~ /\s/) { $nowhitespace = ' - '.&mt('usernames may not contain spaces.'); } - $r->print('<br />'. - &mt('[_1]: Unacceptable username for user [_2] [_3] [_4] [_5]', - '<b>'.$entries{$fields{'username'}}.'</b>',$fname,$mname,$lname,$gen). - $nowhitespace); + $r->print( + '<br />'. + &mt('Unacceptable username [_1] for user [_2] [_3] [_4] [_5]', + '"<b>'.$entries{$fields{'username'}}.'</b>"', + $fname,$mname,$lname,$gen). + $nowhitespace); next; } else { $entries{$fields{'domain'}} =~ s/^\s+|\s+$//g; if ($entries{$fields{'domain'}} ne &LONCAPA::clean_domain($entries{$fields{'domain'}})) { - $r->print('<br />'. '<b>'.$entries{$fields{'domain'}}. - '</b>: '.&mt('Unacceptable domain for user [_2] [_3] [_4] [_5]',$fname,$mname,$lname,$gen)); - next; + $r->print( + '<br />'. + &mt('Unacceptable domain [_1] for user [_2] [_3] [_4] [_5]', + '"<b>'.$entries{$fields{'domain'}}.'</b>"', + $fname,$mname,$lname,$gen)); + next; } my $username = $entries{$fields{'username'}}; my $userdomain = $entries{$fields{'domain'}}; @@ -4232,6 +4391,21 @@ sub upfile_drop_add { foreach (\$id,\$fname,\$mname,\$lname,\$gen,\$inststatus) { $$_ =~ s/(\s+$|^\s+)//g; } + my $credits; + if ($showcredits) { + if (($role eq 'st') && ($crstype ne 'Community')) { + $credits = $entries{$fields{'credits'}}; + if ($credits ne '') { + $credits =~ s/[^\d\.]//g; + } + if ($credits eq '') { + $credits = $commoncredits; + } + if ($credits eq $defaultcredits) { + undef($credits); + } + } + } # check against rules my $checkid = 0; my $newuser = 0; @@ -4362,7 +4536,7 @@ sub upfile_drop_add { $fname,$mname,$lname,$gen,$sec,$enddate, $startdate,$env{'form.forceid'}, $desiredhost,$email,'manual','',$cid, - '',$context,$inststatus); + '',$context,$inststatus,$credits); $userresult = $roleresult; } else { if ($role ne '') { @@ -4457,9 +4631,9 @@ sub upfile_drop_add { # Get current classlist my $classlist = &Apache::loncoursedata::get_classlist(); if (! defined($classlist)) { - $r->print('<form name="studentform" method="post" action="/adm/createuser" />'. + $r->print('<form name="studentform" method="post" action="/adm/createuser">'. '<input type="hidden" name="action" value="'.$env{'form.action'}.'" />'. - &mt('There are no students with current/future access to the course.'). + '<p class="LC_info">'.&mt('There are no students with current/future access to the course.').'</p>'. '</form>'."\n"); } elsif (ref($classlist) eq 'HASH') { # Remove the students we just added from the list of students. @@ -4580,14 +4754,16 @@ sub print_drop_menu { $heading = &mt("Drop Students"); } $r->print('<h3>'.$heading.'</h3>'."\n". - '<form name="studentform" method="post">'."\n"); + '<form name="studentform" method="post" action="">'."\n"); my $classlist = &Apache::loncoursedata::get_classlist(); if (! defined($classlist)) { + my $msg = ''; if ($crstype eq 'Community') { - $r->print(&mt('There are no members currently enrolled.')."\n"); + $msg = &mt('There are no members currently enrolled.'); } else { - $r->print(&mt('There are no students currently enrolled.')."\n"); + $msg = &mt('There are no students currently enrolled.'); } + $r->print('<p class="LC_info">'.$msg."</p>\n"); } else { &show_drop_list($r,$classlist,'nosort',$permission,$crstype); } @@ -4634,7 +4810,7 @@ sub update_user_list { foreach my $item (@changelist) { my ($role,$uname,$udom,$cid,$sec,$scope,$result,$type,$locktype, @sections,$scopestem,$singlesec,$showsecs,$warn_singlesec, - $nothingtodo,$keepnosection); + $nothingtodo,$keepnosection,$credits); if ($choice eq 'drop') { ($uname,$udom,$sec) = split(/:/,$item,-1); $role = 'st'; @@ -4647,7 +4823,8 @@ sub update_user_list { $scope = $scopestem.'/'.$sec; } } elsif ($context eq 'course') { - ($uname,$udom,$role,$sec,$type,$locktype) = split(/\:/,$item,-1); + ($uname,$udom,$role,$sec,$type,$locktype,$credits) = + split(/\:/,$item); $cid = $env{'request.course.id'}; $scopestem = '/'.$cid; $scopestem =~s/\_/\//g; @@ -4666,7 +4843,7 @@ sub update_user_list { } elsif ($setting eq 'author') { ($uname,$udom,$role,$scope) = split(/\:/,$item); } elsif ($setting eq 'course') { - ($uname,$udom,$role,$cid,$sec,$type,$locktype) = + ($uname,$udom,$role,$cid,$sec,$type,$locktype,$credits) = split(/\:/,$item); $scope = '/'.$cid; $scope =~s/\_/\//g; @@ -4689,7 +4866,7 @@ sub update_user_list { $end = $now; if ($role eq 'st') { $result = - &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$sec,$end,$start,$type,$locktype,$cid,'',$context); + &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$sec,$end,$start,$type,$locktype,$cid,'',$context,$credits); } else { $result = &Apache::lonnet::revokerole($udom,$uname,$scope,$role, @@ -4697,7 +4874,7 @@ sub update_user_list { } } elsif ($choice eq 'delete') { if ($role eq 'st') { - &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$sec,$now,$start,$type,$locktype,$cid,'',$context); + &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$sec,$now,$start,$type,$locktype,$cid,'',$context,$credits); } $result = &Apache::lonnet::assignrole($udom,$uname,$scope,$role,$now, @@ -4710,7 +4887,7 @@ sub update_user_list { } if ($choice eq 'reenable') { if ($role eq 'st') { - $result = &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$sec,$end,$start,$type,$locktype,$cid,'',$context); + $result = &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$sec,$end,$start,$type,$locktype,$cid,'',$context,$credits); } else { $result = &Apache::lonnet::assignrole($udom,$uname,$scope,$role,$end, @@ -4718,14 +4895,14 @@ sub update_user_list { } } elsif ($choice eq 'activate') { if ($role eq 'st') { - $result = &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$sec,$end,$start,$type,$locktype,$cid,'',$context); + $result = &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$sec,$end,$start,$type,$locktype,$cid,'',$context,$credits); } else { $result = &Apache::lonnet::assignrole($udom,$uname,$scope,$role,$end, $now,'','',$context); } } elsif ($choice eq 'chgdates') { if ($role eq 'st') { - $result = &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$sec,$end,$start,$type,$locktype,$cid,'',$context); + $result = &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$sec,$end,$start,$type,$locktype,$cid,'',$context,$credits); } else { $result = &Apache::lonnet::assignrole($udom,$uname,$scope,$role,$end, $start,'','',$context); @@ -4795,7 +4972,7 @@ sub update_user_list { } else { if ($role eq 'st') { $result = - &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,undef,$end,$start,$type,$locktype,$cid,'',$context); + &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,undef,$end,$start,$type,$locktype,$cid,'',$context,$credits); } else { my $newscope = $scopestem; $result = &Apache::lonnet::assignrole($udom,$uname,$newscope,$role,$end,$start,'','',$context); @@ -4809,7 +4986,7 @@ sub update_user_list { foreach my $newsec (@newsecs) { if (!grep(/^\Q$newsec\E$/,@retained)) { if ($role eq 'st') { - $result = &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$newsec,$end,$start,$type,$locktype,$cid,'',$context); + $result = &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$newsec,$end,$start,$type,$locktype,$cid,'',$context,$credits); if (@newsecs > 1) { my $showsingle; if ($newsec eq '') { @@ -4920,7 +5097,7 @@ sub update_user_list { } } } - $r->print('<p><b>'.&mt("$result_text{'ok'}{$choice} for [quant,_1,user role,user roles,no user roles].",$count).'</b></p>'); + $r->print('<p><b>'.&mt("$result_text{'ok'}{$choice} [quant,_1,user role,user roles,no user roles].",$count).'</b></p>'); if ($count > 0) { if ($choice eq 'revoke' || $choice eq 'drop') { $r->print('<p>'.&mt('Re-enabling will re-activate data for the role.').'</p>'); @@ -4937,7 +5114,10 @@ sub update_user_list { if ($choice eq 'drop') { $linktext = &mt('Display current class roster'); } - $r->print('<a href="javascript:document.studentform.submit()">'.$linktext.'</a></form>'."\n"); + $r->print( + &Apache::lonhtmlcommon::actionbox( + ['<a href="javascript:document.studentform.submit()">'.$linktext.'</a>']) + .'</form>'."\n"); } sub dates_feedback { @@ -4945,7 +5125,7 @@ sub dates_feedback { my $dates; if ($start < $now) { if ($end == 0) { - $dates .= &mt('role(s) active now; no end date'); + $dates = &mt('role(s) active now; no end date'); } elsif ($end > $now) { $dates = &mt('role(s) active now; ends [_1].',&Apache::lonlocal::locallocaltime($end)); } else { @@ -5098,14 +5278,18 @@ sub get_groupslist { } sub setsections_javascript { - my ($formname,$groupslist,$mode,$checkauth,$crstype) = @_; + my ($formname,$groupslist,$mode,$checkauth,$crstype,$showcredits) = @_; my ($checkincluded,$finish,$rolecode,$setsection_js); if ($mode eq 'upload') { $checkincluded = 'formname.name == "'.$formname.'"'; $finish = "return 'ok';"; $rolecode = "var role = formname.defaultrole.options[formname.defaultrole.selectedIndex].value;\n"; } elsif ($formname eq 'cu') { - $checkincluded = 'formname.elements[i-1].checked == true'; + if (($crstype eq 'Course') && ($showcredits)) { + $checkincluded = "((role == 'st') && (formname.elements[i-2].checked == true)) || ((role != 'st') && (formname.elements[i-1].checked == true))"; + } else { + $checkincluded = 'formname.elements[i-1].checked == true'; + } if ($checkauth) { $finish = "var authcheck = auth_check();\n". " if (authcheck == 'ok') {\n". @@ -5142,7 +5326,7 @@ sub setsections_javascript { 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.', inco => 'In each community, each user may only have one member role at a time.', - youh => 'You had selected ', + youh => 'You had selected', secs => 'sections.', plmo => '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.', @@ -5164,8 +5348,8 @@ function setSections(formname,crstype) { var checkcurr = str.match(re1); if (checkcurr != null) { var num = i; + $rolecode if ($checkincluded) { - $rolecode if (role == 'cc' || role == 'co') { if (role == 'cc') { alert("$alerts{'secd'}\\n$alerts{'accr'}"); @@ -5538,7 +5722,7 @@ sub get_course_identity { } sub dc_setcourse_js { - my ($formname,$mode,$context) = @_; + my ($formname,$mode,$context,$showcredits) = @_; my ($dc_setcourse_code,$authen_check); my $cctext = &Apache::lonnet::plaintext('cc'); my $cotext = &Apache::lonnet::plaintext('co'); @@ -5624,7 +5808,7 @@ function setCourse() { } SCRIPTTOP if ($mode ne 'upload') { - $dc_setcourse_code .= (<<"ENDSCRIPT"); + $dc_setcourse_code .= (<<"SCRIPTMID"); var coursename = "_$env{'request.role.domain'}"+"_"+course+"_"+userrole var numcourse = getIndex(document.$formname.dccourse); if (numcourse == "-1") { @@ -5650,6 +5834,16 @@ SCRIPTTOP if (numend != "-1") { document.$formname.elements[numend].name = "end"+coursename } +SCRIPTMID + if ($showcredits) { + $dc_setcourse_code .= <<ENDCRED; + var numcredits = getIndex(document.$formname.credits); + if (numcredits != "-1") { + document.$formname.elements[numcredits].name = "credits"+coursename; + } +ENDCRED + } + $dc_setcourse_code .= <<ENDSCRIPT; } } var authcheck = auth_check();