--- loncom/interface/lonuserutils.pm 2007/12/23 03:16:30 1.30 +++ loncom/interface/lonuserutils.pm 2009/05/04 16:45:58 1.90 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Utility functions for managing LON-CAPA user accounts # -# $Id: lonuserutils.pm,v 1.30 2007/12/23 03:16:30 raeburn Exp $ +# $Id: lonuserutils.pm,v 1.90 2009/05/04 16:45:58 bisitz Exp $ # # Copyright Michigan State University Board of Trustees # @@ -42,7 +42,7 @@ use LONCAPA qw(:DEFAULT :match); ############################################################### # Drop student from all sections of a course, except optional $csec sub modifystudent { - my ($udom,$unam,$courseid,$csec,$desiredhost)=@_; + my ($udom,$unam,$courseid,$csec,$desiredhost,$context)=@_; # if $csec is undefined, drop the student from all the courses matching # this one. If $csec is defined, drop them from all other sections of # this course and add them to section $csec @@ -69,14 +69,14 @@ sub modifystudent { # dom name id mode pass f m l g ($udom,$unam,'', '', '',undef,undef,undef,undef, $section,time,undef,undef,$desiredhost,'','manual', - '',$courseid); + '',$courseid,'',$context); $result .= $reply.':'; } } } } if ($result eq '') { - $result = 'Unable to find section for this student'; + $result = &mt('Unable to find section for this student'); } else { $result =~ s/(ok:)+/ok/g; } @@ -86,7 +86,7 @@ sub modifystudent { sub modifyuserrole { my ($context,$setting,$changeauth,$cid,$udom,$uname,$uid,$umode,$upass, $first,$middle,$last,$gene,$sec,$forceid,$desiredhome,$email,$role, - $end,$start,$checkid) = @_; + $end,$start,$checkid,$inststatus) = @_; my ($scope,$userresult,$authresult,$roleresult,$idresult); if ($setting eq 'course' || $context eq 'course') { $scope = '/'.$cid; @@ -124,12 +124,13 @@ sub modifyuserrole { $userresult = &Apache::lonnet::modifyuser($udom,$uname,$uid,$umode,$upass,$first, $middle,$last,$gene,$forceid,$desiredhome, - $email,$role,$start,$end); + $email,$inststatus); if ($userresult eq 'ok') { if ($role ne '') { $role =~ s/_/\//g; $roleresult = &Apache::lonnet::assignrole($udom,$uname,$scope, - $role,$end,$start); + $role,$end,$start,'', + '',$context); } } return ($userresult,$authresult,$roleresult,$idresult); @@ -168,7 +169,7 @@ sub propagate_id_change { } sub update_classlist { - my ($cdom,$cnum,$udom,$uname,$user) = @_; + my ($cdom,$cnum,$udom,$uname,$user,$newend) = @_; my ($uid,$classlistentry); my $fullname = &Apache::lonnet::format_name($user->{'firstname'},$user->{'middlename'}, @@ -179,15 +180,37 @@ sub update_classlist { my @classinfo = split(/:/,$classhash{$uname.':'.$udom}); my $ididx=&Apache::loncoursedata::CL_ID() - 2; my $nameidx=&Apache::loncoursedata::CL_FULLNAME() - 2; + my $endidx = &Apache::loncoursedata::CL_END() - 2; + my $startidx = &Apache::loncoursedata::CL_START() - 2; for (my $i=0; $i<@classinfo; $i++) { - if ($i == $ididx) { + if ($i == $endidx) { + if ($newend ne '') { + $classlistentry .= $newend.':'; + } else { + $classlistentry .= $classinfo[$i].':'; + } + } elsif ($i == $startidx) { + if ($newend ne '') { + if ($classinfo[$i] > $newend) { + $classlistentry .= $newend.':'; + } else { + $classlistentry .= $classinfo[$i].':'; + } + } else { + $classlistentry .= $classinfo[$i].':'; + } + } elsif ($i == $ididx) { if (defined($user->{'id'})) { $classlistentry .= $user->{'id'}.':'; } else { $classlistentry .= $classinfo[$i].':'; } } elsif ($i == $nameidx) { - $classlistentry .= $fullname.':'; + if (defined($user->{'lastname'})) { + $classlistentry .= $fullname.':'; + } else { + $classlistentry .= $classinfo[$i].':'; + } } else { $classlistentry .= $classinfo[$i].':'; } @@ -304,9 +327,9 @@ sub print_upload_manager_header { my $javascript_validations = &javascript_validations('upload',$krbdefdom,$password_choice,undef, $env{'request.role.domain'},$context, - $permission,$groupslist); + $groupslist); my $checked=(($env{'form.noFirstLine'})?' checked="checked" ':''); - $r->print(&mt('Total number of records found in file: [_1].',$distotal). + $r->print(&mt('Total number of records found in file: [_1]',''.$distotal.''). "
\n"); $r->print('

'. &mt('Identify fields in uploaded list')."

