--- loncom/interface/Attic/londropadd.pm 2005/03/10 17:33:57 1.126 +++ loncom/interface/Attic/londropadd.pm 2007/05/21 23:38:40 1.160 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Handler to drop and add students in courses # -# $Id: londropadd.pm,v 1.126 2005/03/10 17:33:57 matthew Exp $ +# $Id: londropadd.pm,v 1.160 2007/05/21 23:38:40 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -32,26 +32,22 @@ package Apache::londropadd; use strict; -use Apache::lonnet(); +use Apache::lonnet; use Apache::loncommon(); use Apache::lonhtmlcommon(); use Apache::Constants qw(:common :http REDIRECT); use Spreadsheet::WriteExcel; use Apache::lonstathelpers(); use Apache::lonlocal; +use Apache::longroup; +use LONCAPA(); ############################################################### ############################################################### sub header { - my $html=&Apache::lonxml::xmlbegin(); - my $bodytag=&Apache::loncommon::bodytag('Enrollment Manager'); - my $title = &mt('LON-CAPA Enrollment Manager'); + my $start_page=&Apache::loncommon::start_page('Enrollment Manager'); return(< -$title - -$bodytag +$start_page
ENDHEAD @@ -65,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 @@ -74,16 +70,16 @@ 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) ) { my (undef,$end,$start)=split(/\_/,$roles{$course}); my $now=time; - # if this is an active role + # if this is an active role if (!($start && ($now<$start)) || !($end && ($now>$end))) { my $reply=&Apache::lonnet::modifystudent # dom name id mode pass f m l g @@ -110,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; @@ -121,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}"; @@ -137,9 +133,12 @@ sub domain_form { ############################################################### # Menu Phase One sub print_main_menu { - my ($r,$enrl_permission,$view_permission)=@_; + my ($r,$enrl_permission,$view_permission,$grp_manage_permission, + $grp_view_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', @@ -171,6 +170,31 @@ sub print_main_menu { permission => &Apache::lonnet::auto_run($cnum,$cdom), url => '/adm/populate', }, + { text => 'Create a new group', + help => 'Course_Create_Group', + permission => $grp_manage_permission, + url => '/adm/coursegroups?refpage=enrl&action=create', + }, + { text => 'Modify an existing group', + help => 'Course_Modify_Group', + permission => $grp_manage_permission, + 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 => 'Re-enable a deleted group', + help => 'Course_Reenable_Group', + permission => $grp_manage_permission, + url => '/adm/coursegroups?refpage=enrl&action=reenable', + }, + { text => 'Enter an existing group', + help => 'Course_Display_Group', + permission => $grp_view_permission, + url => '/adm/coursegroups?refpage=enrl&action=view', + }, ); my $menu_html = ''; foreach my $menu_item (@menu) { @@ -205,17 +229,17 @@ sub print_upload_manager_header { my ($r,$datatoken,$distotal,$krbdefdom)=@_; my $javascript; # - if (! exists($ENV{'form.upfile_associate'})) { - $ENV{'form.upfile_associate'} = 'forward'; + if (! exists($env{'form.upfile_associate'})) { + $env{'form.upfile_associate'} = 'forward'; } - if ($ENV{'form.associate'} eq 'Reverse Association') { - if ( $ENV{'form.upfile_associate'} ne 'reverse' ) { - $ENV{'form.upfile_associate'} = 'reverse'; + if ($env{'form.associate'} eq 'Reverse Association') { + if ( $env{'form.upfile_associate'} ne 'reverse' ) { + $env{'form.upfile_associate'} = 'reverse'; } else { - $ENV{'form.upfile_associate'} = 'forward'; + $env{'form.upfile_associate'} = 'forward'; } } - if ($ENV{'form.upfile_associate'} eq 'reverse') { + if ($env{'form.upfile_associate'} eq 'reverse') { $javascript=&upload_manager_javascript_reverse_associate(); } else { $javascript=&upload_manager_javascript_forward_associate(); @@ -223,8 +247,8 @@ sub print_upload_manager_header { # # Deal with restored settings my $password_choice = ''; - if (exists($ENV{'form.ipwd_choice'}) && - $ENV{'form.ipwd_choice'} ne '') { + if (exists($env{'form.ipwd_choice'}) && + $env{'form.ipwd_choice'} ne '') { # If a column was specified for password, assume it is for an # internal password. This is a bug waiting to be filed (could be # local or krb auth instead of internal) but I do not have the @@ -234,7 +258,7 @@ sub print_upload_manager_header { # my $javascript_validations=&javascript_validations('auth',$krbdefdom, $password_choice); - my $checked=(($ENV{'form.noFirstLine'})?' checked="1"':''); + my $checked=(($env{'form.noFirstLine'})?' checked="checked" ':''); $r->print('

'.&mt('Uploading Class List')."

\n". "
\n". '

'.&mt('Identify fields')."

\n"); @@ -247,14 +271,14 @@ sub print_upload_manager_header { &hidden_input('state','got_file'). &hidden_input('associate',''). &hidden_input('datatoken',$datatoken). - &hidden_input('fileupload',$ENV{'form.fileupload'}). - &hidden_input('upfiletype',$ENV{'form.upfiletype'}). - &hidden_input('upfile_associate',$ENV{'form.upfile_associate'})); + &hidden_input('fileupload',$env{'form.fileupload'}). + &hidden_input('upfiletype',$env{'form.upfiletype'}). + &hidden_input('upfile_associate',$env{'form.upfile_associate'})); $r->print(''); - $r->print(''. - &mt('Ignore First Line')); + $r->print(''); $r->print("
\n". ''); @@ -292,7 +316,7 @@ sub javascript_validations { ipass => 'You need to specify the initial password.', name => 'The optional name field was not specified.', snum => 'The optional student number field was not specified.', - section => 'The optional section or group field was not specified.', + section => 'The optional section field was not specified.', email => 'The optional email address field was not specified.', continue => 'Continue enrollment?', ); @@ -378,6 +402,7 @@ END } END } + my $section_checks; my $optional_checks = ''; if ( ($mode eq 'createcourse') || ($mode eq 'modifycourse') ) { $optional_checks = (< $krbdefdom, kerb_def_auth => $krbdef ); - if (exists($ENV{'form.ipwd_choice'}) && - defined($ENV{'form.ipwd_choice'}) && - $ENV{'form.ipwd_choice'} ne '') { + if (exists($env{'form.ipwd_choice'}) && + defined($env{'form.ipwd_choice'}) && + $env{'form.ipwd_choice'} ne '') { $param{'curr_authtype'} = 'int'; } my $krbform = &Apache::loncommon::authform_kerberos(%param); @@ -607,6 +633,7 @@ sub print_upload_manager_footer { $Str .= '

'.&mt('Login Type')."

\n"; $Str .= "

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

\n"; $Str .= $krbform."\n

\n". $intform."\n

\n". @@ -616,15 +643,16 @@ sub print_upload_manager_footer { $Str .= "

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

\n"; $Str .= "

\n".$date_table."

\n"; $Str .= "

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

\n"; - $Str .= ''. + $Str .= '

\n"; $Str .= "

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

\n"; - $Str .= "

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

\n".'

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

\n"; + $Str .= ''."
\n"; $Str .= &mt('Note: for large courses, this operation may be time '. 'consuming'); @@ -639,14 +667,14 @@ sub print_upload_manager_form { my $firstLine; my $datatoken; - if (!$ENV{'form.datatoken'}) { + if (!$env{'form.datatoken'}) { $datatoken=&Apache::loncommon::upfile_store($r); } else { - $datatoken=$ENV{'form.datatoken'}; + $datatoken=$env{'form.datatoken'}; &Apache::loncommon::load_tmp_file($r); } my @records=&Apache::loncommon::upfile_record_sep(); - if($ENV{'form.noFirstLine'}){ + if($env{'form.noFirstLine'}){ $firstLine=shift(@records); } my $total=$#records; @@ -669,7 +697,7 @@ sub print_upload_manager_form { }); # # Determine kerberos parameters as appropriate - my $defdom=$ENV{'course.'.$ENV{'request.course.id'}.'.domain'}; + my $defdom=$env{'course.'.$env{'request.course.id'}.'.domain'}; my ($krbdef,$krbdefdom) = &Apache::loncommon::get_kerberos_defaults($defdom); # @@ -678,17 +706,17 @@ sub print_upload_manager_form { my $keyfields; if ($total>=0) { my @field= - (['username',&mt('Username'), $ENV{'form.username_choice'}], - ['names',&mt('Last Name, First Names'),$ENV{'form.names_choice'}], - ['fname',&mt('First Name'), $ENV{'form.fname_choice'}], - ['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'}], - ['sec', &mt('Group/Section'), $ENV{'form.sec_choice'}], - ['ipwd', &mt('Initial Password'),$ENV{'form.ipwd_choice'}], - ['email',&mt('EMail Address'), $ENV{'form.email_choice'}]); - if ($ENV{'form.upfile_associate'} eq 'reverse') { + (['username',&mt('Username'), $env{'form.username_choice'}], + ['names',&mt('Last Name, First Names'),$env{'form.names_choice'}], + ['fname',&mt('First Name'), $env{'form.fname_choice'}], + ['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'}], + ['sec', &mt('Section'), $env{'form.sec_choice'}], + ['ipwd', &mt('Initial Password'),$env{'form.ipwd_choice'}], + ['email',&mt('EMail Address'), $env{'form.email_choice'}]); + if ($env{'form.upfile_associate'} eq 'reverse') { &Apache::loncommon::csv_print_samples($r,\@records); $i=&Apache::loncommon::csv_print_select_table($r,\@records, \@field); @@ -712,29 +740,33 @@ sub print_upload_manager_form { sub enroll_single_student { my $r=shift; # Remove non alphanumeric values from section - $ENV{'form.csec'}=~s/\W//g; + $env{'form.csec'}=~s/\W//g; # # We do the dates first because the action of making them the defaul # in the course is entirely separate from the action of enrolling the # student. Also, a failure in setting the dates as default is not fatal # to the process of enrolling / modifying a student. my ($startdate,$enddate) = &get_dates_from_form(); - if ($ENV{'form.makedatesdefault'}) { + if ($env{'form.makedatesdefault'}) { $r->print(&make_dates_default($startdate,$enddate)); } $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').' '.$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'}; + 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')); @@ -745,33 +777,33 @@ sub enroll_single_student { # End of home server selection logic my $amode=''; my $genpwd=''; - if ($ENV{'form.login'} eq 'krb') { + if ($env{'form.login'} eq 'krb') { $amode='krb'; - $amode.=$ENV{'form.krbver'}; - $genpwd=$ENV{'form.krbarg'}; - } elsif ($ENV{'form.login'} eq 'int') { + $amode.=$env{'form.krbver'}; + $genpwd=$env{'form.krbarg'}; + } elsif ($env{'form.login'} eq 'int') { $amode='internal'; - $genpwd=$ENV{'form.intarg'}; - } elsif ($ENV{'form.login'} eq 'loc') { + $genpwd=$env{'form.intarg'}; + } elsif ($env{'form.login'} eq 'loc') { $amode='localauth'; - $genpwd=$ENV{'form.locarg'}; + $genpwd=$env{'form.locarg'}; if (!$genpwd) { $genpwd=" "; } } - my $home = &Apache::lonnet::homeserver($ENV{'form.cuname'}, - $ENV{'form.lcdomain'}); + my $home = &Apache::lonnet::homeserver($env{'form.cuname'}, + $env{'form.lcdomain'}); if ((($amode) && ($genpwd)) || ($home ne 'no_host')) { # Clean out any old roles the student has in this class. - &modifystudent($ENV{'form.lcdomain'},$ENV{'form.cuname'}, - $ENV{'request.course.id'},$ENV{'form.csec'}, + &modifystudent($env{'form.lcdomain'},$env{'form.cuname'}, + $env{'request.course.id'},$env{'form.csec'}, $desiredhost); my $login_result = &Apache::lonnet::modifystudent - ($ENV{'form.lcdomain'},$ENV{'form.cuname'}, - $ENV{'form.cstid'},$amode,$genpwd, - $ENV{'form.cfirst'},$ENV{'form.cmiddle'}, - $ENV{'form.clast'},$ENV{'form.cgen'}, - $ENV{'form.csec'},$enddate, - $startdate,$ENV{'form.forceid'}, - $desiredhost,$ENV{'form.emailaddress'}); + ($env{'form.lcdomain'},$env{'form.cuname'}, + $env{'form.cstid'},$amode,$genpwd, + $env{'form.cfirst'},$env{'form.cmiddle'}, + $env{'form.clast'},$env{'form.cgen'}, + $env{'form.csec'},$enddate, + $startdate,$env{'form.forceid'}, + $desiredhost,$env{'form.emailaddress'}); if ($login_result =~ /^ok/) { $r->print($login_result); $r->print("

".&mt('If active, the new role will be available when the student next logs in to LON-CAPA.')."

"); @@ -785,11 +817,12 @@ sub enroll_single_student { } else { $r->print(&mt('Invalid login mode or password.').' '); } - $r->print(''.&mt('Unable to enroll').' '.$ENV{'form.cuname'}.'.

'); + $r->print(''.&mt('Unable to enroll').' '.$env{'form.cuname'}.'.

'); } } else { $r->print(&mt('Invalid username or domain')); } + $r->print("

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

"); } sub setup_date_selectors { @@ -797,9 +830,9 @@ sub setup_date_selectors { if (! defined($starttime)) { $starttime = time; unless ($mode eq 'create_enrolldates' || $mode eq 'create_defaultdates') { - if (exists($ENV{'course.'.$ENV{'request.course.id'}. + if (exists($env{'course.'.$env{'request.course.id'}. '.default_enrollment_start_date'})) { - $starttime = $ENV{'course.'.$ENV{'request.course.id'}. + $starttime = $env{'course.'.$env{'request.course.id'}. '.default_enrollment_start_date'}; } } @@ -807,9 +840,9 @@ sub setup_date_selectors { if (! defined($endtime)) { $endtime = time+(6*30*24*60*60); # 6 months from now, approx unless ($mode eq 'createcourse') { - if (exists($ENV{'course.'.$ENV{'request.course.id'}. + if (exists($env{'course.'.$env{'request.course.id'}. '.default_enrollment_end_date'})) { - $endtime = $ENV{'course.'.$ENV{'request.course.id'}. + $endtime = $env{'course.'.$env{'request.course.id'}. '.default_enrollment_end_date'}; } } @@ -842,7 +875,7 @@ 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'); - if ($ENV{'form.no_end_date'}) { + if ($env{'form.no_end_date'}) { $enddate = 0; } return ($startdate,$enddate); @@ -852,16 +885,17 @@ sub date_setting_table { my ($starttime,$endtime,$mode) = @_; 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 = ' '; } - my $perpetual = ''; + $perpetual.= ' /> '.&mt('no ending date').''; if ($mode eq 'create_enrolldates') { $perpetual = ' '; } @@ -880,8 +914,8 @@ sub date_setting_table { sub make_dates_default { my ($startdate,$enddate) = @_; my $result = ''; - my $dom = $ENV{'course.'.$ENV{'request.course.id'}.'.domain'}; - my $crs = $ENV{'course.'.$ENV{'request.course.id'}.'.num'}; + my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'}; + my $crs = $env{'course.'.$env{'request.course.id'}.'.num'}; my $put_result = &Apache::lonnet::put('environment', {'default_enrollment_start_date'=>$startdate, 'default_enrollment_end_date' =>$enddate},$dom,$crs); @@ -889,7 +923,8 @@ sub make_dates_default { $result .= "Set default start and end dates for course
"; # # Refresh the course environment - &Apache::lonnet::coursedescription($ENV{'request.course.id'}); + &Apache::lonnet::coursedescription($env{'request.course.id'}, + {'freshen_cache' => 1}); } else { $result .= &mt('Unable to set default dates for course').":".$put_result. '
'; @@ -903,7 +938,7 @@ sub make_dates_default { sub get_student_username_domain_form { my $r = shift; my $domform = &Apache::loncommon::select_dom_form - ($ENV{'course.'.$ENV{'request.course.id'}.'.domain'},'cudomain',0); + ($env{'course.'.$env{'request.course.id'}.'.domain'},'cudomain',0); my %lt=&Apache::lonlocal::texthash( 'eos' => "Enroll One Student", 'usr' => "Username", @@ -915,11 +950,11 @@ sub get_student_username_domain_form {

$lt{'eos'}

- + - + - + @@ -936,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; @@ -950,7 +983,7 @@ sub print_enroll_single_student_form { my $user_data_html = ''; my $javascript_validations = ''; if ($new_user) { - my $defdom=$ENV{'course.'.$ENV{'request.course.id'}.'.domain'}; + my $defdom=$env{'course.'.$env{'request.course.id'}.'.domain'}; # Set up authentication forms my ($krbdef,$krbdefdom) = &Apache::loncommon::get_kerberos_defaults($domain); @@ -965,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'}

-$lt{'psam'} +$lt{'psam'}$authhelp

$krbform @@ -1026,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 } @@ -1056,7 +1080,7 @@ END # Print it all out my %lt=&Apache::lonlocal::texthash( 'cd' => "Course Data", - 'gs' => "Group/Section", + 'gs' => "Section", 'idsn' => "ID/Student Number", 'disn' => "Disable ID/Student Number Safeguard and Force Change of Conflicting IDs (only do if you know what you are doing)", 'eas' => "Enroll as student", @@ -1067,7 +1091,7 @@ END + '); + } $r->print("

- +".&Apache::loncommon::start_data_table()." "); if ($mode eq 'autoenroll') { @@ -1292,14 +1346,31 @@ END $lt{'start'} - END + if ($env{'course.'.$env{'request.course.id'}.'.internal.showphoto'}) { + my %photo_options = &Apache::lonlocal::texthash( + 'on' => 'Show', + 'off' => 'Hide', + ); + my $photochg = 'on'; + if ($displayphotos eq 'on') { + $photochg = 'off'; + } + $r->print(' '."\n"); + } + $r->print(" \n"); } elsif ($mode eq 'csv') { # # Open a file $CSVfilename = '/prtspool/'. - $ENV{'user.name'}.'_'.$ENV{'user.domain'}.'_'. + $env{'user.name'}.'_'.$env{'user.domain'}.'_'. time.'_'.rand(1000000000).'.csv'; unless ($CSVfile = Apache::File->new('>/home/httpd'.$CSVfilename)) { $r->log_error("Couldn't open $CSVfilename for output $!"); @@ -1313,16 +1384,20 @@ END if($statusmode eq 'Expired') { print $CSVfile '"'.&mt('Students with expired roles').'"'."\n"; } + if($statusmode eq 'Future') { + print $CSVfile '"'.&mt('Students with future roles').'"'."\n"; + } if ($statusmode eq 'Any') { print $CSVfile '"'.join('","',map { &Apache::loncommon::csv_translate(&mt($_)) } ("username","domain","ID","student name", - "section","start date","end date","status")).'"'."\n"; + "section","start date","end date","status","active groups")) + .'"'."\n"; } else { print $CSVfile '"'.join('","',map { &Apache::loncommon::csv_translate(&mt($_)) } ("username","domain","ID","student name", - "section","start date","end date")).'"'."\n"; + "section","start date","end date","active groups")).'"'."\n"; } } elsif ($mode eq 'excel') { # Create the excel spreadsheet @@ -1332,12 +1407,13 @@ END $excel_sheet = $excel_workbook->addworksheet('classlist'); # my $description = 'Class List for '. - $ENV{'course.'.$ENV{'request.course.id'}.'.description'}; + $env{'course.'.$env{'request.course.id'}.'.description'}; $excel_sheet->write($row++,0,$description,$format->{'h1'}); # $excel_sheet->write($row++,0,["username","domain","ID", "student name","section", - "start date","end date","status"], + "start date","end date","status", + "active groups"], $format->{'bold'}); } # @@ -1347,6 +1423,7 @@ END foreach (@$keylist) { $index{$_} = $i++; } + $index{'groups'} = scalar(@{$keylist}); my $index = $index{$sortby}; my $second = $index{'username'}; my $third = $index{'domain'}; @@ -1364,9 +1441,14 @@ END my $lockcount = 0; foreach my $student (@Sorted_Students) { my $sdata = $classlist->{$student}; + my $groups = $classgroups->{$student}; my $username = $sdata->[$index{'username'}]; my $domain = $sdata->[$index{'domain'}]; my $section = $sdata->[$index{'section'}]; + my $active_groups; + if (ref($groups->{active}) eq 'HASH') { + $active_groups = join(', ',keys(%{$groups->{'active'}})); + } my $name = $sdata->[$index{'fullname'}]; my $id = $sdata->[$index{'id'}]; my $status = $sdata->[$index{'status'}]; @@ -1385,22 +1467,22 @@ END } else { $end = &Apache::lonlocal::locallocaltime($end); } - $r->print("\n "); + $r->print(&Apache::loncommon::start_data_table_row()); if ($mode eq 'autoenroll') { my $lockedtype = $sdata->[$index{'lockedtype'}]; $studentcount++; my $cellentry; if ($type eq 'auto') { - $cellentry = ''.&mt('auto').'  Change'; + $cellentry = ''.&mt('auto').' '; $autocount ++; } else { - $cellentry = '
$lt{'end'} + + $lt{'grp'}
'."\n".' '. + ''. + $photo_options{$photochg}.' '.$lt{'photo'}."\n". + '
- + END + if ($env{'course.'.$env{'request.course.id'}. + '.internal.showphoto'}) { + if ($displayphotos eq 'on') { + my $imgurl = + &Apache::lonnet::retrievestudentphoto($domain, + $username,'gif', + 'thumbnail'); + + $r->print(' '); + } else { + $r->print(' '); + } + } + $r->print(&Apache::loncommon::end_data_table_row()); } elsif ($mode eq 'csv') { next if (! defined($CSVfile)); # no need to bother with $linkto @@ -1454,22 +1550,28 @@ END if ($statusmode eq 'Any') { push @line,&Apache::loncommon::csv_translate($status); } + push @line,&Apache::loncommon::csv_translate($active_groups); print $CSVfile '"'.join('","',@line).'"'."\n"; } elsif ($mode eq 'excel') { $excel_sheet->write($row,0,[$username,$domain,$id, $name,$section]); my $col = 5; foreach my $time ($start,$end) { - $excel_sheet->write($row,$col++, + if (defined($time) && $time != 0) { + $excel_sheet->write($row,$col++, &Apache::lonstathelpers::calc_serial($time), $format->{'date'}); + } else { + $excel_sheet->write($row,$col++,'none'); + } } $excel_sheet->write($row,$col++,$status); + $excel_sheet->write($row,$col++,$active_groups); $row++; } } if ($mode eq 'view' || $mode eq 'html' || $mode eq 'autoenroll') { - $r->print('
'.&mt('manual').' Change
'; + $cellentry = '
'.&mt('manual').'
'; $manualcount ++; if ($lockedtype) { - $cellentry .= ' '.&mt('Unlock'); + $cellentry .= ''; $unlockcount ++; } else { - $cellentry .= ' '.&mt('Lock'); + $cellentry .= ''; $lockcount ++; } $cellentry .= '
'; @@ -1432,8 +1514,22 @@ END
$section $start $end
$active_groups 

'); + $r->print(&Apache::loncommon::end_data_table().'
'); } elsif ($mode eq 'excel') { $excel_workbook->close(); $r->print('

'. @@ -1495,9 +1597,9 @@ sub print_modify_student_form { my $r = shift(); &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, ['sdom','sname']); - my $sname = $ENV{'form.sname'}; - my $sdom = $ENV{'form.sdom'}; - my $sortby = $ENV{'form.sortby'}; + my $sname = $env{'form.sname'}; + my $sdom = $env{'form.sdom'}; + my $sortby = $env{'form.sortby'}; # determine the students name information my %info=&Apache::lonnet::get('environment', ['firstname','middlename', @@ -1509,7 +1611,7 @@ sub print_modify_student_form { '

'. &mt('Unable to retrieve environment data for').' '.$sname. &mt('in domain').' '.$sdom.'

'. - &mt('Please contact your LON-CAPA administrator regarding this situation.').'

'); + &mt('Please contact your LON-CAPA administrator regarding this situation.').'

'.&Apache::loncommon::end_page()); return; } # determine the students starting and ending times and section @@ -1543,9 +1645,9 @@ sub print_modify_student_form { } my $date_table = &date_setting_table($starttime,$endtime); # - if (! exists($ENV{'form.Status'}) || - $ENV{'form.Status'} !~ /^(Any|Expired|Active)$/) { - $ENV{'form.Status'} = 'crap'; + if (! exists($env{'form.Status'}) || + $env{'form.Status'} !~ /^(Any|Expired|Active|Future)$/) { + $env{'form.Status'} = 'crap'; } # Make sure student is enrolled in course my %lt=&Apache::lonlocal::texthash( @@ -1561,7 +1663,19 @@ sub print_modify_student_form { 'sec' => "Section", 'sm' => "Submit Modifications", ); - $r->print(<print(<<"END"); +

$lt{'odcc'} @@ -1572,7 +1686,7 @@ $lt{'odcc'} - +

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

@@ -1586,18 +1700,20 @@ $info{'lastname'} $info{'generation'}, $

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

- +

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

$current_date_description

$date_table

- - + END + $r->print(&Apache::loncommon::end_page()); return; } @@ -1605,24 +1721,24 @@ END # modify a single students section # sub modify_single_student { - my $r = shift; + my ($r) = @_; # # Remove non alphanumeric values from the section - $ENV{'form.section'} =~ s/\W//g; + $env{'form.section'} =~ s/\W//g; # # Do the date defaults first my ($starttime,$endtime) = &get_dates_from_form(); - if ($ENV{'form.makedatesdefault'}) { + if ($env{'form.makedatesdefault'}) { $r->print(&make_dates_default($starttime,$endtime)); } # Get the 'sortby' and 'Status' variables so the user goes back to their # previous screen - my $sortby = $ENV{'form.sortby'}; - my $status = $ENV{'form.Status'}; + my $sortby = $env{'form.sortby'}; + my $status = $env{'form.Status'}; # # We always need this information - my $slogin = $ENV{'form.slogin'}; - my $sdom = $ENV{'form.sdomain'}; + my $slogin = $env{'form.slogin'}; + my $sdom = $env{'form.sdomain'}; # # Get the old data my %old=&Apache::lonnet::get('environment', @@ -1630,7 +1746,7 @@ sub modify_single_student { 'lastname','generation','id'], $sdom, $slogin); $old{'section'} = &Apache::lonnet::getsection($sdom,$slogin, - $ENV{'request.course.id'}); + $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."); @@ -1639,19 +1755,19 @@ sub modify_single_student { undef $tmp; # # Get the new data - my $firstname = $ENV{'form.firstname'}; - my $middlename = $ENV{'form.middlename'}; - my $lastname = $ENV{'form.lastname'}; - my $generation = $ENV{'form.generation'}; - my $section = $ENV{'form.section'}; - my $courseid = $ENV{'request.course.id'}; - my $sid = $ENV{'form.id'}; + my $firstname = $env{'form.firstname'}; + my $middlename = $env{'form.middlename'}; + my $lastname = $env{'form.lastname'}; + my $generation = $env{'form.generation'}; + my $section = $env{'form.section'}; + my $courseid = $env{'request.course.id'}; + my $sid = $env{'form.id'}; my $displayable_starttime = localtime($starttime); my $displayable_endtime = localtime($endtime); # # check for forceid override if ((defined($old{'id'})) && ($old{'id'} ne '') && - ($sid ne $old{'id'}) && (! exists($ENV{'form.forceid'}))) { + ($sid ne $old{'id'}) && (! exists($env{'form.forceid'}))) { $r->print("".&mt('You changed the students id but did not disable the ID change safeguard. The students id will not be changed.').""); $sid = $old{'id'}; } @@ -1718,14 +1834,14 @@ END # Send request(s) to modify data (final undef is for 'desiredhost', # which is a moot point because the student already has an account. my $modify_section_results = &modifystudent($sdom,$slogin, - $ENV{'request.course.id'}, + $env{'request.course.id'}, $section,undef); if ($modify_section_results !~ /^ok/) { $r->print(&mt('An error occured during the attempt to change the section for this student.')."
"); } my $roleresults = &Apache::lonnet::modifystudent ($sdom,$slogin,$sid,undef,undef,$firstname,$middlename,$lastname, - $generation,$section,$endtime,$starttime,$ENV{'form.forceid'}); + $generation,$section,$endtime,$starttime,$env{'form.forceid'}); if ($roleresults eq 'refused' ) { $r->print(&mt('Your request to change the role information for this student was refused. You do not appear to have sufficient authority to change student information.')); } elsif ($roleresults !~ /ok/) { @@ -1734,7 +1850,7 @@ END $roleresults); &Apache::lonnet::logthis("londropadd:failed attempt to modify student". " data for ".$slogin." \@ ".$sdom." by ". - $ENV{'user.name'}." \@ ".$ENV{'user.domain'}. + $env{'user.name'}." \@ ".$env{'user.domain'}. ":".$roleresults); } else { # everything is okay! $r->print(&mt('Student information updated successfully.')."
". @@ -1747,15 +1863,16 @@ END
$Masd - END + $r->print(&Apache::loncommon::end_page()); return; } sub get_enrollment_data { my ($sname,$sdomain) = @_; - my $courseid = $ENV{'request.course.id'}; - $courseid =~ s:_:/:g; + my $courseid = $env{'request.course.id'}; + 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 @@ -1765,7 +1882,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; @@ -1813,15 +1930,19 @@ which describes the order elements are s ################################################# sub show_drop_list { my ($r,$classlist,$keylist,$nosort)=@_; - my $cid=$ENV{'request.course.id'}; - if (! exists($ENV{'form.sortby'})) { + my $cid=$env{'request.course.id'}; + if (! exists($env{'form.sortby'})) { &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, ['sortby']); } - my $sortby = $ENV{'form.sortby'}; - if ($sortby !~ /^(username|domain|section|fullname|id|start|end)$/) { + my $sortby = $env{'form.sortby'}; + if ($sortby !~ /^(username|domain|section|groups|fullname|id|start|end)$/) { $sortby = 'username'; } + my $cdom = $env{'course.'.$cid.'.domain'}; + my $cnum = $env{'course.'.$cid,'.num'}; + my ($classgroups) = &Apache::loncoursedata::get_group_memberships( + $classlist,$keylist,$cdom,$cnum); # my $action = "drop"; $r->print(< "section", 'start' => "start date", 'end' => "end date", + 'groups' => "active groups", ); if ($nosort) { + $r->print(&Apache::loncommon::start_data_table()); $r->print(<   $lt{'usrn'} @@ -1862,12 +1984,13 @@ my %lt=&Apache::lonlocal::texthash('usrn $lt{'sec'} $lt{'start'} $lt{'end'} + $lt{'groups'} END } else { + $r->print(&Apache::loncommon::start_data_table()); $r->print(<   $lt{'usrn'} @@ -1883,6 +2006,8 @@ END $lt{'start'} $lt{'end'} + + $lt{'groups'} END @@ -1894,6 +2019,7 @@ END foreach (@$keylist) { $index{$_} = $i++; } + $index{'groups'} = scalar(@$keylist); my $index = $index{$sortby}; my $second = $index{'username'}; my $third = $index{'domain'}; @@ -1914,6 +2040,11 @@ END my $id = $sdata->[$index{'id'}]; my $start = $sdata->[$index{'start'}]; my $end = $sdata->[$index{'end'}]; + my $groups = $classgroups->{$student}; + my $active_groups; + if (ref($groups->{active}) eq 'HASH') { + $active_groups = join(', ',keys(%{$groups->{'active'}})); + } if (! defined($start) || $start == 0) { $start = &mt('none'); } else { @@ -1927,8 +2058,8 @@ END my $status = $sdata->[$index{'status'}]; next if ($status ne 'Active'); # + $r->print(&Apache::loncommon::start_data_table_row()); $r->print(<<"END"); - $username $domain @@ -1937,10 +2068,11 @@ END $section $start $end - + $active_groups END + $r->print(&Apache::loncommon::end_data_table_row()); } - $r->print('
'); + $r->print(&Apache::loncommon::end_data_table().'
'); %lt=&Apache::lonlocal::texthash( 'dp' => "Drop Students", 'ca' => "check all", @@ -1969,15 +2101,15 @@ sub print_first_courselist_upload_form { $str .= "

\n"; $str .= ''."\n"; - $str .= ' '. - &mt('Ignore First Line')."

\n"; + $str .= '

\n"; $str .= &Apache::loncommon::help_open_topic("Course_Create_Class_List", &mt("How do I create a class 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"; - $str .= "\n\n"; + $str .= &Apache::loncommon::end_page(); $r->print($str); return; } @@ -1987,24 +2119,24 @@ sub upfile_drop_add { my $r=shift; &Apache::loncommon::load_tmp_file($r); my @studentdata=&Apache::loncommon::upfile_record_sep(); - if($ENV{'form.noFirstLine'}){shift(@studentdata);} - my @keyfields = split(/\,/,$ENV{'form.keyfields'}); - my $cid = $ENV{'request.course.id'}; + if($env{'form.noFirstLine'}){shift(@studentdata);} + my @keyfields = split(/\,/,$env{'form.keyfields'}); + my $cid = $env{'request.course.id'}; my %fields=(); - for (my $i=0; $i<=$ENV{'form.nfields'}; $i++) { - if ($ENV{'form.upfile_associate'} eq 'reverse') { - if ($ENV{'form.f'.$i} ne 'none') { - $fields{$keyfields[$i]}=$ENV{'form.f'.$i}; + for (my $i=0; $i<=$env{'form.nfields'}; $i++) { + if ($env{'form.upfile_associate'} eq 'reverse') { + if ($env{'form.f'.$i} ne 'none') { + $fields{$keyfields[$i]}=$env{'form.f'.$i}; } } else { - $fields{$ENV{'form.f'.$i}}=$keyfields[$i]; + $fields{$env{'form.f'.$i}}=$keyfields[$i]; } } # # Store the field choices away foreach my $field (qw/username names fname mname lname gen id sec ipwd email/) { - $ENV{'form.'.$field.'_choice'}=$fields{$field}; + $env{'form.'.$field.'_choice'}=$fields{$field}; } &Apache::loncommon::store_course_settings('enrollment_upload', { 'username_choice' => 'scalar', @@ -2020,39 +2152,39 @@ sub upfile_drop_add { # my ($startdate,$enddate) = &get_dates_from_form(); - if ($ENV{'form.makedatesdefault'}) { + if ($env{'form.makedatesdefault'}) { $r->print(&make_dates_default($startdate,$enddate)); } # Determine domain and desired host (home server) - my $domain=$ENV{'form.lcdomain'}; - my $desiredhost = $ENV{'form.lcserver'}; + 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')); - $r->print("\n\n"); + $r->print(&Apache::loncommon::end_page()); return; } } # Determine authentication mechanism my $amode = ''; my $genpwd = ''; - if ($ENV{'form.login'} eq 'krb') { + if ($env{'form.login'} eq 'krb') { $amode='krb'; - $amode.=$ENV{'form.krbver'}; - $genpwd=$ENV{'form.krbarg'}; - } elsif ($ENV{'form.login'} eq 'int') { + $amode.=$env{'form.krbver'}; + $genpwd=$env{'form.krbarg'}; + } elsif ($env{'form.login'} eq 'int') { $amode='internal'; - if ((defined($ENV{'form.intarg'})) && ($ENV{'form.intarg'})) { - $genpwd=$ENV{'form.intarg'}; + if ((defined($env{'form.intarg'})) && ($env{'form.intarg'})) { + $genpwd=$env{'form.intarg'}; } - } elsif ($ENV{'form.login'} eq 'loc') { + } elsif ($env{'form.login'} eq 'loc') { $amode='localauth'; - if ((defined($ENV{'form.locarg'})) && ($ENV{'form.locarg'})) { - $genpwd=$ENV{'form.locarg'}; + if ((defined($env{'form.locarg'})) && ($env{'form.locarg'})) { + $genpwd=$env{'form.locarg'}; } } if ($amode =~ /^krb/) { @@ -2063,7 +2195,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 ## ####################################### @@ -2071,6 +2204,8 @@ sub upfile_drop_add { my $count=0; my $flushc=0; my %student=(); + # Get information about course groups + my %curr_groups = &Apache::longroup::coursegroups(); # Get new classlist foreach (@studentdata) { my %entries=&Apache::loncommon::record_sep($_); @@ -2095,7 +2230,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). @@ -2111,6 +2247,17 @@ sub upfile_drop_add { } # remove non alphanumeric values from section $sec =~ s/\W//g; + if ($sec eq "none" || $sec eq 'all') { + $r->print('
'. + &mt('[_1]: Unable to enroll: section name "[_2]" for user [_3] [_4] [_5] [_6] is a reserved word.', + $username,$sec,$fname,$mname,$lname,$gen)); + next; + } elsif (($sec ne '') && (exists($curr_groups{$sec}))) { + $r->print('
'. + &mt('[_1]: Unable to enroll: section name "[_2]" for user [_3] [_4] [_5] [_6] is a course group. Section names and group names must be distinct.', + $username,$sec,$fname,$mname,$lname,$gen)); + next; + } # determine student id number my $id=''; if (defined($fields{'id'})) { @@ -2143,13 +2290,13 @@ sub upfile_drop_add { \$lname,\$gen,\$sec) { $$_ =~ s/(\s+$|^\s+)//g; } - if ($password || $ENV{'form.login'} eq 'loc') { + if ($password || $env{'form.login'} eq 'loc') { &modifystudent($domain,$username,$cid,$sec, $desiredhost); my $reply=&Apache::lonnet::modifystudent ($domain,$username,$id,$amode,$password, $fname,$mname,$lname,$gen,$sec,$enddate, - $startdate,$ENV{'form.forceid'},$desiredhost, + $startdate,$env{'form.forceid'},$desiredhost, $email); if ($reply ne 'ok') { $reply =~ s/^error://; @@ -2180,7 +2327,7 @@ sub upfile_drop_add { ##################################### # Drop students # ##################################### - if ($ENV{'form.fullup'} eq 'yes') { + if ($env{'form.fullup'} eq 'yes') { $r->print('

'.&mt('Dropping Students')."

\n"); # Get current classlist my ($classlist,$keylist)=&Apache::loncoursedata::get_classlist(); @@ -2208,16 +2355,11 @@ sub upfile_drop_add { sub drop_student_list { my $r=shift; my $count=0; - my @droplist; - if (ref($ENV{'form.droplist'})) { - @droplist = @{$ENV{'form.droplist'}}; - } else { - @droplist = ($ENV{'form.droplist'}); - } + my @droplist = &Apache::loncommon::get_env_multiple('form.droplist'); foreach (@droplist) { my ($uname,$udom)=split(/\:/,$_); # drop student - my $result = &modifystudent($udom,$uname,$ENV{'request.course.id'}); + my $result = &modifystudent($udom,$uname,$env{'request.course.id'}); if ($result eq 'ok' || $result eq 'ok:') { $r->print(&mt('Dropped [_1]',$uname.'@'.$udom).'
'); $count++; @@ -2231,6 +2373,33 @@ sub drop_student_list { $r->print('

'.&mt('Re-enrollment will re-activate data.')) if ($count); } +sub section_check_js { + my $groupslist; + my %curr_groups = &Apache::longroup::coursegroups(); + if (%curr_groups) { + $groupslist = join('","',sort(keys(%curr_groups))); + } + return <<"END"; +function validate(caller) { + var groups = new Array("$groupslist"); + var secname = caller.value; + if ((secname == 'all') || (secname == 'none')) { + alert("'"+secname+"' may not be used as the name for a section, as it is a reserved word.\\nPlease choose a different section name."); + return 'error'; + } + if (secname != '') { + for (var k=0; k"Enrollment Manager", faq=>9,bug=>'Instructor Interface',}); # Needs to be in a course - if (! ($ENV{'request.course.fn'})) { + if (! ($env{'request.course.fn'})) { # Not in a course - $ENV{'user.error.msg'}= - "/adm/dropadd:cst:0:0:Cannot drop or add students"; + $env{'user.error.msg'}= + "/adm/dropadd:cst:0:0:Cannot manage or view course groups, ". + "or drop or add students"; return HTTP_NOT_ACCEPTABLE; } # my $view_permission = - &Apache::lonnet::allowed('vcl',$ENV{'request.course.id'}); + &Apache::lonnet::allowed('vcl',$env{'request.course.id'}); my $enrl_permission = - &Apache::lonnet::allowed('cst',$ENV{'request.course.id'}); - if (! $view_permission && ! $enrl_permission) { - $ENV{'user.error.msg'}= - "/adm/dropadd:cst:0:0:Cannot drop or add students"; - return HTTP_NOT_ACCEPTABLE; + &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'}); + + + if (! $grp_view_permission && ! $grp_manage_permission && + ! $view_permission && ! $enrl_permission) { + $env{'user.error.msg'}= + "/adm/coursegroups:cst:0:0:Cannot manage or view course groups, ". + "or drop or add students"; + return HTTP_NOT_ACCEPTABLE; } + # # Only output the header information if they did not request csv format # - &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, - ['state','action']); # Start page &Apache::loncommon::content_type($r,'text/html'); $r->send_http_header; $r->print(&header()); # # Main switch on form.action and form.state, as appropriate - if (! exists($ENV{'form.action'})) { - $r->print(&Apache::lonhtmlcommon::breadcrumbs - (undef,'Enrollment Manager')); - &print_main_menu($r,$enrl_permission,$view_permission); - } elsif ($ENV{'form.action'} eq 'upload' && $enrl_permission) { + 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) { &Apache::lonhtmlcommon::add_breadcrumb ({href=>'/adm/dropadd?action=upload&state=', text=>"Upload Classlist"}); - $r->print(&Apache::lonhtmlcommon::breadcrumbs - (undef,'Upload Classlist','Course_Create_Class_List')); - if (! exists($ENV{'form.state'})) { + $r->print(&Apache::lonhtmlcommon::breadcrumbs('Upload Classlist', + 'Course_Create_Class_List')); + if (! exists($env{'form.state'})) { &print_first_courselist_upload_form($r); - } elsif ($ENV{'form.state'} eq 'got_file') { + } elsif ($env{'form.state'} eq 'got_file') { &print_upload_manager_form($r); - } elsif ($ENV{'form.state'} eq 'enrolling') { - if ($ENV{'form.datatoken'}) { + } elsif ($env{'form.state'} eq 'enrolling') { + if ($env{'form.datatoken'}) { &upfile_drop_add($r); } else { # Hmmm, this is an error @@ -2331,60 +2509,60 @@ sub handler { } else { &print_first_courselist_upload_form($r); } - } elsif ($ENV{'form.action'} eq 'drop' && $enrl_permission) { + } elsif ($env{'form.action'} eq 'drop' && $enrl_permission) { &Apache::lonhtmlcommon::add_breadcrumb ({href=>'/adm/dropadd?action=drop', text=>"Drop Students"}); - $r->print(&Apache::lonhtmlcommon::breadcrumbs - (undef,'Drop Students','Course_Drop_Student')); - if (! exists($ENV{'form.state'})) { + $r->print(&Apache::lonhtmlcommon::breadcrumbs('Drop Students', + 'Course_Drop_Student')); + if (! exists($env{'form.state'})) { &print_drop_menu($r); - } elsif ($ENV{'form.state'} eq 'done') { + } elsif ($env{'form.state'} eq 'done') { &drop_student_list($r); } else { &print_drop_menu($r); } - } elsif ($ENV{'form.action'} eq 'enrollstudent' && $enrl_permission) { + } elsif ($env{'form.action'} eq 'enrollstudent' && $enrl_permission) { &Apache::lonhtmlcommon::add_breadcrumb ({href=>'/adm/dropadd?action=enrollstudent', text=>"Enroll Student"}); - $r->print(&Apache::lonhtmlcommon::breadcrumbs - (undef,'Enroll Student','Course_Add_Student')); - if (! exists($ENV{'form.state'})) { + $r->print(&Apache::lonhtmlcommon::breadcrumbs('Enroll Student', + 'Course_Add_Student')); + if (! exists($env{'form.state'})) { &get_student_username_domain_form($r); - } elsif ($ENV{'form.state'} eq 'gotusername') { + } elsif ($env{'form.state'} eq 'gotusername') { &print_enroll_single_student_form($r); - } elsif ($ENV{'form.state'} eq 'enrolling') { + } elsif ($env{'form.state'} eq 'enrolling') { &enroll_single_student($r); } else { &get_student_username_domain_form($r); } - } elsif ($ENV{'form.action'} eq 'classlist' && $view_permission) { + } elsif ($env{'form.action'} eq 'classlist' && $view_permission) { &Apache::lonhtmlcommon::add_breadcrumb ({href=>'/adm/dropadd?action=classlist', text=>"View Classlist"}); - $r->print(&Apache::lonhtmlcommon::breadcrumbs - (undef,'View Classlist','Course_View_Class_List')); - if (! exists($ENV{'form.state'})) { + $r->print(&Apache::lonhtmlcommon::breadcrumbs('View Classlist', + 'Course_View_Class_List')); + if (! exists($env{'form.state'})) { &print_html_classlist($r,undef); - } elsif ($ENV{'form.state'} eq 'csv') { + } elsif ($env{'form.state'} eq 'csv') { &print_html_classlist($r,'csv'); - } elsif ($ENV{'form.state'} eq 'excel') { + } elsif ($env{'form.state'} eq 'excel') { &print_html_classlist($r,'excel'); } else { &print_html_classlist($r,undef); } - } elsif ($ENV{'form.action'} eq 'modifystudent' && $enrl_permission) { + } elsif ($env{'form.action'} eq 'modifystudent' && $enrl_permission) { &Apache::lonhtmlcommon::add_breadcrumb ({href=>'/adm/dropadd?action=modifystudent', text=>"Modify Student Data"}); - $r->print(&Apache::lonhtmlcommon::breadcrumbs - (undef,'Modify Student Data','Course_Modify_Student_Data')); - if (! exists($ENV{'form.state'})) { + $r->print(&Apache::lonhtmlcommon::breadcrumbs('Modify Student Data', + 'Course_Modify_Student_Data')); + if (! exists($env{'form.state'})) { &print_html_classlist($r); - } elsif ($ENV{'form.state'} eq 'selected') { + } elsif ($env{'form.state'} eq 'selected') { &print_modify_student_form($r); - } elsif ($ENV{'form.state'} eq 'done') { + } elsif ($env{'form.state'} eq 'done') { &modify_single_student($r); } else { &print_html_classlist($r); @@ -2392,15 +2570,14 @@ sub handler { } else { # We should not end up here, but I guess it is possible &Apache::lonnet::logthis("Undetermined state in londropadd.pm. ". - "form.action = ".$ENV{'form.action'}. + "form.action = ".$env{'form.action'}. "Someone should fix this."); - $r->print(&Apache::lonhtmlcommon::breadcrumbs - (undef,'Enrollment Manager')); + $r->print(&Apache::lonhtmlcommon::breadcrumbs('Enrollment Manager')); &print_main_menu($r,$enrl_permission,$view_permission); } # # Finish up - $r->print(''); + $r->print(''.&Apache::loncommon::end_page()); return OK; }