--- loncom/interface/Attic/londropadd.pm 2006/11/23 00:17:01 1.149 +++ loncom/interface/Attic/londropadd.pm 2007/07/26 23:48:53 1.164 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Handler to drop and add students in courses # -# $Id: londropadd.pm,v 1.149 2006/11/23 00:17:01 albertel Exp $ +# $Id: londropadd.pm,v 1.164 2007/07/26 23:48:53 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -40,6 +40,7 @@ use Spreadsheet::WriteExcel; use Apache::lonstathelpers(); use Apache::lonlocal; use Apache::longroup; +use LONCAPA(); ############################################################### ############################################################### @@ -60,8 +61,8 @@ sub modifystudent { # 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 - $courseid=~s/\_/\//g; - $courseid=~s/^(\w)/\/$1/; + my $cdom = $env{'course.'.$courseid.'.domain'}; + my $cnum = $env{'course.'.$courseid.'.num'}; my %roles = &Apache::lonnet::dump('roles',$udom,$unam); my ($tmp) = keys(%roles); # Bail out if we were unable to get the students roles @@ -69,10 +70,10 @@ sub modifystudent { # Go through the roles looking for enrollment in this course my $result = ''; foreach my $course (keys(%roles)) { - if ($course=~/^$courseid(?:\/)*(?:\s+)*(\w+)*\_st$/) { + if ($course=~m{^/\Q$cdom\E/\Q$cnum\E(?:\/)*(?:\s+)*(\w+)*\_st$}) { # We are in this course my $section=$1; - $section='' if ($course eq $courseid.'_st'); + $section='' if ($course eq "/$cdom/$cnum".'_st'); if (defined($csec) && $section eq $csec) { $result .= 'ok:'; } elsif ( ((!$section) && (!$csec)) || ($section ne $csec) ) { @@ -105,7 +106,7 @@ sub domain_form { # Set up domain and server selection forms # # Get the domains - my @domains = &Apache::loncommon::get_domains(); + my @domains = &Apache::lonnet::all_domains(); # build up the menu information to be passed to # &Apache::loncommon::linked_select_forms my %select_menus; @@ -116,7 +117,7 @@ sub domain_form { $select_menus{$dom}->{'default'}= 'default'; $select_menus{$dom}->{'select2'}->{'default'} = 'default'; # Now build up the other items in the second menu - my %servers = &Apache::loncommon::get_library_servers($dom); + my %servers = &Apache::lonnet::get_servers($dom,'library'); foreach my $server (keys(%servers)) { $select_menus{$dom}->{'select2'}->{$server} = "$server $servers{$server}"; @@ -132,59 +133,66 @@ sub domain_form { ############################################################### # Menu Phase One sub print_main_menu { - my ($r,$enrl_permission,$view_permission,$grp_manage_permission, - $grp_view_permission)=@_; + my ($r,$permission)=@_; # - my ($cdom,$cnum) = split/_/,$env{'request.course.id'}; + my $cid =$env{'request.course.id'}; + my $cdom=$env{'course.'.$cid.'.domain'}; + my $cnum=$env{'course.'.$cid.'.num'}; my @menu = ( { text => 'Upload a class list', help => 'Course_Create_Class_List', action => 'upload', - permission => $enrl_permission, + permission => $permission->{'enrl'}, }, { text => 'Enroll a single student', help => 'Course_Add_Student', action => 'enrollstudent', - permission => $enrl_permission, + permission => $permission->{'enrl'}, }, { text => 'Modify student data', help => 'Course_Modify_Student_Data', action => 'modifystudent', - permission => $enrl_permission, + permission => $permission->{'enrl'}, }, { text => 'View Class List', help => 'Course_View_Class_List', action => 'classlist', - permission => $view_permission, + permission => $permission->{'view'}, }, { text => 'Drop Students', help => 'Course_Drop_Student', action => 'drop', - permission => $enrl_permission, + permission => $permission->{'enrl'}, }, { text => 'Automated Enrollment Manager', - permission => &Apache::lonnet::auto_run($cnum,$cdom), + permission => (&Apache::lonnet::auto_run($cnum,$cdom) + && $permission->{'enrl'}), url => '/adm/populate', }, { text => 'Create a new group', help => 'Course_Create_Group', - permission => $grp_manage_permission, + permission => $permission->{'grp_manage'}, url => '/adm/coursegroups?refpage=enrl&action=create', }, { text => 'Modify an existing group', help => 'Course_Modify_Group', - permission => $grp_manage_permission, + permission => $permission->{'grp_manage'}, url => '/adm/coursegroups?refpage=enrl&action=modify', }, -# { text => 'Delete an existing group', -# help => 'Course_Delete_Group', -# permission => $grp_manage_permission, -# url => '/adm/coursegroups?refpage=enrl&action=delete', -# }, + { text => 'Delete an existing group', + help => 'Course_Delete_Group', + permission => $permission->{'grp_manage'}, + url => '/adm/coursegroups?refpage=enrl&action=delete', + }, + { text => 'Re-enable a deleted group', + help => 'Course_Reenable_Group', + permission => $permission->{'grp_manage'}, + url => '/adm/coursegroups?refpage=enrl&action=reenable', + }, { text => 'Enter an existing group', help => 'Course_Display_Group', - permission => $grp_view_permission, + permission => $permission->{'grp_view'}, url => '/adm/coursegroups?refpage=enrl&action=view', }, ); @@ -744,17 +752,21 @@ sub enroll_single_student { } $r->print('

