--- loncom/interface/lonuserutils.pm 2010/08/09 23:39:43 1.109.2.3 +++ loncom/interface/lonuserutils.pm 2010/08/04 16:50:29 1.121 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Utility functions for managing LON-CAPA user accounts # -# $Id: lonuserutils.pm,v 1.109.2.3 2010/08/09 23:39:43 raeburn Exp $ +# $Id: lonuserutils.pm,v 1.121 2010/08/04 16:50:29 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -36,7 +36,6 @@ use Apache::loncommon(); use Apache::lonhtmlcommon; use Apache::lonlocal; use Apache::longroup; -use Apache::lonnavmaps; use LONCAPA qw(:DEFAULT :match); ############################################################### @@ -1186,10 +1185,8 @@ sub default_role_selector { 'exs' => "Existing sections", 'new' => "New section", ); - $options = ''."\n". + ' '."\n"; if ($context eq 'course') { $options .= &default_course_roles($context,$checkpriv,$crstype,%customroles); } elsif ($context eq 'author') { @@ -1451,8 +1448,12 @@ sub print_userlist { } if (!(($context eq 'domain') && (($env{'form.roletype'} eq 'course') || ($env{'form.roletype'} eq 'community')))) { - $r->print(' '.&list_submit_button(&mt('Update Display')). - "\n

\n"); + $r->print( + "\n

\n" + .'

' + .&list_submit_button(&mt('Update Display')) + ."

\n" + ); } my ($indexhash,$keylist) = &make_keylist_array(); my (%userlist,%userinfo,$clearcoursepick); @@ -1471,9 +1472,11 @@ sub print_userlist { $title = &mt('Select Communities'); $warning = &mt('Warning: data retrieval for multiple communities can take considerable time, as this operation is not currently optimized.'); } + my @standardnames = &Apache::loncommon::get_standard_codeitems(); my $courseform = &Apache::lonhtmlcommon::course_selection($formname,$numcodes, - $codetitles,$idlist,$idlist_titles,$crstype); + $codetitles,$idlist,$idlist_titles,$crstype, + \@standardnames); $r->print('

'.&Apache::lonhtmlcommon::start_pick_box()."\n". &Apache::lonhtmlcommon::start_pick_box()."\n". &Apache::lonhtmlcommon::row_title($title,'LC_oddrow_value')."\n". @@ -1691,7 +1694,7 @@ sub role_filter { $role_select .= ''; $output = ''; + .' '; } return $output; } @@ -1731,7 +1734,7 @@ sub section_group_filter { } if (@options > 0) { my $currsel; - $markup = ''."\n"; foreach my $option ('all','none',@options) { $currsel = ''; if ($env{'form.'.$name{$item}} eq $option) { @@ -1746,7 +1749,9 @@ sub section_group_filter { $markup .= ''."\n"; } $markup .= ''."\n"; - $output .= (' 'x3).''; + $output .= (' 'x3).'' + .'' + .' '; } } return $output; @@ -1920,7 +1925,7 @@ function setCourseCat(formname) { if (formname.Year.options[formname.Year.selectedIndex].value == -1) { return; } - courseSet('Year'); + courseSet('$codetitles[0]'); for (var j=0; j "role", 'type' => "enroll type/action", 'email' => "e-mail address", - 'lastlogin' => "last login", - 'submissions' => "test status", 'photo' => "photo", 'extent' => "extent", 'pr' => "Proceed", @@ -2300,19 +2296,9 @@ END push(@cols,'status'); } if ($context eq 'course') { - if ($displaygroups) { - push(@cols,'groups'); - } + push(@cols,'groups'); } push(@cols,'email'); - if ($context eq 'course') { - if ($custommenu) { - push(@cols,'lastlogin'); - if (($env{'form.showrole'} eq 'Any') || ($env{'form.showrole'} eq 'st')) { - push(@cols,'submissions'); - } - } - } } my $rolefilter = $env{'form.showrole'}; @@ -2419,7 +2405,7 @@ END if ($env{'form.userwin'}) { $checkwin = ' checked="checked"'; } - $output .= ''.$lt{'owin'}.''; + $output .= ''.$lt{'owin'}.''; } $output .= "\n".'