\n"); @@ -318,11 +341,11 @@ 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('
print('

'); + $r->print('
'); - $r->print(''); $r->print("

\n". ''); @@ -332,18 +355,13 @@ sub print_upload_manager_header { ############################################################### sub javascript_validations { my ($mode,$krbdefdom,$curr_authtype,$curr_authfield,$domain, - $context,$permission,$groupslist)=@_; - + $context,$groupslist)=@_; my %param = ( kerb_def_dom => $krbdefdom, curr_authtype => $curr_authtype, ); - if ($mode eq 'createuser') { - $param{'formname'} = 'cu'; - } elsif ($mode eq 'upload') { + if ($mode eq 'upload') { $param{'formname'} = 'studentform'; - } elsif ($mode eq 'singlestudent') { - $param{'formname'} = 'cu'; } elsif ($mode eq 'createcourse') { $param{'formname'} = 'ccrs'; } elsif ($mode eq 'modifycourse') { @@ -367,7 +385,7 @@ sub javascript_validations { } } elsif ($context eq 'domain') { $setsection_call = 'setCourse()'; - $setsections_js = &dc_setcourse_js($param{'formname'},$mode); + $setsections_js = &dc_setcourse_js($param{'formname'},$mode,$context); } $finish = " var checkSec = $setsection_call\n". " if (checkSec == 'ok') {\n". @@ -385,15 +403,18 @@ sub javascript_validations { name => 'The optional name field was not specified.', snum => 'The optional ID number field was not specified.', section => 'The optional section field was not specified.', - email => 'The optional email address field was not specified.', + email => 'The optional e-mail address field was not specified.', role => 'The optional role field was not specified.', + domain => 'The optional domain field was not specified.', continue => 'Continue adding users?', ); - - my $function_name =(<\n"; if ($context eq 'domain') { - $Str .= '

'.&mt('Change authentication for existing users to these settings?').'   

'; + $Str .= '

'.&mt('Change authentication for existing users in domain "[_1]" to these settings?',$defdom).'   

'; } else { $Str .= "

\n". - &mt('Note: this will not take effect if the user already exists'). + &mt('Note: This will not take effect if the user already exists.'). &Apache::loncommon::help_open_topic('Auth_Options'). "

\n"; } @@ -729,6 +780,8 @@ sub print_upload_manager_footer { } else { $Str .= $home_server_pick; } + $Str .= '

'.&mt('Default domain').'

'."\n". + &Apache::loncommon::select_dom_form($defdom,'defaultdomain',undef,1); $Str .= '

'.&mt('Starting and Ending Dates'). "

\n"; $Str .= "

\n".$date_table."

\n"; @@ -760,21 +813,23 @@ sub print_upload_manager_footer { my $secbox = §ion_picker($cdom,$cnum,'Any',$rowtitle, $permission,$context,'upload'); $Str .= $secbox."

".&mt('Full Update')."

\n". - '

\n"; + '


'.&mt('Students selected from this list can be dropped.').'

'."\n"; } if ($context eq 'course' || $context eq 'domain') { $Str .= &forceid_change($context); } - $Str .= '
'; + $Str .= ''; $r->print($Str); return; } @@ -782,15 +837,15 @@ sub print_upload_manager_footer { sub forceid_change { my ($context) = @_; my $output = - "

".&mt('ID/Student Number')."

\n". - "

\n".'
'."\n". + "

".&mt('Student/Employee ID')."

\n". + "

\n".'
'."\n". &mt('(only do if you know what you are doing.)')."\n"; if ($context eq 'domain') { $output .= '
'."\n"; } $output .= '

'; @@ -830,6 +885,8 @@ sub print_upload_manager_form { 'ipwd_choice' => 'scalar', 'email_choice' => 'scalar', 'role_choice' => 'scalar', + 'domain_choice' => 'scalar', + 'inststatus_choice' => 'scalar', }; my $defdom = $env{'request.role.domain'}; if ($context eq 'course') { @@ -856,11 +913,13 @@ sub print_upload_manager_form { ['mname',&mt('Middle Names/Initials'),$env{'form.mname_choice'}], ['lname',&mt('Last Name'), $env{'form.lname_choice'}], ['gen', &mt('Generation'), $env{'form.gen_choice'}], - ['id', &mt('ID/Student Number'),$env{'form.id_choice'}], + ['id', &mt('Student/Employee ID'),$env{'form.id_choice'}], ['sec', &mt('Section'), $env{'form.sec_choice'}], ['ipwd', &mt('Initial Password'),$env{'form.ipwd_choice'}], ['email',&mt('E-mail Address'), $env{'form.email_choice'}], - ['role',&mt('Role'), $env{'form.role_choice'}]); + ['role',&mt('Role'), $env{'form.role_choice'}], + ['domain',&mt('Domain'), $env{'form.domain_choice'}], + ['inststatus',&mt('Affiliation'), $env{'form.inststatus_choice'}]); if ($env{'form.upfile_associate'} eq 'reverse') { &Apache::loncommon::csv_print_samples($r,\@records); $i=&Apache::loncommon::csv_print_select_table($r,\@records, @@ -937,8 +996,15 @@ sub setup_date_selectors { sub get_dates_from_form { - my $startdate = &Apache::lonhtmlcommon::get_date_from_form('startdate'); - my $enddate = &Apache::lonhtmlcommon::get_date_from_form('enddate'); + my ($startname,$endname) = @_; + if ($startname eq '') { + $startname = 'startdate'; + } + if ($endname eq '') { + $endname = 'enddate'; + } + my $startdate = &Apache::lonhtmlcommon::get_date_from_form($startname); + my $enddate = &Apache::lonhtmlcommon::get_date_from_form($endname); if ($env{'form.no_end_date'}) { $enddate = 0; } @@ -971,7 +1037,7 @@ sub date_setting_table { } my $perpetual = ''; if ($mode eq 'create_enrolldates') { @@ -1257,37 +1323,28 @@ sub print_userlist { $output_selector .= "\n".$option; } $output_selector .= ''; - $r->print(''.(' 'x3)); - } - $r->print(''.(' 'x3)."\n"); + $r->print(''.(' 'x3)); + } + $r->print(''.(' 'x3)."\n"); my $roleselected = ''; if ($env{'form.showrole'} eq 'Any') { $roleselected = ' selected="selected" '; } - my $role_select; - if ($context eq 'domain') { - $role_select = &domain_roles_select(); - $r->print(''); - } else { - $role_select = ''; - $r->print(''); + my ($cnum,$cdom); + $r->print(&role_filter($context)); + if ($context eq 'course') { + ($cnum,$cdom) = &get_course_identity(); + $r->print(§ion_group_filter($cnum,$cdom)); + } + if ($env{'form.phase'} eq '') { + $r->print('

'.&list_submit_button(&mt('Display List of Users')). + "\n

\n". + ''); + return; } if (!(($context eq 'domain') && ($env{'form.roletype'} eq 'course'))) { $r->print(' '.&list_submit_button(&mt('Update Display')). @@ -1307,7 +1364,7 @@ sub print_userlist { &Apache::lonhtmlcommon::row_closure(1). &Apache::lonhtmlcommon::end_pick_box().'

'. '

'.&list_submit_button(&mt('Update Display')). - "\n

\n"); + "\n".'

'.&mt('Warning: data retrieval for multiple courses can take considerable time, as this operation is not currently optimized.').''."\n"); if ($env{'form.coursepick'}) { $r->print('
'.&mt('Searching').' ...
 
'); } @@ -1316,34 +1373,26 @@ sub print_userlist { } $r->rflush(); if ($context eq 'course') { - my $classlist = &Apache::loncoursedata::get_classlist(); - my $secidx = &Apache::loncoursedata::CL_SECTION(); - my $viewablesec = &viewable_section($permission); - foreach my $student (keys(%{$classlist})) { - my $section = $classlist->{$student}[$secidx]; - if ($viewablesec ne '') { - if ($section ne $viewablesec) { - next; - } else { - $userlist{$student} = $classlist->{$student}; - } - } else { - $userlist{$student} = $classlist->{$student}; + if (($env{'form.showrole'} eq 'st') || ($env{'form.showrole'} eq 'Any')) { + my $classlist = &Apache::loncoursedata::get_classlist(); + if (ref($classlist) eq 'HASH') { + %userlist = %{$classlist}; } } - my $cid = $env{'request.course.id'}; - my ($cnum,$cdom) = &get_course_identity($cid); - my $showroles; - if ($env{'form.showrole'} ne 'Any') { - $showroles = [$env{'form.showrole'}]; - } else { - $showroles = undef; + if ($env{'form.showrole'} ne 'st') { + my $showroles; + if ($env{'form.showrole'} ne 'Any') { + $showroles = [$env{'form.showrole'}]; + } else { + $showroles = undef; + } + my $withsec = 1; + my $hidepriv = 1; + my %advrolehash = &Apache::lonnet::get_my_roles($cnum,$cdom,undef, + \@statuses,$showroles,undef,$withsec,$hidepriv); + &gather_userinfo($context,$format,\%userlist,$indexhash,\%userinfo, + \%advrolehash,$permission); } - my $withsec = 1; - my %advrolehash = &Apache::lonnet::get_my_roles($cnum,$cdom,undef, - \@statuses,$showroles,undef,$withsec); - &gather_userinfo($context,$format,\%userlist,$indexhash,\%userinfo, - \%advrolehash,$permission); } else { my (%cstr_roles,%dom_roles); if ($context eq 'author') { @@ -1392,7 +1441,8 @@ sub print_userlist { } elsif ($env{'form.roletype'} eq 'course') { if ($env{'form.coursepick'}) { my %courses = &process_coursepick(); - my %allusers; + my %allusers; + my $hidepriv = 1; foreach my $cid (keys(%courses)) { my ($cnum,$cdom,$cdesc) = &get_course_identity($cid); next if ($cnum eq '' || $cdom eq ''); @@ -1410,7 +1460,7 @@ sub print_userlist { foreach my $type (@statuses) { $access{$type} = $type; } - &Apache::loncommon::get_course_users($cdom,$cnum,\%access,\@roles,\@sections,\%users,\%userdata,\%statushash); + &Apache::loncommon::get_course_users($cdom,$cnum,\%access,\@roles,\@sections,\%users,\%userdata,\%statushash,$hidepriv); foreach my $user (keys(%userdata)) { next if (ref($userinfo{$user}) eq 'HASH'); foreach my $item ('fullname','id') { @@ -1461,13 +1511,111 @@ sub print_userlist { $permission,$env{'form.Status'},\%userlist,$keylist); } if (!$usercount) { - $r->print('
'.&mt('There are no users matching the search criteria.')); + $r->print('
' + .&mt('There are no users matching the search criteria.') + .'' + ); } } $r->print(''); } +sub role_filter { + my ($context) = @_; + my $output; + my $roleselected = ''; + if ($env{'form.showrole'} eq 'Any') { + $roleselected = ' selected="selected" '; + } + my ($role_select); + if ($context eq 'domain') { + $role_select = &domain_roles_select(); + $output = ''; + } else { + $role_select = ''; + $output = ''; + } + return $output; +} + +sub section_group_filter { + my ($cnum,$cdom) = @_; + my @filters; + if ($env{'request.course.sec'} eq '') { + @filters = ('sec'); + } + push(@filters,'grp'); + my %name = ( + sec => 'secfilter', + grp => 'grpfilter', + ); + my %title = &Apache::lonlocal::texthash ( + sec => 'Section(s)', + grp => 'Group(s)', + all => 'all', + none => 'none', + ); + my $output; + foreach my $item (@filters) { + my ($markup,@options); + if ($env{'form.'.$name{$item}} eq '') { + $env{'form.'.$name{$item}} = 'all'; + } + if ($item eq 'sec') { + if ($env{'form.showrole'} eq 'cc') { + $env{'form.'.$name{$item}} = 'none'; + } + my %sections_count = &Apache::loncommon::get_sections($cdom,$cnum); + @options = sort(keys(%sections_count)); + } elsif ($item eq 'grp') { + my %curr_groups = &Apache::longroup::coursegroups(); + @options = sort(keys(%curr_groups)); + } + if (@options > 0) { + my $currsel; + $markup = ''."\n"; + $output .= (' 'x3).''; + } + } + return $output; +} + sub list_submit_button { my ($text) = @_; return ''; @@ -1475,6 +1623,10 @@ sub list_submit_button { sub gather_userinfo { my ($context,$format,$userlist,$indexhash,$userinfo,$rolehash,$permission) = @_; + my $viewablesec; + if ($context eq 'course') { + $viewablesec = &viewable_section($permission); + } foreach my $item (keys(%{$rolehash})) { my %userdata; if ($context eq 'author') { @@ -1484,7 +1636,6 @@ sub gather_userinfo { &build_user_record($context,\%userdata,$userinfo,$indexhash, $item,$userlist); } elsif ($context eq 'course') { - my $viewablesec = &viewable_section($permission); ($userdata{'username'},$userdata{'domain'},$userdata{'role'}, $userdata{'section'}) = split(/:/,$item,-1); ($userdata{'start'},$userdata{'end'})=split(/:/,$rolehash->{$item}); @@ -1752,6 +1903,8 @@ sub make_keylist_array { $index->{'email'} = &Apache::loncoursedata::CL_PERMANENTEMAIL(); $index->{'role'} = &Apache::loncoursedata::CL_ROLE(); $index->{'extent'} = &Apache::loncoursedata::CL_EXTENT(); + $index->{'photo'} = &Apache::loncoursedata::CL_PHOTO(); + $index->{'thumbnail'} = &Apache::loncoursedata::CL_THUMBNAIL(); foreach my $key (keys(%{$index})) { $keylist->[$index->{$key}] = $key; } @@ -1800,7 +1953,10 @@ sub process_date_info { } sub show_users_list { - my ($r,$context,$mode,$permission,$statusmode,$userlist,$keylist)=@_; + my ($r,$context,$mode,$permission,$statusmode,$userlist,$keylist,$formname)=@_; + if ($formname eq '') { + $formname = 'studentform'; + } # # Variables for excel output my ($excel_workbook, $excel_sheet, $excel_filename,$row,$format); @@ -1815,6 +1971,9 @@ sub show_users_list { } else { push(@sortable,'extent'); } + if ($mode eq 'pickauthor') { + @sortable = ('username','fullname','email','status'); + } if (!grep(/^\Q$sortby\E$/,@sortable)) { $sortby = 'username'; } @@ -1855,66 +2014,49 @@ function photowindow(photolink) { END } } - if ($mode ne 'autoenroll') { + if ($mode ne 'autoenroll' && $mode ne 'pickauthor') { my $check_uncheck_js = &Apache::loncommon::check_uncheck_jscript(); - my $alert = &mt("You must select at least one user by checking a user's 'Select' checkbox"); - my $singconfirm = &mt(' for a single user?'); - my $multconfirm = &mt(' for multiple users?'); - my $date_sec_selector = &date_section_javascript($context,$setting,$statusmode); + my $date_sec_selector = &date_section_javascript($context,$setting,$statusmode); + my $verify_action_js = &bulkaction_javascript($formname); $r->print(< $check_uncheck_js -function verify_action (field) { - var numchecked = 0; - var singconf = '$singconfirm'; - var multconf = '$multconfirm'; - if (field.length > 0) { - for (i = 0; i < field.length; i++) { - if (field[i].checked == true) { - numchecked ++; - } - } - } else { - if (field.checked == true) { - numchecked ++; - } - } - if (numchecked == 0) { - alert("$alert"); - } - else { - var message = document.studentform.bulkaction[document.studentform.bulkaction.selectedIndex].text; - if (numchecked == 1) { - message += singconf; - } - else { - message += multconf; - } - if (confirm(message)) { - document.studentform.phase.value = 'bulkchange'; - document.studentform.submit(); - } - } -} +$verify_action_js function username_display_launch(username,domain) { var target; - for (var i=0; i @@ -1938,45 +2080,51 @@ END 'status' => "status", 'role' => "role", 'type' => "enroll type/action", - 'email' => "email address", - 'clicker' => "clicker id", + 'email' => "e-mail address", 'photo' => "photo", 'extent' => "extent", 'pr' => "Proceed", 'ca' => "check all", 'ua' => "uncheck all", 'ac' => "Action to take for selected users", - 'link' => "Behavior of username links", - 'aboutme' => "Display a user's personal page", + 'link' => "Behavior of clickable username link for each user", + 'aboutme' => "Display a user's personal information page", + 'owin' => "Open in a new window", 'modify' => "Modify a user's information", + 'clicker' => "Clicker-ID", ); if ($context eq 'domain' && $env{'form.roletype'} eq 'course') { $lt{'extent'} = &mt('Course(s): description, section(s), status'); } elsif ($context eq 'author') { $lt{'extent'} = &mt('Author'); } - my @cols = ('username','domain','id','fullname'); - if ($context eq 'course') { - push(@cols,'section'); - } - if (!($context eq 'domain' && $env{'form.roletype'} eq 'course')) { - push(@cols,('start','end')); - } - if ($env{'form.showrole'} eq 'Any' || $env{'form.showrole'} eq 'cr') { - push(@cols,'role'); - } - if ($context eq 'domain' && ($env{'form.roletype'} eq 'author' || - $env{'form.roletype'} eq 'course')) { - push (@cols,'extent'); - } - if (($statusmode eq 'Any') && - (!($context eq 'domain' && $env{'form.roletype'} eq 'course'))) { - push(@cols,'status'); - } - if ($context eq 'course') { - push(@cols,'groups'); + my @cols; + if ($mode eq 'pickauthor') { + @cols = ('username','fullname','status','email'); + } else { + @cols = ('username','domain','id','fullname'); + if ($context eq 'course') { + push(@cols,'section'); + } + if (!($context eq 'domain' && $env{'form.roletype'} eq 'course')) { + push(@cols,('start','end')); + } + if ($env{'form.showrole'} eq 'Any' || $env{'form.showrole'} eq 'cr') { + push(@cols,'role'); + } + if ($context eq 'domain' && ($env{'form.roletype'} eq 'author' || + $env{'form.roletype'} eq 'course')) { + push (@cols,'extent'); + } + if (($statusmode eq 'Any') && + (!($context eq 'domain' && $env{'form.roletype'} eq 'course'))) { + push(@cols,'status'); + } + if ($context eq 'course') { + push(@cols,'groups'); + } + push(@cols,'email'); } - push(@cols,'email'); my $rolefilter = $env{'form.showrole'}; if ($env{'form.showrole'} eq 'cr') { @@ -1988,13 +2136,13 @@ END if ($mode ne 'autoenroll') { $results_description = &results_header_row($rolefilter,$statusmode, $context,$permission,$mode); - $r->print(''.$results_description.'
'); + $r->print(''.$results_description.'

'); } my ($output,$actionselect,%canchange,%canchangesec); - if ($mode eq 'html' || $mode eq 'view' || $mode eq 'autoenroll') { - if ($mode ne 'autoenroll') { + 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); + $actionselect = &select_actions($context,$setting,$statusmode,$formname); } $r->print(< @@ -2003,31 +2151,12 @@ END END - $output = '

'; - my @linkdests = ('aboutme'); - if ($permission->{'cusr'}) { - push (@linkdests,'modify'); - $output .= ''.$lt{'link'}.': '; - my $usernamelink = $env{'form.usernamelink'}; - if ($usernamelink eq '') { - $usernamelink = 'aboutme'; - } - foreach my $item (@linkdests) { - my $checkedstr = ''; - if ($item eq $usernamelink) { - $checkedstr = ' checked="checked" '; - } - $output .= '  '; - } - $output .= '
'; - } else { - $output .= &mt("Click on a username to view the user's personal page.").'
'; - } if ($actionselect) { - $output .= <<"END"; -$lt{'ac'}: $actionselect

-

  - + $output .= <<"END"; +

$lt{'ac'} +$actionselect +

  +
END my @allroles; if ($env{'form.showrole'} eq 'Any') { @@ -2047,6 +2176,11 @@ END $env{'request.role.domain'})) { $canchange{$role} = 1; } + } elsif ($setting eq 'author') { + if (&Apache::lonnet::allowed('c'.$role, + $env{'request.role.domain'})) { + $canchange{$role} = 1; + } } } elsif ($context eq 'author') { if (&Apache::lonnet::allowed('c'.$role, @@ -2064,40 +2198,68 @@ END } } } + $output .= '
'.$lt{'link'}.''. + ''; + my @linkdests = ('aboutme'); + if ($permission->{'cusr'}) { + unshift (@linkdests,'modify'); + } + $output .= '
'; + my $usernamelink = $env{'form.usernamelink'}; + if ($usernamelink eq '') { + $usernamelink = 'aboutme'; + } + foreach my $item (@linkdests) { + my $checkedstr = ''; + if ($item eq $usernamelink) { + $checkedstr = ' checked="checked"'; + } + $output .= '
'; + } + my $checkwin; + if ($env{'form.userwin'}) { + $checkwin = ' checked="checked"'; + } + $output .= '
'.$lt{'owin'}.'
'; } - $output .= "\n