'.&mt('Enrolling Student').'

'); - $r->print('

'.&mt('Enrolling').' '.$env{'form.cuname'}." \@ ". - $env{'form.lcdomain'}.'

'); - if (($env{'form.cuname'})&&($env{'form.cuname'}!~/\W/)&& - ($env{'form.lcdomain'})&&($env{'form.lcdomain'}!~/\W/)) { + $r->print('

'.&mt('Enrolling [_1] : [_2]',$env{'form.cuname'}, + $env{'form.lcdomain'}).'

'); + if (($env{'form.cuname'}) + && ($env{'form.cuname'} + eq &LONCAPA::clean_username($env{'form.cuname'})) + && ($env{'form.lcdomain'}) + && ($env{'form.lcdomain'} + eq &LONCAPA::clean_domain($env{'form.lcdomain'}))) { # Deal with home server selection my $domain=$env{'form.lcdomain'}; my $desiredhost = $env{'form.lcserver'}; if (lc($desiredhost) eq 'default') { $desiredhost = undef; } else { - my %home_servers =&Apache::loncommon::get_library_servers($domain); + my %home_servers =&Apache::lonnet::get_servers($domain,'library'); if (! exists($home_servers{$desiredhost})) { $r->print(''.&mt('Error').':'. &mt('Invalid home server specified')); @@ -810,6 +822,7 @@ sub enroll_single_student { } else { $r->print(&mt('Invalid username or domain')); } + $r->print("

".&mt("Enroll another student")."

"); } sub setup_date_selectors { @@ -873,7 +886,8 @@ sub date_setting_table { my ($startform,$endform)=&setup_date_selectors($starttime,$endtime,$mode); my $dateDefault = ''. ''; + &mt('make these dates the default for future enrollment'). + ''; if ($mode eq 'create_enrolldates' || $mode eq 'create_defaultdates') { $dateDefault = ' '; } @@ -936,11 +950,11 @@ sub get_student_username_domain_form {

$lt{'eos'}