'."\n". &Apache::loncommon::start_data_table(). @@ -2435,32 +2421,27 @@ END } } foreach my $item (@cols) { - if (grep(/^\Q$item\E$/,@sortable)) { - $output .= "$lt{$item}\n"; - } else { - $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? - if ($clickersupport) { - my %clicker_options = ( - 'on' => 'Show', - 'off' => 'Hide', - ); - my $clickerchg = 'on'; - if ($displayclickers eq 'on') { - $clickerchg = 'off'; - } - $output .= ' '."\n".' ' - .&mt('[_1]'.$clicker_options{$clickerchg}.'[_2] clicker id' + my %clicker_options = ( + 'on' => 'Show', + 'off' => 'Hide', + ); + my $clickerchg = 'on'; + if ($displayclickers eq 'on') { + $clickerchg = 'off'; + } + $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'}) { my %photo_options = &Apache::lonlocal::texthash( @@ -2499,18 +2480,14 @@ END $CSVfile = undef; } # - if ($clickersupport) { - push @cols,'clicker'; - } + 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"; } elsif ($mode eq 'excel') { - if ($clickersupport) { - push @cols,'clicker'; - } + push @cols,'clicker'; # Create the excel spreadsheet ($excel_workbook,$excel_filename,$format) = &Apache::loncommon::create_workbook($r); @@ -2546,40 +2523,6 @@ END Future => 'Future', Expired => 'Expired', ); - # If this is for a single course get last course "log-in" and submissions. - my (%crslogins,%stusubmissions,%elapsed,$numparts,%nummultipart,$multipart); - my $now = time; - if ($context eq 'course') { - if ($custommenu) { - %crslogins=&Apache::lonnet::dump('nohist_crslastlogin',$cdom,$cnum); - %stusubmissions=&Apache::lonnet::dump('nohist_submissiontracker',$cdom,$cnum); - %elapsed = &Apache::lonlocal::texthash( - -1 => 'more than a month ago', - 2592000 => 'within last 30 days', - 604800 => 'within last 7 days', - 86400 => 'within last 24 hours', - ); - my $navmap = Apache::lonnavmaps::navmap->new(); - if (defined($navmap)) { - my @allres=$navmap->retrieveResources('/uploaded/'.$cdom.'/'.$cnum.'/default_1261144274.sequence',sub { $_[0]->is_problem() },0); - foreach my $resource (@allres) { - my @parts = $resource->parts(); - my $count = scalar(@parts); - if ($count > 1) { - $nummultipart{$count} ++; - } - $numparts += $count; - } - if (keys(%nummultipart) > 0) { - $multipart = '
'.'contains'; - foreach my $key (sort {$a <=> $b} keys(%nummultipart)) { - $multipart .= " nummultipart{$key} multipart questions (with $key parts)"; - } - } - } - } - } - # Get groups, role, permanent e-mail so we can sort on them if # necessary. foreach my $user (keys(%{$userlist})) { @@ -2726,34 +2669,6 @@ END } else { $in{'end'} = &Apache::lonlocal::locallocaltime($in{'end'}); } - if ($context eq 'course') { - if ($custommenu) { - my $lastlogin = $crslogins{$in{'username'}.':'.$in{'domain'}.':'.$in{'section'}.':'.$role}; - if ($lastlogin ne '') { - my $sincelogin = $now - $lastlogin; - if ($sincelogin < 86400) { - $in{'lastlogin'} = $elapsed{'86400'}; - } elsif ($sincelogin < 604800) { - $in{'lastlogin'} = $elapsed{'604800'}; - } elsif ($sincelogin < 2592000 ) { - $in{'lastlogin'} = $elapsed{'2592000'}; - } else { - $in{'lastlogin'} = $elapsed{'-1'}; - } - } - } - if ($role eq 'st') { - my $numsub = $stusubmissions{$in{'username'}.':'.$in{'domain'}."\0attempts"} + - $stusubmissions{$in{'username'}.':'.$in{'domain'}."\0pilotsubs"}; - if (!$numsub) { - $in{'submissions'} = 'unattempted'; - } elsif ($numsub < $numparts) { - $in{'submissions'} = 'incomplete ('.$numsub.'/'.$numparts.')'; - } else { - $in{'submissions'} = 'completed'; - } - } - } if ($mode eq 'view' || $mode eq 'html' || $mode eq 'autoenroll' || $mode eq 'pickauthor') { $r->print(&Apache::loncommon::start_data_table_row()); my $checkval; @@ -2827,27 +2742,19 @@ END $showitem = $ltstatus{$in{$item}}; } $r->print(''.$showitem.''."\n"); - } elsif ($item eq 'submissions') { - if ($in{$item} =~ /^incomplete/) { - $r->print(''.$in{$item}.$multipart.''); - } else { - $r->print(''.$in{$item}.''."\n"); - } } else { $r->print(''.$in{$item}.''."\n"); } } if (($context eq 'course') && ($mode ne 'autoenroll')) { if ($env{'form.showrole'} eq 'st' || $env{'form.showrole'} eq 'Any') { - if ($clickersupport) { - if ($displayclickers eq 'on') { - my $clickers = + if ($displayclickers eq 'on') { + my $clickers = (&Apache::lonnet::userenvironment($in{'domain'},$in{'username'},'clickers'))[1]; - if ($clickers!~/\w/) { $clickers='-'; } - $r->print(''.$clickers.''); - } else { - $r->print('   '); - } + if ($clickers!~/\w/) { $clickers='-'; } + $r->print(''.$clickers.''); + } else { + $r->print('   '); } if ($env{'course.'.$env{'request.course.id'}.'.internal.showphoto'}) { if ($displayphotos eq 'on' && $role eq 'st' && $in{'photo'} ne '') { @@ -3038,7 +2945,7 @@ sub print_username_link { $output = $in->{'username'}; } else { $output = '{'username'}','$in->{'domain'}'".')" />'. + "'$in->{'username'}','$in->{'domain'}'".')">'. $in->{'username'}.''; } return $output; @@ -3268,9 +3175,9 @@ ENDJS my %lt = &Apache::lonlocal::texthash ( chac => 'Access dates to apply for selected users', chse => 'Changes in section affiliation to apply to selected users', - fors => 'For student roles changing the section, will result in a section switch as students may only be in one section of a course at a time.', - forn => 'For a role in a course that is not a student role, a user may have roles in more than one section of a course at a time.', - reta => "Retain each user's current section affiliations?", + fors => 'For student roles, changing the section will result in a section switch as students may only be in one section of a course at a time.', + forn => 'For a course role that is not "student", users may have roles in more than one section at a time.', + reta => "Retain each user's current section affiliations?", dnap => '(Does not apply to student roles).', ); my ($date_items,$headertext); @@ -3288,14 +3195,13 @@ ENDJS $permission,$crstype); } $output .= '