\n". + $output .= "\n".'

'."\n". &Apache::loncommon::start_data_table(). &Apache::loncommon::start_data_table_header_row(); if ($mode eq 'autoenroll') { $output .= " - $lt{'type'} + $lt{'type'} "; } else { - $output .= "\n".''.&mt('Count').''."\n"; + if ($mode eq 'pickauthor') { + $output .= "\n".' '."\n"; + } else { + $output .= "\n".''.&mt('Count').''."\n"; + } if ($actionselect) { $output .= ''.&mt('Select').''."\n"; } } foreach my $item (@cols) { - $output .= "$lt{$item}\n"; + $output .= "$lt{$item}\n"; } my %role_types = &role_type_names(); if ($context eq 'course' && $mode ne 'autoenroll') { if ($env{'form.showrole'} eq 'st' || $env{'form.showrole'} eq 'Any') { # Clicker display on or off? - my %clicker_options = &Apache::lonlocal::texthash( - 'on' => 'Show', - 'off' => 'Hide', - ); + my %clicker_options = ( + 'on' => 'Show', + 'off' => 'Hide', + ); my $clickerchg = 'on'; if ($displayclickers eq 'on') { $clickerchg = 'off'; } - $output .= ' '."\n".' '. - ''. - $clicker_options{$clickerchg}.' '.$lt{'clicker'}."\n". - ' '."\n"; + $output .= ' '."\n".' ' + .&mt('[_1]'.$clicker_options{$clickerchg}.'[_2] clicker id' + ,'' + ,'') + ."\n".' '."\n"; # Photo display on or off? if ($env{'course.'.$env{'request.course.id'}.'.internal.showphoto'}) { @@ -2110,8 +2272,8 @@ END $photochg = 'off'; } $output .= ' '."\n".' '. - ''. + ''. $photo_options{$photochg}.' '.$lt{'photo'}."\n". ' '."\n"; } @@ -2127,18 +2289,20 @@ END time.'_'.rand(1000000000).'.csv'; unless ($CSVfile = Apache::File->new('>/home/httpd'.$CSVfilename)) { $r->log_error("Couldn't open $CSVfilename for output $!"); - $r->print("Problems occured in writing the csv file. ". - "This error has been logged. ". - "Please alert your LON-CAPA administrator."); + $r->print(&mt('Problems occurred in writing the CSV file. ' + .'This error has been logged. ' + .'Please alert your LON-CAPA administrator.')); $CSVfile = undef; } # + push @cols,'clicker'; # Write headers and data to file print $CSVfile '"'.$results_description.'"'."\n"; print $CSVfile '"'.join('","',map { &Apache::loncommon::csv_translate($lt{$_}) - } (@cols)).'"'."\n"; + } (@cols))."\"\n"; } elsif ($mode eq 'excel') { + push @cols,'clicker'; # Create the excel spreadsheet ($excel_workbook,$excel_filename,$format) = &Apache::loncommon::create_workbook($r); @@ -2147,20 +2311,40 @@ END $excel_sheet->write($row++,0,$results_description,$format->{'h2'}); # my @colnames = map {$lt{$_}} (@cols); + $excel_sheet->write($row++,0,\@colnames,$format->{'bold'}); } # Done with header lines in all formats - my %index; my $i; foreach my $idx (@$keylist) { $index{$idx} = $i++; } my $usercount = 0; + my ($secfilter,$grpfilter); + if ($context eq 'course') { + $secfilter = $env{'form.secfilter'}; + $grpfilter = $env{'form.grpfilter'}; + if ($secfilter eq '') { + $secfilter = 'all'; + } + if ($grpfilter eq '') { + $grpfilter = 'all'; + } + } + my %ltstatus = &Apache::lonlocal::texthash( + Active => 'Active', + Future => 'Future', + Expired => 'Expired', + ); # Get groups, role, permanent e-mail so we can sort on them if # necessary. foreach my $user (keys(%{$userlist})) { + if ($user eq '' ) { + delete($userlist->{$user}); + next; + } if ($context eq 'domain' && $user eq $env{'request.role.domain'}.'-domainconfig:'.$env{'request.role.domain'}) { delete($userlist->{$user}); next; @@ -2195,11 +2379,56 @@ END delete($userlist->{$user}); next; } - if (ref($classgroups) eq 'HASH') { - $groups = $classgroups->{$user}; - } - if (ref($groups->{active}) eq 'HASH') { - $userlist->{$user}->[$index{'groups'}] = join(', ',keys(%{$groups->{'active'}})); + if ($context eq 'course') { + my @ac_groups; + if (ref($classgroups) eq 'HASH') { + $groups = $classgroups->{$user}; + } + if (ref($groups->{'active'}) eq 'HASH') { + @ac_groups = keys(%{$groups->{'active'}}); + $userlist->{$user}->[$index{'groups'}] = join(', ',@ac_groups); + } + if ($mode ne 'autoenroll') { + my $section = $userlist->{$user}->[$index{'section'}]; + if (($env{'request.course.sec'} ne '') && + ($section ne $env{'request.course.sec'})) { + if ($role eq 'st') { + delete($userlist->{$user}); + next; + } + } + if ($secfilter eq 'none') { + if ($section ne '') { + delete($userlist->{$user}); + next; + } + } elsif ($secfilter ne 'all') { + if ($section ne $secfilter) { + delete($userlist->{$user}); + next; + } + } + if ($grpfilter eq 'none') { + if (@ac_groups > 0) { + delete($userlist->{$user}); + next; + } + } elsif ($grpfilter ne 'all') { + if (!grep(/^\Q$grpfilter\E$/,@ac_groups)) { + delete($userlist->{$user}); + next; + } + } + if ($env{'course.'.$env{'request.course.id'}.'.internal.showphoto'}) { + if (($displayphotos eq 'on') && ($role eq 'st')) { + $userlist->{$user}->[$index{'photo'}] = + &Apache::lonnet::retrievestudentphoto($udom,$uname,'jpg'); + $userlist->{$user}->[$index{'thumbnail'}] = + &Apache::lonnet::retrievestudentphoto($udom,$uname, + 'gif','thumbnail'); + } + } + } } my %emails = &Apache::loncommon::getemails($uname,$udom); if ($emails{'permanentemail'} =~ /\S/) { @@ -2239,7 +2468,10 @@ END foreach my $item (@{$keylist}) { $in{$item} = $sdata->[$index{$item}]; } - my $role = $in{'role'}; + my $clickers = (&Apache::lonnet::userenvironment($in{'domain'},$in{'username'},'clickers'))[1]; + if ($clickers!~/\w/) { $clickers='-'; } + $in{'clicker'} = $clickers; + my $role = $in{'role'}; $in{'role'}=&Apache::lonnet::plaintext($sdata->[$index{'role'}]); if (! defined($in{'start'}) || $in{'start'} == 0) { $in{'start'} = &mt('none'); @@ -2251,7 +2483,7 @@ END } else { $in{'end'} = &Apache::lonlocal::locallocaltime($in{'end'}); } - if ($mode eq 'view' || $mode eq 'html' || $mode eq 'autoenroll') { + if ($mode eq 'view' || $mode eq 'html' || $mode eq 'autoenroll' || $mode eq 'pickauthor') { $r->print(&Apache::loncommon::start_data_table_row()); my $checkval; if ($mode eq 'autoenroll') { @@ -2260,7 +2492,7 @@ END $cellentry = ''.&mt('auto').' '; $autocount ++; } else { - $cellentry = '
'.&mt('manual').'
'; + $cellentry = '
'.&mt('manual').'
'; $manualcount ++; if ($in{'lockedtype'}) { $cellentry .= ''; @@ -2269,12 +2501,13 @@ END $cellentry .= ''; $lockcount ++; } - $cellentry .= '
'; + $cellentry .= '
'; } $r->print("$cellentry\n"); } else { - $r->print("$rowcount\n"); - $checkval; + if ($mode ne 'pickauthor') { + $r->print("$rowcount\n"); + } if ($actionselect) { my $showcheckbox; if ($role =~ /^cr\//) { @@ -2304,18 +2537,25 @@ END } } $r->print(''); + 'actionlist" value="'.$checkval.'" />'); } else { $r->print(' '); } + } elsif ($mode eq 'pickauthor') { + $r->print(''); } } foreach my $item (@cols) { if ($item eq 'username') { - $r->print(''.&print_username_link($mode,$permission, - \%in).''); + $r->print(''.&print_username_link($mode,\%in).''); } elsif (($item eq 'start' || $item eq 'end') && ($actionselect)) { $r->print(''.$in{$item}.''."\n"); + } elsif ($item eq 'status') { + my $showitem = $in{$item}; + if (defined($ltstatus{$in{$item}})) { + $showitem = $ltstatus{$in{$item}}; + } + $r->print(''.$showitem.''."\n"); } else { $r->print(''.$in{$item}.''."\n"); } @@ -2331,11 +2571,8 @@ END $r->print('   '); } if ($env{'course.'.$env{'request.course.id'}.'.internal.showphoto'}) { - if ($displayphotos eq 'on' && $sdata->[$index{'role'}] eq 'st') { - my $imgurl = - &Apache::lonnet::retrievestudentphoto($in{'domain'},$in{'username'}, - 'gif','thumbnail'); - $r->print(' '); + if ($displayphotos eq 'on' && $role eq 'st' && $in{'photo'} ne '') { + $r->print(' '); } else { $r->print('   '); } @@ -2360,7 +2597,7 @@ END foreach my $item (@cols) { push @line,&Apache::loncommon::csv_translate($in{$item}); } - print $CSVfile '"'.join('","',@line).'"'."\n"; + print $CSVfile '"'.join('","',@line)."\"\n"; } elsif ($mode eq 'excel') { my $col = 0; foreach my $item (@cols) { @@ -2379,17 +2616,14 @@ END $row++; } } - if ($mode eq 'view' || $mode eq 'html' || $mode eq 'autoenroll') { + if ($mode eq 'view' || $mode eq 'html' || $mode eq 'autoenroll' || $mode eq 'pickauthor') { $r->print(&Apache::loncommon::end_data_table().'
'); } elsif ($mode eq 'excel') { $excel_workbook->close(); - $r->print('

'. - &mt('Your Excel spreadsheet').' '.&mt('is ready for download').'.

'."\n"); + $r->print(&mt('[_1]Your Excel spreadsheet[_2] is ready for download.', '

','')."

\n"); } elsif ($mode eq 'csv') { close($CSVfile); - $r->print(''. - &mt('Your CSV file').' is ready for download.'. - "\n"); + $r->print(&mt('[_1]Your CSV file[_2] is ready for download.', '

','')."

\n"); $r->rflush(); } if ($mode eq 'autoenroll') { @@ -2399,15 +2633,130 @@ END } } +sub bulkaction_javascript { + my ($formname,$caller) = @_; + my $docstart = 'document'; + if ($caller eq 'popup') { + $docstart = 'opener.document'; + } + my %lt = &Apache::lonlocal::texthash( + acwi => 'Access will be set to start immediately', + asyo => 'as you did not select an end date in the pop-up window', + accw => 'Access will be set to continue indefinitely', + asyd => 'as you did not select an end date in the pop-up window', + sewi => "Sections will be switched to 'No section'", + ayes => "as you either selected the 'No section' option", + oryo => 'or you did not select a section in the pop-up window', + arol => 'A role with no section will be added', + swbs => 'Sections will be switched to:', + rwba => 'Roles will be added for section(s):', + ); + my $alert = &mt("You must select at least one user by checking a user's 'Select' checkbox"); + my $noaction = &mt("You need to select an action to take for the user(s) you have selected"); + my $singconfirm = &mt(' for a single user?'); + my $multconfirm = &mt(' for multiple users?'); + my $output = <<"ENDJS"; +function verify_action (field) { + var numchecked = 0; + var singconf = '$singconfirm'; + var multconf = '$multconfirm'; + if ($docstart.$formname.elements[field].length > 0) { + for (i=0; i<$docstart.$formname.elements[field].length; i++) { + if ($docstart.$formname.elements[field][i].checked == true) { + numchecked ++; + } + } + } else { + if ($docstart.$formname.elements[field].checked == true) { + numchecked ++; + } + } + if (numchecked == 0) { + alert("$alert"); + return; + } else { + var message = $docstart.$formname.bulkaction[$docstart.$formname.bulkaction.selectedIndex].text; + var choice = $docstart.$formname.bulkaction[$docstart.$formname.bulkaction.selectedIndex].value; + if (choice == '') { + alert("$noaction"); + return; + } else { + if (numchecked == 1) { + message += singconf; + } else { + message += multconf; + } +ENDJS + if ($caller ne 'popup') { + $output .= <<"NEWWIN"; + if (choice == 'chgdates' || choice == 'reenable' || choice == 'activate' || choice == 'chgsec') { + opendatebrowser(document.$formname,'$formname','go'); + return; + + } else { + if (confirm(message)) { + document.$formname.phase.value = 'bulkchange'; + document.$formname.submit(); + return; + } + } +NEWWIN + } else { + $output .= <<"POPUP"; + if (choice == 'chgdates' || choice == 'reenable' || choice == 'activate') { + var datemsg = ''; + if (($docstart.$formname.startdate_month.value == '') && + ($docstart.$formname.startdate_day.value == '') && + ($docstart.$formname.startdate_year.value == '')) { + datemsg = "\\n$lt{'acwi'},\\n$lt{'asyo'}.\\n"; + } + if (($docstart.$formname.enddate_month.value == '') && + ($docstart.$formname.enddate_day.value == '') && + ($docstart.$formname.enddate_year.value == '')) { + datemsg += "\\n$lt{'accw'},\\n$lt{'asyd'}.\\n"; + } + if (datemsg != '') { + message += "\\n"+datemsg; + } + } + if (choice == 'chgsec') { + var rolefilter = $docstart.$formname.showrole.options[$docstart.$formname.showrole.selectedIndex].value; + var retained = $docstart.$formname.retainsec.value; + var secshow = $docstart.$formname.newsecs.value; + if (secshow == '') { + if (rolefilter == 'st' || retained == 0 || retained == "") { + message += "\\n\\n$lt{'sewi'},\\n$lt{'ayes'},\\n$lt{'oryo'}.\\n"; + } else { + message += "\\n\\n$lt{'arol'}\\n$lt{'ayes'},\\n$lt{'oryo'}.\\n"; + } + } else { + if (rolefilter == 'st' || retained == 0 || retained == "") { + message += "\\n\\n$lt{'swbs'} "+secshow+".\\n"; + } else { + message += "\\n\\n$lt{'rwba'} "+secshow+".\\n"; + } + } + } + if (confirm(message)) { + $docstart.$formname.phase.value = 'bulkchange'; + $docstart.$formname.submit(); + window.close(); + } +POPUP + } + $output .= ' + } + } +} +'; + return $output; +} + sub print_username_link { - my ($mode,$permission,$in) = @_; + my ($mode,$in) = @_; my $output; if ($mode eq 'autoenroll') { $output = $in->{'username'}; - } elsif (!$permission->{'cusr'}) { - $output = &Apache::loncommon::aboutmewrapper($in->{'username'}, - $in->{'username'}, - $in->{'domain'}); } else { $output = '{'username'}','$in->{'domain'}'".')" />'. @@ -2426,7 +2775,7 @@ sub role_type_names { } sub select_actions { - my ($context,$setting,$statusmode) = @_; + my ($context,$setting,$statusmode,$formname) = @_; my %lt = &Apache::lonlocal::texthash( revoke => "Revoke user roles", delete => "Delete user roles", @@ -2487,7 +2836,7 @@ sub select_actions { } } if ($options) { - $output = ''."\n". ''."\n".$options."\n".''; if ($choices{'dates'}) { @@ -2503,7 +2852,8 @@ sub select_actions { ''."\n". ''."\n". ''."\n". - ''."\n"; + ''."\n". + ''."\n"; if ($context eq 'course') { $output .= ''."\n"; } @@ -2518,21 +2868,17 @@ sub select_actions { sub date_section_javascript { my ($context,$setting) = @_; - my $title; - if (($context eq 'course') || ($context eq 'domain' && $setting eq 'course')) { - $title = &mt('Date and Section selector'); - } else { - $title = &mt('Date selector'); - } + my $title = 'Date_And_Section_Selector'; + my %nopopup = &Apache::lonlocal::texthash ( + revoke => "Check the boxes for any users for whom roles are to be revoked, and click 'Proceed'", + delete => "Check the boxes for any users for whom roles are to be deleted, and click 'Proceed'", + none => "Choose an action to take for selected users", + ); my $output = ' - -'; +ENDJS my %lt = &Apache::lonlocal::texthash ( chac => 'Access dates to apply for selected users', chse => 'Changes in section affiliation to apply to selected users', @@ -2677,7 +3038,6 @@ END $output .= $info.$secbox; } $output .= '