- + - + - + @@ -957,10 +971,8 @@ sub print_enroll_single_student_form { my $r=shift; $r->print("

".&mt('Enroll One Student')."

"); # - my $username = $env{'form.cuname'}; - my $domain = $env{'form.cudomain'}; - $username=~s/\W//gs; - $domain=~s/\W//gs; + my $username = &LONCAPA::clean_username($env{'form.cuname'}); + my $domain = &LONCAPA::clean_domain($env{'form.cudomain'}); my $home = &Apache::lonnet::homeserver($username,$domain); # $new_user flags whether we are creating a new user or using an old one my $new_user = 1; @@ -986,7 +998,7 @@ sub print_enroll_single_student_form { # # Set up domain selection form my $homeserver_form = ''; - my %servers = &Apache::loncommon::get_library_servers($domain); + my %servers = &Apache::lonnet::get_servers($domain,'library'); $homeserver_form = '
$lt{'usr'}:
:
$lt{'dom'}:
: $domform
 
 
- - - - - - - - - + + + + + + + + + - +
$lt{'fn'}:
$lt{'mn'}:
$lt{'ln'}:
$lt{'gen'}:
$lt{'hs'}:
:
:
:
:
: $homeserver_form
$lt{'mail'}:
:

$lt{'pswd'}

@@ -1048,29 +1060,19 @@ END 'mail' => "Email Address", ); $user_data_html = <$lt{'udf'} $username\@$domain +

$lt{'udf'} $username:$domain

- - - - - - - - - - + + + + + + + + + +
$lt{'fn'}: - -
$lt{'mn'}: - -
$lt{'ln'}: - -
$lt{'gen'}: - -
$lt{'mail'}: - -
:
:
:
:
:
END } @@ -1132,20 +1134,19 @@ $user_data_html

$lt{'cd'}

-

$lt{'gs'}: -

-$date_table +

:

+$date_table

$lt{'idsn'}

-$lt{'idsn'}: +:

- +