'.$headertext.'

'. - '
'."\n". + ''."\n". $date_items; if ($context eq 'course' && $env{'form.bulkaction'} eq 'chgsec') { my ($cnum,$cdom) = &get_course_identity(); - my $crstype = &Apache::loncommon::course_type(); if ($crstype eq 'Community') { - $lt{'fors'} = &mt('For member roles changing the section, will result in a section switch as members may only be in one section of a community at a time.'); - $lt{'forn'} = &mt('For a role in a community that is not a member role, a user may have roles in more than one section of a community at a time.'); + $lt{'fors'} = &mt('For member roles, changing the section will result in a section switch, as members may only be in one section of a community at a time.'); + $lt{'forn'} = &mt('For a community role that is not "member", users may have roles in more than one section at a time.'); $lt{'dnap'} = &mt('(Does not apply to member roles).'); } my $info; @@ -3336,7 +3242,7 @@ sub section_picker { my ($cdom,$cnum,$role,$rowtitle,$permission,$context,$mode,$crstype) = @_; my %sections_count = &Apache::loncommon::get_sections($cdom,$cnum); my $sections_select .= &course_sections(\%sections_count,$role); - my $secbox = '

'.&Apache::lonhtmlcommon::start_pick_box()."\n"; + my $secbox = '

'.&Apache::lonhtmlcommon::start_pick_box()."\n"; if ($mode eq 'upload') { my ($options,$cb_script,$coursepick) = &default_role_selector($context,1,$crstype); @@ -3349,7 +3255,7 @@ sub section_picker { ''.&mt('Existing sections')."\n". '
'.$sections_select.''. &mt('New section').'
'."\n". - ''."\n". + ''."\n". ''."\n". ''."\n"; } else { @@ -3358,7 +3264,7 @@ sub section_picker { $env{'request.course.sec'}; } $secbox .= &Apache::lonhtmlcommon::row_closure(1)."\n". - &Apache::lonhtmlcommon::end_pick_box().'