'. -&mt('Use "Save" to update the main window with your selections.').'

'. '

'."\n". ''; return $output; @@ -2691,7 +3051,7 @@ sub section_picker { if ($mode eq 'upload') { my ($options,$cb_script,$coursepick) = &default_role_selector($context,1); - $secbox .= &Apache::lonhtmlcommon::row_title('role','LC_oddrow_value'). + $secbox .= &Apache::lonhtmlcommon::row_title(&mt('role'),'LC_oddrow_value'). $options. &Apache::lonhtmlcommon::row_closure(1)."\n"; } $secbox .= &Apache::lonhtmlcommon::row_title($rowtitle,'LC_oddrow_value')."\n"; @@ -2721,7 +3081,7 @@ sub results_header_row { } if ($context eq 'course') { if ($mode eq 'csv' || $mode eq 'excel') { - $description = &mt('Course - ').$env{'course.'.$env{'request.course.id'}.'.description'}.': '; + $description = &mt('Course - [_1]:',$env{'course.'.$env{'request.course.id'}.'.description'}).' '; } if ($statusmode eq 'Expired') { $description .= &mt('Users in course with expired [_1] roles',$showfilter); @@ -2736,18 +3096,55 @@ sub results_header_row { $description .= &mt('All users in course with [_1] roles',$rolefilter); } } + my $constraint; my $viewablesec = &viewable_section($permission); if ($viewablesec ne '') { if ($env{'form.showrole'} eq 'st') { - $description .= ' '.&mt('(section [_1] only)',$viewablesec); + $constraint = &mt('only users in section "[_1]"',$viewablesec); } elsif ($env{'form.showrole'} ne 'cc') { - $description .= ' '.&mt('(only users affiliated with no section or section [_1])',$viewablesec); + $constraint = &mt('only users affiliated with no section or section "[_1]"',$viewablesec); + } + if (($env{'form.grpfilter'} ne 'all') && ($env{'form.grpfilter'} ne '')) { + if ($env{'form.grpfilter'} eq 'none') { + $constraint .= &mt(' and not in any group'); + } else { + $constraint .= &mt(' and members of group: "[_1]"',$env{'form.grpfilter'}); + } + } + } else { + if (($env{'form.secfilter'} ne 'all') && ($env{'form.secfilter'} ne '')) { + if ($env{'form.secfilter'} eq 'none') { + $constraint = &mt('only users affiliated with no section'); + } else { + $constraint = &mt('only users affiliated with section "[_1]"',$env{'form.secfilter'}); + } + } + if (($env{'form.grpfilter'} ne 'all') && ($env{'form.grpfilter'} ne '')) { + if ($env{'form.grpfilter'} eq 'none') { + if ($constraint eq '') { + $constraint = &mt('only users not in any group'); + } else { + $constraint .= &mt(' and also not in any group'); + } + } else { + if ($constraint eq '') { + $constraint = &mt('only members of group: "[_1]"',$env{'form.grpfilter'}); + } else { + $constraint .= &mt(' and also members of group: "[_1]"'.$env{'form.grpfilter'}); + } + } } } + if ($constraint ne '') { + $description .= ' ('.$constraint.')'; + } } elsif ($context eq 'author') { $description = - &mt('Author space for [_1]', - &Apache::loncommon::plainname($env{'user.name'},$env{'user.domain'})).':  '; + &mt('Author space for [_1]' + ,'' + .&Apache::loncommon::plainname($env{'user.name'},$env{'user.domain'}) + .'') + .':  '; if ($statusmode eq 'Expired') { $description .= &mt('Co-authors with expired [_1] roles',$showfilter); } elsif ($statusmode eq 'Future') { @@ -2763,7 +3160,7 @@ sub results_header_row { } } elsif ($context eq 'domain') { my $domdesc = &Apache::lonnet::domain($env{'request.role.domain'},'description'); - $description = &mt('Domain - ').$domdesc.': '; + $description = &mt('Domain - [_1]:',$domdesc).' '; if ($env{'form.roletype'} eq 'domain') { if ($statusmode eq 'Expired') { $description .= &mt('Users in domain with expired [_1] roles',$showfilter); @@ -2862,7 +3259,7 @@ sub show_drop_list { $check_uncheck_js