END return; @@ -1168,7 +1169,7 @@ sub print_drop_menu { # ============================================== view classlist sub print_html_classlist { - my ($r,$mode) = @_; + my ($r,$mode,$permission) = @_; if (! exists($env{'form.sortby'})) { $env{'form.sortby'} = 'username'; } @@ -1177,7 +1178,7 @@ sub print_html_classlist { } my $status_select = &Apache::lonhtmlcommon::StatusOptions ($env{'form.Status'}); - my $cid=$env{'request.course.id'}; + my $cid =$env{'request.course.id'}; my $cdom=$env{'course.'.$cid.'.domain'}; my $cnum=$env{'course.'.$cid.'.num'}; # @@ -1223,15 +1224,25 @@ sub print_html_classlist { $output_selector .= "\n".$option; } $output_selector .= ''; - $r->print(&mt('Output Format: [_1]',$output_selector).(' 'x3)); + $r->print(''.(' 'x3)); } - $r->print(&mt('Student Status: [_1]',$status_select)."\n"); + $r->print('\n"); $r->print(''. "\n

\n"); # # Print the classlist $r->print('

'.&mt('Current Class List').'

'); my ($classlist,$keylist)=&Apache::loncoursedata::get_classlist(); + + if (exists($permission->{'view_section'})) { + my $sec = &Apache::loncoursedata::CL_SECTION(); + foreach my $student (keys(%{$classlist})) { + if ($classlist->{$student}[$sec] ne $permission->{'view_section'}) { + delete($classlist->{$student}); + } + } + } + if (! defined($classlist)) { $r->print(&mt('There are no students currently enrolled.')."\n"); } else { @@ -1295,6 +1306,7 @@ END 'start' => "start date", 'end' => "end date", 'type' => "enroll type/action", + 'email' => "email address", 'photo' => "photo", ); unless ($mode eq 'autoenroll') { @@ -1347,6 +1359,8 @@ function photowindow(photolink) { $lt{'end'} $lt{'grp'} + + $lt{'email'} END if ($env{'course.'.$env{'request.course.id'}.'.internal.showphoto'}) { @@ -1390,13 +1404,15 @@ END print $CSVfile '"'.join('","',map { &Apache::loncommon::csv_translate(&mt($_)) } ("username","domain","ID","student name", - "section","start date","end date","status","active groups")) + "section","start date","end date","status", + "active groups","email address")) .'"'."\n"; } else { print $CSVfile '"'.join('","',map { &Apache::loncommon::csv_translate(&mt($_)) } ("username","domain","ID","student name", - "section","start date","end date","active groups")).'"'."\n"; + "section","start date","end date", + "active groups","email address")).'"'."\n"; } } elsif ($mode eq 'excel') { # Create the excel spreadsheet @@ -1412,7 +1428,7 @@ END $excel_sheet->write($row++,0,["username","domain","ID", "student name","section", "start date","end date","status", - "active groups"], + "active groups","email address"], $format->{'bold'}); } # @@ -1451,10 +1467,21 @@ END my $name = $sdata->[$index{'fullname'}]; my $id = $sdata->[$index{'id'}]; my $status = $sdata->[$index{'status'}]; + next if (($statusmode ne 'Any') && ($status ne $statusmode)); my $start = $sdata->[$index{'start'}]; my $end = $sdata->[$index{'end'}]; my $type = $sdata->[$index{'type'}]; - next if (($statusmode ne 'Any') && ($status ne $statusmode)); + + my %emails = &Apache::loncommon::getemails($username,$domain); + my $email; + foreach my $type ('critnotification', 'permanentemail', + 'notification') { + if ($emails{$type} =~ /\S/) { + $email = $emails{$type}; + last; + } + } + if ($mode eq 'view' || $mode eq 'html' || $mode eq 'autoenroll') { if (! defined($start) || $start == 0) { $start = &mt('none'); @@ -1514,6 +1541,7 @@ END $start $end $active_groups + $email END if ($env{'course.'.$env{'request.course.id'}. '.internal.showphoto'}) { @@ -1550,6 +1578,7 @@ END push @line,&Apache::loncommon::csv_translate($status); } push @line,&Apache::loncommon::csv_translate($active_groups); + push @line,&Apache::loncommon::csv_translate($email); print $CSVfile '"'.join('","',@line).'"'."\n"; } elsif ($mode eq 'excel') { $excel_sheet->write($row,0,[$username,$domain,$id, @@ -1566,6 +1595,7 @@ END } $excel_sheet->write($row,$col++,$status); $excel_sheet->write($row,$col++,$active_groups); + $excel_sheet->write($row,$col++,$email); $row++; } } @@ -1687,7 +1717,7 @@ $lt{'odcc'}

$lt{'mef'} $info{'firstname'} $info{'middlename'} -$info{'lastname'} $info{'generation'}, $sname\@$sdom

+$info{'lastname'} $info{'generation'}, $sname:$sdom

$lt{'sn'} @@ -1699,14 +1729,14 @@ $info{'lastname'} $info{'generation'}, $

-$lt{'sid'}: +$lt{'sid'}:

-$lt{'sec'}: +$lt{'sec'}:

$current_date_description

$date_table

@@ -1748,7 +1778,7 @@ sub modify_single_student { $env{'request.course.id'}); my ($tmp) = keys(%old); if ($tmp =~ /^(con_lost|error|no_such_host)/i) { - $r->print(&mt('There was an error determining the environment values for')." $slogin \@ $sdom."); + $r->print(&mt('There was an error determining the environment values for')." $slogin : $sdom."); return; } undef $tmp; @@ -1788,7 +1818,7 @@ sub modify_single_student { 'et' => "End Time", ); $r->print(<$lt{'mdu'} $slogin \@ $sdom +

$lt{'mdu'} $slogin : $sdom

$lt{'si'}

@@ -1848,8 +1878,8 @@ END &mt('The error reported was')." ". $roleresults); &Apache::lonnet::logthis("londropadd:failed attempt to modify student". - " data for ".$slogin." \@ ".$sdom." by ". - $env{'user.name'}." \@ ".$env{'user.domain'}. + " data for ".$slogin." : ".$sdom." by ". + $env{'user.name'}." : ".$env{'user.domain'}. ":".$roleresults); } else { # everything is okay! $r->print(&mt('Student information updated successfully.')."
". @@ -1870,7 +1900,8 @@ END sub get_enrollment_data { my ($sname,$sdomain) = @_; my $courseid = $env{'request.course.id'}; - $courseid =~ s:_:/:g; + my $cdom = $env{'course.'.$courseid.'.domain'}; + my $cnum = $env{'course.'.$courseid.'.num'}; my %roles = &Apache::lonnet::dump('roles',$sdomain,$sname); my ($tmp) = keys(%roles); # Bail out if we were unable to get the students roles @@ -1880,7 +1911,7 @@ sub get_enrollment_data { my $section = ''; my $count = scalar(keys(%roles)); while (my ($course,$role) = each(%roles)) { - if ($course=~ /^\/$courseid\/*\s*(\w+)*_st$/ ) { + if ($course=~m{^/\Q$cdom\E/\Q$cnum\E/*\s*(\w+)*_st$} ) { # # Get active role $section=$1; @@ -2159,7 +2190,7 @@ sub upfile_drop_add { if (lc($desiredhost) eq 'default') { $desiredhost = undef; } else { - my %home_servers = &Apache::loncommon::get_library_servers($domain); + my %home_servers = &Apache::lonnet::get_servers($domain,'library'); if (! exists($home_servers{$desiredhost})) { $r->print(''.&mt('Error').''. &mt('Invalid home server specified')); @@ -2193,7 +2224,8 @@ sub upfile_drop_add { $amode = ''; # This causes the loop below to be skipped } } - unless (($domain=~/\W/) || ($amode eq '')) { + if ( $domain eq &LONCAPA::clean_domain($domain) + && ($amode ne '')) { ####################################### ## Enroll Students ## ####################################### @@ -2227,7 +2259,8 @@ sub upfile_drop_add { $gen=$entries{$fields{'gen'}}; } } - if ($entries{$fields{'username'}}=~/\W/) { + 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). @@ -2396,6 +2429,36 @@ function validate(caller) { END } +sub get_permission { + my %permission; + $permission{'view'} = + &Apache::lonnet::allowed('vcl',$env{'request.course.id'}); + &Apache::lonnet::logthis(" vcl 1 ".$permission{'view'}); + if (!$permission{'view'}) { + my $scope = $env{'request.course.id'}.'/'.$env{'request.course.sec'}; + $permission{'view'} = &Apache::lonnet::allowed('vcl',$scope); + &Apache::lonnet::logthis(" vcl 2 ".$permission{'view'}); + if ($permission{'view'}) { + $permission{'view_section'} = $env{'request.course.sec'}; + &Apache::lonnet::logthis(" vcl 3 ".$permission{'view'}); + } + } + + $permission{'enrl'} = + &Apache::lonnet::allowed('cst',$env{'request.course.id'}); + + $permission{'grp_view'} = + &Apache::lonnet::allowed('vcg',$env{'request.course.id'}); + $permission{'grp_manage'} = + &Apache::lonnet::allowed('mdg',$env{'request.course.id'}); + my $allowed = 0; + foreach my $perm (values(%permission)) { + if ($perm) { $allowed=1; last; } + } + &Apache::lonnet::logthis(" allowed ".$allowed); + return (\%permission,$allowed); +} + ################################################################### ################################################################### @@ -2454,22 +2517,13 @@ sub handler { return HTTP_NOT_ACCEPTABLE; } # - my $view_permission = - &Apache::lonnet::allowed('vcl',$env{'request.course.id'}); - my $enrl_permission = - &Apache::lonnet::allowed('cst',$env{'request.course.id'}); - - my $grp_view_permission = - &Apache::lonnet::allowed('vcg',$env{'request.course.id'}); - my $grp_manage_permission = - &Apache::lonnet::allowed('mdg',$env{'request.course.id'}); + my ($permission,$allowed) = &get_permission(); - if (! $grp_view_permission && ! $grp_manage_permission && - ! $view_permission && ! $enrl_permission) { + if (!$allowed) { $env{'user.error.msg'}= - "/adm/coursegroups:cst:0:0:Cannot manage or view course groups, ". - "or drop or add students"; + "/adm/dropadd:cst:0:0:Cannot manage or view course groups, ". + "or drop or add students"; return HTTP_NOT_ACCEPTABLE; } @@ -2484,9 +2538,8 @@ sub handler { # Main switch on form.action and form.state, as appropriate if (! exists($env{'form.action'})) { $r->print(&Apache::lonhtmlcommon::breadcrumbs('Enrollment Manager')); - &print_main_menu($r,$enrl_permission,$view_permission,$grp_manage_permission, - $grp_view_permission); - } elsif ($env{'form.action'} eq 'upload' && $enrl_permission) { + my $action = &print_main_menu($r,$permission); + } elsif ($env{'form.action'} eq 'upload' && $permission->{'enrl'}) { &Apache::lonhtmlcommon::add_breadcrumb ({href=>'/adm/dropadd?action=upload&state=', text=>"Upload Classlist"}); @@ -2505,7 +2558,7 @@ sub handler { } else { &print_first_courselist_upload_form($r); } - } elsif ($env{'form.action'} eq 'drop' && $enrl_permission) { + } elsif ($env{'form.action'} eq 'drop' && $permission->{'enrl'}) { &Apache::lonhtmlcommon::add_breadcrumb ({href=>'/adm/dropadd?action=drop', text=>"Drop Students"}); @@ -2518,7 +2571,7 @@ sub handler { } else { &print_drop_menu($r); } - } elsif ($env{'form.action'} eq 'enrollstudent' && $enrl_permission) { + } elsif ($env{'form.action'} eq 'enrollstudent' && $permission->{'enrl'}) { &Apache::lonhtmlcommon::add_breadcrumb ({href=>'/adm/dropadd?action=enrollstudent', text=>"Enroll Student"}); @@ -2533,35 +2586,35 @@ sub handler { } else { &get_student_username_domain_form($r); } - } elsif ($env{'form.action'} eq 'classlist' && $view_permission) { + } elsif ($env{'form.action'} eq 'classlist' && $permission->{'view'}) { &Apache::lonhtmlcommon::add_breadcrumb ({href=>'/adm/dropadd?action=classlist', text=>"View Classlist"}); $r->print(&Apache::lonhtmlcommon::breadcrumbs('View Classlist', 'Course_View_Class_List')); if (! exists($env{'form.state'})) { - &print_html_classlist($r,undef); + &print_html_classlist($r,undef,$permission); } elsif ($env{'form.state'} eq 'csv') { - &print_html_classlist($r,'csv'); + &print_html_classlist($r,'csv',$permission); } elsif ($env{'form.state'} eq 'excel') { - &print_html_classlist($r,'excel'); + &print_html_classlist($r,'excel',$permission); } else { - &print_html_classlist($r,undef); + &print_html_classlist($r,undef,$permission); } - } elsif ($env{'form.action'} eq 'modifystudent' && $enrl_permission) { + } elsif ($env{'form.action'} eq 'modifystudent' && $permission->{'enrl'}) { &Apache::lonhtmlcommon::add_breadcrumb ({href=>'/adm/dropadd?action=modifystudent', text=>"Modify Student Data"}); $r->print(&Apache::lonhtmlcommon::breadcrumbs('Modify Student Data', 'Course_Modify_Student_Data')); if (! exists($env{'form.state'})) { - &print_html_classlist($r); + &print_html_classlist($r,undef,$permission); } elsif ($env{'form.state'} eq 'selected') { &print_modify_student_form($r); } elsif ($env{'form.state'} eq 'done') { &modify_single_student($r); } else { - &print_html_classlist($r); + &print_html_classlist($r,undef,$permission); } } else { # We should not end up here, but I guess it is possible @@ -2569,7 +2622,7 @@ sub handler { "form.action = ".$env{'form.action'}. "Someone should fix this."); $r->print(&Apache::lonhtmlcommon::breadcrumbs('Enrollment Manager')); - &print_main_menu($r,$enrl_permission,$view_permission); + &print_main_menu($r,$permission); } # # Finish up