'; + &Apache::lonhtmlcommon::end_pick_box().'
'; return $secbox; } @@ -3499,7 +3405,7 @@ sub results_header_row { if ($rolefilter eq 'Any') { $description .= &mt('All users with co-author roles in domain',$showfilter); } else { - $description .= &mt('All co-authors in domain with [_1] roles',$rolefilter); + $description .= &mt('All co-authors in domain with [_1] roles',$rolefilter); } } } elsif (($env{'form.roletype'} eq 'course') || @@ -3563,10 +3469,6 @@ sub show_drop_list { my ($r,$classlist,$nosort,$permission,$crstype) = @_; my $cid = $env{'request.course.id'}; my ($cnum,$cdom) = &get_course_identity($cid); - my $displaygroups; - unless (&Apache::loncommon::needs_gci_custom()) { - $displaygroups = 1; - } if (! exists($env{'form.sortby'})) { &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, ['sortby']); @@ -3644,10 +3546,8 @@ END $lt{'sec'} $lt{'start'} $lt{'end'} + $lt{'groups'} END - if ($displaygroups) { - $r->print(" $lt{'groups'}\n"); - } $r->print(&Apache::loncommon::end_data_table_header_row()); } else { $r->print(&Apache::loncommon::start_data_table(). @@ -3668,13 +3568,10 @@ END $lt{'start'} $lt{'end'} + + $lt{'groups'} END - if ($displaygroups) { - $r->print(" - $lt{'groups'} - \n"); - } $r->print(&Apache::loncommon::end_data_table_header_row()); } # @@ -3727,10 +3624,8 @@ END $section $start $startitem $end + $active_groups END - if ($displaygroups) { - $r->print(" $active_groups\n"); - } $r->print(&Apache::loncommon::end_data_table_row()); } $r->print(&Apache::loncommon::end_data_table().'
'); @@ -3767,7 +3662,7 @@ sub print_first_users_upload_form { $str .= ''; $str .= ''; - $str .= '

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

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

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

'."\n"; # Excel and CSV Help $str .= '
' @@ -3778,8 +3673,15 @@ sub print_first_users_upload_form { &mt("How do I create a CSV file from a spreadsheet")) .'

'."\n"; $str .= &Apache::lonhtmlcommon::start_pick_box() - .&Apache::lonhtmlcommon::row_title(&mt('File')) - .&Apache::loncommon::upfile_select_html() + .&Apache::lonhtmlcommon::row_title(&mt('File')); + if (&Apache::lonlocal::current_language() ne 'en') { + if ($context eq 'course') { + $str .= '

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

'."\n"; + } + } + $str .= &Apache::loncommon::upfile_select_html() .&Apache::lonhtmlcommon::row_closure() .&Apache::lonhtmlcommon::row_title( '