- + END my ($indexhash,$keylist) = &make_keylist_array(); my $studentcount = 0; @@ -2980,7 +3377,7 @@ END # $r->print(&Apache::loncommon::start_data_table_row()); $r->print(<<"END"); - + $username $domain $id @@ -2999,10 +3396,14 @@ END 'ua' => "uncheck all", ); $r->print(<<"END"); -

-   - -

+

+

+   + +

+

+ +

END return; } @@ -3013,22 +3414,26 @@ END sub print_first_users_upload_form { my ($r,$context) = @_; my $str; - $str = ''; + $str = ''; $str .= ''; $str .= ''; - $str .= "

".&mt('Upload a file containing information about users')."

\n"; + $str .= '

'.&mt('Upload a file containing information about users').'

'."\n"; + $str .= '

' + .&mt('Please upload an UTF8 encoded file to ensure a correct character encoding in your classlist.') + .'

'."\n"; $str .= &Apache::loncommon::upfile_select_html(); - $str .= "

\n"; - $str .= ''."\n"; - $str .= '

\n"; + $str .= '

'; $str .= &Apache::loncommon::help_open_topic("Course_Create_Class_List", &mt("How do I create a users list from a spreadsheet")). "
\n"; $str .= &Apache::loncommon::help_open_topic("Course_Convert_To_CSV", - &mt("How do I create a CSV file from a spreadsheet")). - "
\n"; + &mt("How do I create a CSV file from a spreadsheet")); + $str .= "

\n"; + $str .= "

\n"; + $str .= '

\n"; + $str .= ''."
\n"; $str .= &Apache::loncommon::end_page(); $r->print($str); return; @@ -3058,7 +3463,7 @@ sub upfile_drop_add { # # Store the field choices away foreach my $field (qw/username names - fname mname lname gen id sec ipwd email role/) { + fname mname lname gen id sec ipwd email role domain/) { $env{'form.'.$field.'_choice'}=$fields{$field}; } &Apache::loncommon::store_course_settings('enrollment_upload', @@ -3072,19 +3477,27 @@ sub upfile_drop_add { 'sec_choice' => 'scalar', 'ipwd_choice' => 'scalar', 'email_choice' => 'scalar', - 'role_choice' => 'scalar' }); + 'role_choice' => 'scalar', + 'domain_choice' => 'scalar', + 'inststatus_choice' => 'scalar'}); # my ($startdate,$enddate) = &get_dates_from_form(); if ($env{'form.makedatesdefault'}) { $r->print(&make_dates_default($startdate,$enddate,$context)); } # Determine domain and desired host (home server) - my $domain=$env{'request.role.domain'}; + my $defdom=$env{'request.role.domain'}; + my $domain; + if ($env{'form.defaultdomain'} ne '') { + $domain = $env{'form.defaultdomain'}; + } else { + $domain = $defdom; + } my $desiredhost = $env{'form.lcserver'}; if (lc($desiredhost) eq 'default') { $desiredhost = undef; } else { - my %home_servers = &Apache::lonnet::get_servers($domain,'library'); + my %home_servers = &Apache::lonnet::get_servers($defdom,'library'); if (! exists($home_servers{$desiredhost})) { $r->print(''.&mt('Error'). &mt('Invalid home server specified').''); @@ -3149,6 +3562,7 @@ sub upfile_drop_add { 'permanentemail','id'); my %canmodify; if (&Apache::lonnet::allowed('mau',$domain)) { + push(@userinfo,'inststatus'); foreach my $field (@userinfo) { $canmodify{$field} = 1; } @@ -3169,7 +3583,9 @@ sub upfile_drop_add { if ($context eq 'course') { my ($cnum,$cdom) = &get_course_identity(); my $roster = &Apache::loncoursedata::get_classlist(); - %userlist = %{$roster}; + if (ref($roster) eq 'HASH') { + %userlist = %{$roster}; + } my %advrolehash = &Apache::lonnet::get_my_roles($cnum,$cdom,undef, \@statuses,\@poss_roles); &gather_userinfo($context,'view',\%userlist,$indexhash,\%info, @@ -3195,6 +3611,8 @@ sub upfile_drop_add { } else { $r->print('

'.&mt('Adding/Modifying Users')."

\n

\n"); } + $r->rflush; + my %counts = ( user => 0, auth => 0, @@ -3202,7 +3620,7 @@ sub upfile_drop_add { ); my $flushc=0; my %student=(); - my (%curr_groups,@sections,@cleansec,@secs,$defaultwarn,$groupwarn); + my (%curr_groups,@sections,@cleansec,$defaultwarn,$groupwarn); my %userchg; if ($context eq 'course' || $setting eq 'course') { if ($context eq 'course') { @@ -3241,10 +3659,10 @@ sub upfile_drop_add { } my (%curr_rules,%got_rules,%alerts); my %customroles = &my_custom_roles(); - my ($custom_ok,@permitted_roles) = - &roles_on_upload($context,%customroles); + my @permitted_roles = &roles_on_upload($context,$setting,%customroles); # Get new users list foreach my $line (@userdata) { + my @secs; my %entries=&Apache::loncommon::record_sep($line); # Determine user name unless (($entries{$fields{'username'}} eq '') || @@ -3270,21 +3688,30 @@ sub upfile_drop_add { if ($entries{$fields{'username'}} ne &LONCAPA::clean_username($entries{$fields{'username'}})) { $r->print('
'. - &mt('[_1]: Unacceptable username for user [_2] [_3] [_4] [_5]', - $entries{$fields{'username'}},$fname,$mname,$lname,$gen). - ''); + &mt('[_1]: Unacceptable username for user [_2] [_3] [_4] [_5]', + ''.$entries{$fields{'username'}}.'',$fname,$mname,$lname,$gen)); next; } else { + if ($entries{$fields{'domain'}} + ne &LONCAPA::clean_domain($entries{$fields{'domain'}})) { + $r->print('
'. ''.$entries{$fields{'domain'}}. + ': '.&mt('Unacceptable domain for user [_2] [_3] [_4] [_5]',$fname,$mname,$lname,$gen)); + next; + } my $username = $entries{$fields{'username'}}; + my $userdomain = $entries{$fields{'domain'}}; + if ($userdomain eq '') { + $userdomain = $domain; + } if (defined($fields{'sec'})) { if (defined($entries{$fields{'sec'}})) { + $entries{$fields{'sec'}} =~ s/\W//g; my $item = $entries{$fields{'sec'}}; - $item =~ s/(\s+$|^\s+)//g; if ($item eq "none" || $item eq 'all') { - $r->print('
'.&mt('[_1]: Unable to enroll user [_2] [_3] [_4] [_5] in a section named "[_6]" - this is a reserved word.',$username,$fname,$mname,$lname,$gen,$item)); + $r->print('
'.&mt('[_1]: Unable to enroll user [_2] [_3] [_4] [_5] in a section named "[_6]" - this is a reserved word.',''.$username.'',$fname,$mname,$lname,$gen,$item)); next; } elsif (exists($curr_groups{$item})) { - $r->print('
'.&mt('[_1]: Unable to enroll user [_2] [_3] [_4] [_5] in a section named "[_6]" - this is a course group.',$username,$fname,$mname,$lname,$gen,$item).' '.&mt('Section names and group names must be distinct.')); + $r->print('
'.&mt('[_1]: Unable to enroll user [_2] [_3] [_4] [_5] in a section named "[_6]" - this is a course group.',''.$username.'',$fname,$mname,$lname,$gen,$item).' '.&mt('Section names and group names must be distinct.')); next; } else { push(@secs,$item); @@ -3293,10 +3720,10 @@ sub upfile_drop_add { } if ($env{'request.course.sec'} ne '') { @secs = ($env{'request.course.sec'}); - if (ref($userlist{$username.':'.$domain}) eq 'ARRAY') { - my $currsec = $userlist{$username.':'.$domain}[$secidx]; + if (ref($userlist{$username.':'.$userdomain}) eq 'ARRAY') { + my $currsec = $userlist{$username.':'.$userdomain}[$secidx]; if ($currsec ne $env{'request.course.sec'}) { - $r->print('
'.&mt('[_1]: Unable to enroll user [_2] [_3] [_4] [_5] in a section named "[_6]".',$username,$fname,$mname,$lname,$gen,$secs[0]).'
'); + $r->print('
'.&mt('[_1]: Unable to enroll user [_2] [_3] [_4] [_5] in a section named "[_6]".',''.$username.'',$fname,$mname,$lname,$gen,$secs[0]).'
'); if ($currsec eq '') { $r->print(&mt('This user already has an active/future student role in the course, unaffiliated to any section.')); @@ -3325,7 +3752,15 @@ sub upfile_drop_add { if (defined($fields{'email'})) { if (defined($entries{$fields{'email'}})) { $email=$entries{$fields{'email'}}; - unless ($email=~/^[^\@]+\@[^\@]+$/) { $email=''; } } + unless ($email=~/^[^\@]+\@[^\@]+$/) { $email=''; } + } + } + # determine affiliation + my $inststatus=''; + if (defined($fields{'inststatus'})) { + if (defined($entries{$fields{'inststatus'}})) { + $inststatus=$entries{$fields{'inststatus'}}; + } } # determine user password my $password = $genpwd; @@ -3338,19 +3773,21 @@ sub upfile_drop_add { my $role = ''; if (defined($fields{'role'})) { if ($entries{$fields{'role'}}) { - if (grep(/^\Q$entries{$fields{'role'}}\E$/,@permitted_roles)) { - $role=$entries{$fields{'role'}}; - $role =~ s/(\s+$|^\s+)//g; - } - if ($custom_ok) { - if ($customroles{$role}) { - $role = 'cr_'.$env{'user.domain'}.'_'.$env{'user.name'}.'_'.$entries{$fields{'role'}}; + $entries{$fields{'role'}} =~ s/(\s+$|^\s+)//g; + if ($entries{$fields{'role'}} ne '') { + if (grep(/^\Q$entries{$fields{'role'}}\E$/,@permitted_roles)) { + $role = $entries{$fields{'role'}}; } } if ($role eq '') { my $rolestr = join(', ',@permitted_roles); - $r->print('
'. - &mt('[_1]: You do not have permission to add the requested role [_2] for the user.',$entries{$fields{'username'}},$entries{$fields{'role'}}).'
'.&mt('Allowable role(s) is/are: [_1].',$rolestr)."\n"); + $r->print('
' + .&mt('[_1]: You do not have permission to add the requested role [_2] for the user.' + ,''.$entries{$fields{'username'}}.'' + ,$entries{$fields{'role'}}) + .'
' + .&mt('Allowable role(s) is/are: [_1].',$rolestr)."\n" + ); next; } } @@ -3359,16 +3796,16 @@ sub upfile_drop_add { $role = $defaultrole; } # Clean up whitespace - foreach (\$domain,\$username,\$id,\$fname,\$mname, - \$lname,\$gen) { + foreach (\$id,\$fname,\$mname,\$lname,\$gen) { $$_ =~ s/(\s+$|^\s+)//g; } # check against rules my $checkid = 0; my $newuser = 0; my (%rulematch,%inst_results,%idinst_results); - my $uhome=&Apache::lonnet::homeserver($username,$domain); + my $uhome=&Apache::lonnet::homeserver($username,$userdomain); if ($uhome eq 'no_host') { + next if ($userdomain ne $domain); $checkid = 1; $newuser = 1; my $checkhash; @@ -3384,38 +3821,40 @@ sub upfile_drop_add { } } else { if ($context eq 'course' || $context eq 'author') { - if ($role eq '') { - my @checkroles; - foreach my $role (@poss_roles) { - my $endkey; - if ($role ne 'st') { - $endkey = ':'.$role; - } - if (exists($userlist{$username.':'.$domain.$endkey})) { - if (!grep(/^\Q$role\E$/,@checkroles)) { - push(@checkroles,$role); + if ($userdomain eq $domain ) { + if ($role eq '') { + my @checkroles; + foreach my $role (@poss_roles) { + my $endkey; + if ($role ne 'st') { + $endkey = ':'.$role; + } + if (exists($userlist{$username.':'.$userdomain.$endkey})) { + if (!grep(/^\Q$role\E$/,@checkroles)) { + push(@checkroles,$role); + } } } + if (@checkroles > 0) { + %canmodify = &can_modify_userinfo($context,$domain,\@userinfo,\@checkroles); + } + } elsif (ref($modifiable_fields{$role}) eq 'HASH') { + %canmodify = %{$modifiable_fields{$role}}; } - if (@checkroles > 0) { - %canmodify = &can_modify_userinfo($context,$domain,\@userinfo,\@checkroles); - } - } elsif (ref($modifiable_fields{$role}) eq 'HASH') { - %canmodify = %{$modifiable_fields{$role}}; } - } - my @newinfo = (\$fname,\$mname,\$lname,\$gen,\$email,\$id); - for (my $i=0; $i<@userinfo; $i++) { - if (${$newinfo[$i]} ne '') { - if (!$canmodify{$userinfo[$i]}) { - ${$newinfo[$i]} = ''; + my @newinfo = (\$fname,\$mname,\$lname,\$gen,\$email,\$id); + for (my $i=0; $i<@newinfo; $i++) { + if (${$newinfo[$i]} ne '') { + if (!$canmodify{$userinfo[$i]}) { + ${$newinfo[$i]} = ''; + } } } } } if ($id ne '') { if (!$newuser) { - my %idhash = &Apache::lonnet::idrget($domain,($username)); + my %idhash = &Apache::lonnet::idrget($userdomain,($username)); if ($idhash{$username} ne $id) { $checkid = 1; } @@ -3423,14 +3862,14 @@ sub upfile_drop_add { if ($checkid) { my $checkhash; my $checks = { 'id' => 1 }; - $checkhash->{$username.':'.$domain} = { 'newuser' => $newuser, + $checkhash->{$username.':'.$userdomain} = { 'newuser' => $newuser, 'id' => $id }; &Apache::loncommon::user_rule_check($checkhash,$checks, \%alerts,\%rulematch,\%idinst_results,\%curr_rules, \%got_rules); if (ref($alerts{'id'}) eq 'HASH') { - if (ref($alerts{'id'}{$domain}) eq 'HASH') { - next if ($alerts{'id'}{$domain}{$id}); + if (ref($alerts{'id'}{$userdomain}) eq 'HASH') { + next if ($alerts{'id'}{$userdomain}{$id}); } } } @@ -3439,82 +3878,85 @@ sub upfile_drop_add { my $multiple = 0; my ($userresult,$authresult,$roleresult,$idresult); my (%userres,%authres,%roleres,%idres); + my $singlesec = ''; if ($role eq 'st') { my $sec; - if ($cid) { - if (@secs > 0) { - $sec = $secs[0]; - } - &modifystudent($domain,$username,$cid,$sec, - $desiredhost); - $roleresult = - &Apache::lonnet::modifystudent - ($domain,$username,$id,$amode,$password, - $fname,$mname,$lname,$gen,$sec,$enddate, - $startdate,$env{'form.forceid'}, - $desiredhost,$email,'manual','',$cid); - $userresult = $roleresult; + if (@secs > 0) { + $sec = $secs[0]; } + &modifystudent($userdomain,$username,$cid,$sec, + $desiredhost,$context); + $roleresult = + &Apache::lonnet::modifystudent + ($userdomain,$username,$id,$amode,$password, + $fname,$mname,$lname,$gen,$sec,$enddate, + $startdate,$env{'form.forceid'}, + $desiredhost,$email,'manual','',$cid, + '',$context,$inststatus); + $userresult = $roleresult; } else { - if (($context eq 'course') || - (grep(/^\Q$role\E$/,@courseroles))) { - if (!$cid) { - next; - } - } - my $singlesec; - if ((grep(/^\Q$role\E$/,@courseroles)) && ($role ne 'cc')) { - if (@secs > 1) { - $multiple = 1; - foreach my $sec (@secs) { - ($userres{$sec},$authres{$sec},$roleres{$sec},$idres{$sec}) = - &modifyuserrole($context,$setting, - $changeauth,$cid,$domain,$username, - $id,$amode,$password,$fname, - $mname,$lname,$gen,$sec, - $env{'form.forceid'},$desiredhost, - $email,$role,$enddate,$startdate,$checkid); + if ($role ne '') { + if ($context eq 'course' || $setting eq 'course') { + if ($customroles{$role}) { + $role = 'cr_'.$env{'user.domain'}.'_'. + $env{'user.name'}.'_'.$role; + } + if ($role ne 'cc') { + if (@secs > 1) { + $multiple = 1; + foreach my $sec (@secs) { + ($userres{$sec},$authres{$sec},$roleres{$sec},$idres{$sec}) = + &modifyuserrole($context,$setting, + $changeauth,$cid,$userdomain,$username, + $id,$amode,$password,$fname, + $mname,$lname,$gen,$sec, + $env{'form.forceid'},$desiredhost, + $email,$role,$enddate, + $startdate,$checkid,$inststatus); + } + } elsif (@secs > 0) { + $singlesec = $secs[0]; + } } - } elsif (@secs > 0) { - $singlesec = $secs[0]; } } if (!$multiple) { ($userresult,$authresult,$roleresult,$idresult) = &modifyuserrole($context,$setting, - $changeauth,$cid,$domain,$username, - $id,$amode,$password,$fname, - $mname,$lname,$gen,$singlesec, - $env{'form.forceid'},$desiredhost, - $email,$role,$enddate,$startdate,$checkid); + $changeauth,$cid,$userdomain,$username, + $id,$amode,$password,$fname, + $mname,$lname,$gen,$singlesec, + $env{'form.forceid'},$desiredhost, + $email,$role,$enddate,$startdate, + $checkid,$inststatus); } } if ($multiple) { foreach my $sec (sort(keys(%userres))) { - $flushc = + $flushc = &user_change_result($r,$userres{$sec},$authres{$sec}, $roleres{$sec},$idres{$sec},\%counts,$flushc, - $username,\%userchg); + $username,$userdomain,\%userchg); } } else { $flushc = &user_change_result($r,$userresult,$authresult, $roleresult,$idresult,\%counts,$flushc, - $username,\%userchg); + $username,$userdomain,\%userchg); } } else { if ($context eq 'course') { $r->print('
'. - &mt('[_1]: Unable to enroll. No password specified.',$username) + &mt('[_1]: Unable to enroll. No password specified.',''.$username.'') ); } elsif ($context eq 'author') { $r->print('
'. - &mt('[_1]: Unable to add co-author. No password specified.',$username) + &mt('[_1]: Unable to add co-author. No password specified.',''.$username.'') ); } else { $r->print('
'. - &mt('[_1]: Unable to add user. No password specified.',$username) + &mt('[_1]: Unable to add user. No password specified.',''.$username.'') ); } } @@ -3549,7 +3991,7 @@ sub upfile_drop_add { ''. &mt('There are no students with current/future access to the course.'). ''."\n"); - } else { + } elsif (ref($classlist) eq 'HASH') { # Remove the students we just added from the list of students. foreach my $line (@userdata) { my %entries=&Apache::loncommon::record_sep($line); @@ -3611,13 +4053,13 @@ sub print_namespacing_alerts { sub user_change_result { my ($r,$userresult,$authresult,$roleresult,$idresult,$counts,$flushc, - $username,$userchg) = @_; + $username,$userdomain,$userchg) = @_; my $okresult = 0; if ($userresult ne 'ok') { if ($userresult =~ /^error:(.+)$/) { my $error = $1; $r->print('
'. - &mt('[_1]: Unable to add/modify: [_2]',$username,$error)); + &mt('[_1]: Unable to add/modify: [_2]',''.$username.':'.$userdomain.'',$error)); } } else { $counts->{'user'} ++; @@ -3627,7 +4069,7 @@ sub user_change_result { if ($authresult =~ /^error:(.+)$/) { my $error = $1; $r->print('
'. - &mt('[_1]: Unable to modify authentication: [_2]',$username,$error)); + &mt('[_1]: Unable to modify authentication: [_2]',''.$username.':'.$userdomain.'',$error)); } } else { $counts->{'auth'} ++; @@ -3637,7 +4079,7 @@ sub user_change_result { if ($roleresult =~ /^error:(.+)$/) { my $error = $1; $r->print('
'. - &mt('[_1]: Unable to add role: [_2]',$username,$error)); + &mt('[_1]: Unable to add role: [_2]',''.$username.':'.$userdomain.'',$error)); } } else { $counts->{'role'} ++; @@ -3645,7 +4087,7 @@ sub user_change_result { } if ($okresult) { $flushc++; - $userchg->{$username}=1; + $userchg->{$username.':'.$userdomain}=1; $r->print('. '); if ($flushc>15) { $r->rflush; @@ -3757,24 +4199,25 @@ sub update_user_list { $end = $now; $type = 'manual'; $result = - &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$sec,$end,$start,$type,$locktype,$cid); + &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$sec,$end,$start,$type,$locktype,$cid,'',$context); } elsif ($choice eq 'revoke') { # revoke or delete user role $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); + &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$sec,$end,$start,$type,$locktype,$cid,'',$context); } else { $result = - &Apache::lonnet::revokerole($udom,$uname,$scope,$role); + &Apache::lonnet::revokerole($udom,$uname,$scope,$role, + '','',$context); } } 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); + &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$sec,$now,$start,$type,$locktype,$cid,'',$context); } $result = &Apache::lonnet::assignrole($udom,$uname,$scope,$role,$now, - $start,1); + $start,1,'',$context); } else { #reenable, activate, change access dates or change section if ($choice ne 'chgsec') { @@ -3783,25 +4226,25 @@ 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); + $result = &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$sec,$end,$start,$type,$locktype,$cid,'',$context); } else { $result = &Apache::lonnet::assignrole($udom,$uname,$scope,$role,$end, - $now); + $now,'','',$context); } } 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); + $result = &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$sec,$end,$start,$type,$locktype,$cid,'',$context); } else { $result = &Apache::lonnet::assignrole($udom,$uname,$scope,$role,$end, - $now); + $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); + $result = &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$sec,$end,$start,$type,$locktype,$cid,'',$context); } else { $result = &Apache::lonnet::assignrole($udom,$uname,$scope,$role,$end, - $start); + $start,'','',$context); } } elsif ($choice eq 'chgsec') { my (@newsecs,$revresult,$nochg,@retained); @@ -3814,7 +4257,12 @@ sub update_user_list { if (@newsecs == 0) { $result = &mt('No change in section assignment (none)'); $nochg = 1; - } + } else { + $revresult = + &Apache::lonnet::revokerole($udom,$uname, + $scope,$role, + '','',$context); + } } else { if (@newsecs > 0) { if (grep(/^\Q$sec\E$/,@newsecs)) { @@ -3822,12 +4270,14 @@ sub update_user_list { } else { $revresult = &Apache::lonnet::revokerole($udom,$uname, - $scope,$role); + $scope,$role, + '','',$context); } } else { $revresult = &Apache::lonnet::revokerole($udom,$uname, - $scope,$role); + $scope,$role, + '','',$context); } } } else { @@ -3842,17 +4292,17 @@ sub update_user_list { if (!$nochg) { if ($role eq 'st') { $result = - &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,undef,$end,$start,$type,$locktype,$cid); + &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,undef,$end,$start,$type,$locktype,$cid,'',$context); } else { my $newscope = $scopestem; - $result = &Apache::lonnet::assignrole($udom,$uname,$newscope,$role,$end,$start); + $result = &Apache::lonnet::assignrole($udom,$uname,$newscope,$role,$end,$start,'','',$context); } } } else { 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); + $result = &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$newsec,$end,$start,$type,$locktype,$cid,'',$context); } else { my $newscope = $scopestem; if ($newsec ne '') { @@ -3883,10 +4333,23 @@ sub update_user_list { $plrole,$extent,$uname.':'.$udom,$result).'
'); } } + $r->print('

'."\n"); + if ($choice eq 'drop') { + $r->print(''."\n". + ''."\n". + ''."\n"); + } else { + foreach my $item ('action','sortby','roletype','showrole','Status','secfilter','grpfilter') { + if ($env{'form.'.$item} ne '') { + $r->print(''."\n"); + } + } + } $r->print('

'.&mt("$result_text{'ok'}{$choice} role(s) for [quant,_1,user,users,no users].",$count).'

'); if ($count > 0) { if ($choice eq 'revoke' || $choice eq 'drop') { - $r->print('

'.&mt('Re-enabling will re-activate data for the role.

')); + $r->print('

'.&mt('Re-enabling will re-activate data for the role.').'

'); } # Flush the course logs so reverse user roles immediately updated &Apache::lonnet::flushcourselogs(); @@ -3896,17 +4359,20 @@ sub update_user_list { $r->print(&make_dates_default($startdate,$enddate,$context)); } } + my $linktext = &mt('Display User Lists'); + if ($choice eq 'drop') { + $linktext = &mt('Display current class roster'); + } + $r->print('
'.$linktext.'
'."\n"); } sub classlist_drop { my ($scope,$uname,$udom,$now) = @_; my ($cdom,$cnum) = ($scope=~m{^/($match_domain)/($match_courseid)}); if (&Apache::lonnet::is_course($cdom,$cnum)) { - my $user = $uname.':'.$udom; if (!&active_student_roles($cnum,$cdom,$uname,$udom)) { - my $result = - &Apache::lonnet::cput('classlist', - { $user => $now },$cdom,$cnum); + my %user; + my $result = &update_classlist($cdom,$cnum,$udom,$uname,\%user,$now); return &mt('Drop from classlist: [_1]', ''.$result.'').'
'; } @@ -3973,17 +4439,29 @@ sub set_login { } sub course_sections { - my ($sections_count,$role) = @_; + my ($sections_count,$role,$current_sec) = @_; my $output = ''; my @sections = (sort {$a <=> $b} keys %{$sections_count}); my $numsec = scalar(@sections); + my $is_selected = ' selected="selected" '; if ($numsec <= 1) { $output = ''.&mt('Select').''."\n". + ' '."\n"; + if ($current_sec eq 'none') { + $output .= + ' \n"; + } else { + $output .= ' \n"; + } } else { $output .= 'multiple="multiple" size="'.$multiple.'">'."\n"; } foreach my $sec (@sections) { - $output .= '\n"; + if ($current_sec eq $sec) { + $output .= '\n"; + } else { + $output .= '\n"; + } } } $output .= ''; @@ -4015,7 +4503,7 @@ sub get_groupslist { } sub setsections_javascript { - my ($formname,$groupslist,$mode) = @_; + my ($formname,$groupslist,$mode,$checkauth) = @_; my ($checkincluded,$finish,$rolecode,$setsection_js); if ($mode eq 'upload') { $checkincluded = 'formname.name == "'.$formname.'"'; @@ -4023,12 +4511,26 @@ sub setsections_javascript { $rolecode = "var role = formname.defaultrole.options[formname.defaultrole.selectedIndex].value;\n"; } elsif ($formname eq 'cu') { $checkincluded = 'formname.elements[i-1].checked == true'; - $finish = 'formname.submit()'; + if ($checkauth) { + $finish = "var authcheck = auth_check();\n". + " if (authcheck == 'ok') {\n". + " formname.submit();\n". + " }\n"; + } else { + $finish = 'formname.submit()'; + } $rolecode = "var match = str.split('_'); var role = match[3];\n"; } elsif ($formname eq 'enrollstudent') { $checkincluded = 'formname.name == "'.$formname.'"'; - $finish = 'formname.submit()'; + if ($checkauth) { + $finish = "var authcheck = auth_check();\n". + " if (authcheck == 'ok') {\n". + " formname.submit();\n". + " }\n"; + } else { + $finish = 'formname.submit()'; + } $rolecode = "var match = str.split('_'); var role = match[1];\n"; } else { @@ -4174,10 +4676,14 @@ sub can_modify_userinfo { if (ref($userroles) eq 'ARRAY') { foreach my $role (@{$userroles}) { my $testrole; - if ($role =~ /^cr\//) { - $testrole = 'cr'; - } else { + if ($context eq 'selfcreate') { $testrole = $role; + } else { + if ($role =~ /^cr\//) { + $testrole = 'cr'; + } else { + $testrole = $role; + } } if (ref($domconfig{'usermodification'}{$context}{$testrole}) eq 'HASH') { if ($domconfig{'usermodification'}{$context}{$testrole}{$field}) { @@ -4323,24 +4829,17 @@ sub authorpriv { } sub roles_on_upload { - my ($context,%customroles) = @_; + my ($context,$setting,%customroles) = @_; my (@possible_roles,@permitted_roles); - if ($context eq 'domain') { - @possible_roles = &curr_role_permissions($context,undef,1); - push(@possible_roles,&curr_role_permissions($context,'course',1)); - } else { - @possible_roles = &curr_role_permissions($context,undef,1); - } - my $custom_ok = 0; + @possible_roles = &curr_role_permissions($context,$setting,1); foreach my $role (@possible_roles) { if ($role eq 'cr') { - $custom_ok = 1; push(@permitted_roles,keys(%customroles)); } else { push(@permitted_roles,$role); } } - return ($custom_ok,@permitted_roles); + return @permitted_roles; } sub get_course_identity { @@ -4365,15 +4864,19 @@ sub get_course_identity { } sub dc_setcourse_js { - my ($formname,$mode) = @_; - my $dc_setcourse_code; + my ($formname,$mode,$context) = @_; + my ($dc_setcourse_code,$authen_check); my $cctext = &Apache::lonnet::plaintext('cc'); my %alerts = §ioncheck_alerts(); my $role = 'role'; if ($mode eq 'upload') { $role = 'courserole'; + } else { + $authen_check = &verify_authen($formname,$context); } $dc_setcourse_code = (<<"SCRIPTTOP"); +$authen_check + function setCourse() { var course = document.$formname.dccourse.value; if (course != "") { @@ -4458,9 +4961,11 @@ SCRIPTTOP } } } - document.$formname.submit(); + var authcheck = auth_check(); + if (authcheck == 'ok') { + document.$formname.submit(); + } } - ENDSCRIPT } else { $dc_setcourse_code .= " @@ -4481,6 +4986,66 @@ ENDSCRIPT return -1; } ENDSCRIPT + return $dc_setcourse_code; +} + +sub verify_authen { + my ($formname,$context) = @_; + my %alerts = &authcheck_alerts(); + my $finish = "return 'ok';"; + if ($context eq 'author') { + $finish = "document.$formname.submit();"; + } + my $outcome = <<"ENDSCRIPT"; + +function auth_check() { + var logintype; + if (document.$formname.login.length) { + if (document.$formname.login.length > 0) { + var loginpicked = 0; + for (var i=0; i 'You must choose an authentication type.', + krb => 'You need to specify the Kerberos domain.', + ipass => 'You need to specify the initial password.', + ); + return %alerts; +} + 1; 500 Internal Server Error

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.