--- loncom/interface/Attic/londropadd.pm 2004/03/17 19:56:47 1.108 +++ loncom/interface/Attic/londropadd.pm 2004/11/12 16:34:15 1.121 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Handler to drop and add students in courses # -# $Id: londropadd.pm,v 1.108 2004/03/17 19:56:47 matthew Exp $ +# $Id: londropadd.pm,v 1.121 2004/11/12 16:34:15 matthew Exp $ # # Copyright Michigan State University Board of Trustees # @@ -37,6 +37,7 @@ use Apache::loncommon(); use Apache::lonhtmlcommon(); use Apache::Constants qw(:common :http REDIRECT); use Spreadsheet::WriteExcel; +use Apache::lonstathelpers(); use Apache::lonlocal; ############################################################### @@ -135,47 +136,61 @@ sub domain_form { ############################################################### # Menu Phase One sub print_main_menu { - my $r=shift; - my %Text = &Apache::lonlocal::texthash - ('upload' => 'Upload a class list', - 'enrollone' => 'Enroll a single student', - 'modify' => 'Modify student data', - 'view' => 'View Class List', - 'drop' => 'Drop Students', - 'populate' => 'Automated Enrollment Manager'); - my %help=(); - foreach ('Course_Drop_Student','Course_Add_Student', - 'Course_Modify_Student_Data','Course_View_Class_List', - 'Course_Create_Class_List') { - $help{$_}=&Apache::loncommon::help_open_topic($_); + my ($r,$enrl_permission,$view_permission)=@_; + # + my ($cdom,$cnum) = split/_/,$ENV{'request.course.id'}; + my @menu = + ( + { text => 'Uploade a class list', + help => 'Course_Create_Class_List', + action => 'upload', + permission => $enrl_permission, + }, + { text => 'Enroll a single student', + help => 'Course_Add_Student', + action => 'enrollstudent', + permission => $enrl_permission, + }, + { text => 'Modify student data', + help => 'Course_Modify_Student_Data', + action => 'modifystudent', + permission => $enrl_permission, + }, + { text => 'View Class List', + help => 'Course_View_Class_List', + action => 'classlist', + permission => $view_permission, + }, + { text => 'Drop Students', + help => 'Course_Drop_Student', + action => 'drop', + permission => $enrl_permission, + }, + { text => 'Automated Enrollment Manager', + permission => &Apache::lonnet::auto_run($cnum,$cdom), + url => '/adm/populate', + }, + ); + my $menu_html = ''; + foreach my $menu_item (@menu) { + next if (! $menu_item->{'permission'}); + $menu_html.='

'; + $menu_html.=''; + if (exists($menu_item->{'url'})) { + $menu_html.=qq{}; + } else { + $menu_html.= + qq{}; + } + $menu_html.= &mt($menu_item->{'text'}).''; + if (exists($menu_item->{'help'})) { + $menu_html.= + &Apache::loncommon::help_open_topic($menu_item->{'help'}); + } + $menu_html.='

'.$/; } - - $r->print(< - -$Text{'upload'} -$help{'Course_Create_Class_List'} -

- - $Text{'enrollone'} - $help{'Course_Add_Student'} -

- - $Text{'modify'} - $help{'Course_Modify_Student_Data'} -

- - $Text{'view'} - $help{'Course_View_Class_List'} -

- - $Text{'drop'} - $help{'Course_Drop_Student'} -

- - $Text{'populate'} - -END + $r->print($menu_html); + return; } ############################################################### @@ -303,7 +318,7 @@ END return; } // alert('current.radiovalue = '+current.radiovalue); - if (current.radiovalue == null || current.radiovalue == 'nochange') { + if (current.radiovalue == null || current.radiovalue == '' || current.radiovalue == 'nochange') { // They did not check any of the login radiobuttons. alert('$alert{'authen'}'); return; @@ -780,7 +795,7 @@ sub setup_date_selectors { my ($starttime,$endtime,$mode) = @_; if (! defined($starttime)) { $starttime = time; - unless ($mode eq 'createcourse') { + unless ($mode eq 'create_enrolldates' || $mode eq 'create_defaultdates') { if (exists($ENV{'course.'.$ENV{'request.course.id'}. '.default_enrollment_start_date'})) { $starttime = $ENV{'course.'.$ENV{'request.course.id'}. @@ -804,12 +819,20 @@ sub setup_date_selectors { my $enddateform = &Apache::lonhtmlcommon::date_setter('studentform', 'enddate', $endtime); - if ($mode eq 'createcourse') { + if ($mode eq 'create_enrolldates') { $startdateform = &Apache::lonhtmlcommon::date_setter('ccrs', - 'startdate', + 'startenroll', $starttime); $enddateform = &Apache::lonhtmlcommon::date_setter('ccrs', - 'enddate', + 'endenroll', + $endtime); + } + if ($mode eq 'create_defaultdates') { + $startdateform = &Apache::lonhtmlcommon::date_setter('ccrs', + 'startaccess', + $starttime); + $enddateform = &Apache::lonhtmlcommon::date_setter('ccrs', + 'endaccess', $endtime); } return ($startdateform,$enddateform); @@ -830,7 +853,7 @@ sub date_setting_table { my $dateDefault = ''. ' '. &mt('make these dates the default for future enrollment'); - if ($mode eq 'createcourse') { + if ($mode eq 'create_enrolldates' || $mode eq 'create_defaultdates') { $dateDefault = ' '; } my $perpetual = ''; + if ($mode eq 'create_enrolldates') { + $perpetual = ' '; + } my $result = ''; $result .= "\n"; $result .= ''. @@ -897,6 +923,10 @@ sub get_student_username_domain_form {
'.&mt('Starting Date').'
+ END return; } @@ -907,6 +937,8 @@ sub print_enroll_single_student_form { # my $username = $ENV{'form.cuname'}; my $domain = $ENV{'form.cudomain'}; + $username=~s/[\W|_]//gs; + $domain=~s/[\W|_]//gs; 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; @@ -1115,21 +1147,28 @@ sub print_html_classlist { # # List course personnel my %coursepersonnel=&Apache::lonnet::get_course_adv_roles($cdom.'/'.$cnum); + # + if (! defined($ENV{'form.output'}) || + $ENV{'form.output'} !~ /^(csv|excel|html)$/ ) { + $ENV{'form.output'} = 'html'; + } + # $r->print('
'); - foreach (sort keys %coursepersonnel) { - $r->print(''); } $r->print('
'.$_.''); - foreach (split(/\,/,$coursepersonnel{$_})) { - my ($puname,$pudom)=split(/\:/,$_); + foreach my $role (sort keys %coursepersonnel) { + next if ($role =~ /^\s*$/); + $r->print('
'.$role.''); + foreach my $user (split(',',$coursepersonnel{$role})) { + my ($puname,$pudom)=split(':',$user); $r->print(' '.&Apache::loncommon::aboutmewrapper( - &Apache::loncommon::plainname($puname, - $pudom),$puname,$pudom)); + &Apache::loncommon::plainname($puname, + $pudom), + $puname,$pudom)); } $r->print('
'); # # Interface output - my $CCL=&mt('Current Class List'); $r->print(''); $r->print("

\n"); @@ -1137,14 +1176,10 @@ sub print_html_classlist { my %lt=&Apache::lonlocal::texthash('csv' => "CSV", 'excel' => "Excel", 'html' => 'HTML'); - $r->print(''); - my $output_selector = ''; foreach my $outputformat ('html','csv','excel') { my $option = '

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

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

'); @@ -1166,13 +1200,10 @@ sub print_html_classlist { } else { # Print out the available choices if ($ENV{'form.action'} eq 'modifystudent') { - &show_class_list($r,'view','modify','modifystudent', + &show_class_list($r,'view','modify', $ENV{'form.Status'},$classlist,$keylist); - } elsif (! defined($mode) || $mode eq '') { - &show_class_list($r,'view','aboutme','classlist', - $ENV{'form.Status'},$classlist,$keylist); - } elsif ($mode eq 'csv' || $mode eq 'excel') { - &show_class_list($r,$mode,'nolink','csv', + } else { + &show_class_list($r,$ENV{'form.output'},'aboutme', $ENV{'form.Status'},$classlist,$keylist); } } @@ -1180,7 +1211,7 @@ sub print_html_classlist { # =================================================== Show student list to drop sub show_class_list { - my ($r,$mode,$linkto,$action,$statusmode,$classlist,$keylist)=@_; + my ($r,$mode,$linkto,$statusmode,$classlist,$keylist)=@_; my $cid=$ENV{'request.course.id'}; # # Variables for excel output @@ -1190,36 +1221,55 @@ sub show_class_list { my ($CSVfile,$CSVfilename); # my $sortby = $ENV{'form.sortby'}; - if ($sortby !~ /^(username|domain|section|fullname|id)$/) { + if ($sortby !~ /^(username|domain|section|fullname|id|start|end|type)$/) { $sortby = 'username'; } # Print out header + unless ($mode eq 'autoenroll') { + $r->print(< +END + } $r->print(< - - END - if ($mode eq 'view') { + if ($mode eq 'html' || $mode eq 'view' || $mode eq 'autoenroll') { if ($linkto eq 'aboutme') { $r->print(&mt('Select a user name to view the users personal page.')); } elsif ($linkto eq 'modify') { $r->print(&mt('Select a user name to modify the students information')); } my %lt=&Apache::lonlocal::texthash( - 'usrn' => "username", - 'dom' => "domain", - 'sn' => "student name", - 'sec' => "section", + 'usrn' => "username", + 'dom' => "domain", + 'sn' => "student name", + 'sec' => "section", + 'start' => "start date", + 'end' => "end date", + 'type' => "enroll type/action" ); - $r->print(< + unless ($mode eq 'autoenroll') { + $r->print(< +END + } + $r->print("

- + "); + if ($mode eq 'autoenroll') { + $r->print(" + + "); + } else { + $r->print(" + + "); + } + $r->print(< $lt{'usrn'} - + END } elsif ($mode eq 'csv') { # @@ -1254,12 +1308,12 @@ END print $CSVfile '"'.join('","',map { &Apache::loncommon::csv_translate(&mt($_)) } ("username","domain","ID","student name", - "section","status")).'"'."\n"; + "section","start date","end date","status")).'"'."\n"; } else { print $CSVfile '"'.join('","',map { &Apache::loncommon::csv_translate(&mt($_)) } ("username","domain","ID","student name", - "section")).'"'."\n"; + "section","start date","end date")).'"'."\n"; } } elsif ($mode eq 'excel') { # Create the excel spreadsheet @@ -1278,7 +1332,9 @@ END $excel_sheet->write($row++,0,$description,$format->{'h1'}); # $excel_sheet->write($row++,0,["username","domain","ID", - "student name","section","status"],$format->{'bold'}); + "student name","section", + "start date","end date","status"], + $format->{'bold'}); } # # Sort the students @@ -1298,16 +1354,57 @@ END lc($classlist->{$a}->[$third]) cmp lc($classlist->{$b}->[$third]) } (keys(%$classlist)); my $studentcount = 0; + my $autocount = 0; + my $manualcount = 0; + my $unlockcount = 0; + my $lockcount = 0; foreach my $student (@Sorted_Students) { - my $username = $classlist->{$student}->[$index{'username'}]; - my $domain = $classlist->{$student}->[$index{'domain'}]; - my $section = $classlist->{$student}->[$index{'section'}]; - my $name = $classlist->{$student}->[$index{'fullname'}]; - my $id = $classlist->{$student}->[$index{'id'}]; - my $status = $classlist->{$student}->[$index{'status'}]; + my $sdata = $classlist->{$student}; + my $username = $sdata->[$index{'username'}]; + my $domain = $sdata->[$index{'domain'}]; + my $section = $sdata->[$index{'section'}]; + my $name = $sdata->[$index{'fullname'}]; + my $id = $sdata->[$index{'id'}]; + my $status = $sdata->[$index{'status'}]; + my $start = $sdata->[$index{'start'}]; + my $end = $sdata->[$index{'end'}]; + my $type = $sdata->[$index{'type'}]; next if (($statusmode ne 'Any') && ($status ne $statusmode)); - if ($mode eq 'view') { - $r->print("\n \n "); + if ($mode eq 'autoenroll') { + my $lockedtype = $sdata->[$index{'lockedtype'}]; + $studentcount++; + my $cellentry; + if ($type eq 'auto') { + $cellentry = ''.&mt('auto').'  Change'; + $autocount ++; + } else { + $cellentry = '
Count - +
$lt{'type'}Count $lt{'dom'} @@ -1229,8 +1279,12 @@ END $lt{'sn'} $lt{'sec'} + + $lt{'start'} + + $lt{'end'}
".(++$studentcount)."\n "); + if ($mode eq 'view' || $mode eq 'html' || $mode eq 'autoenroll') { + if (! defined($start) || $start == 0) { + $start = &mt('none'); + } else { + $start = &Apache::lonlocal::locallocaltime($start); + } + if (! defined($end) || $end == 0) { + $end = &mt('none'); + } else { + $end = &Apache::lonlocal::locallocaltime($end); + } + $r->print("
'.&mt('manual').' Change
'; + $manualcount ++; + if ($lockedtype) { + $cellentry .= ' '.&mt('Unlock'); + $unlockcount ++; + } else { + $cellentry .= ' '.&mt('Lock'); + $lockcount ++; + } + $cellentry .= '
'; + } + $r->print("$cellentry\n "); + } else { + $r->print("".(++$studentcount)."\n "); + } if ($linkto eq 'nothing') { $r->print($username); } elsif ($linkto eq 'aboutme') { @@ -1329,13 +1426,25 @@ END $id $name $section - + $start + $end + END } elsif ($mode eq 'csv') { next if (! defined($CSVfile)); # no need to bother with $linkto + if (! defined($start) || $start == 0) { + $start = &mt('none'); + } else { + $start = &Apache::lonlocal::locallocaltime($start); + } + if (! defined($end) || $end == 0) { + $end = &mt('none'); + } else { + $end = &Apache::lonlocal::locallocaltime($end); + } my @line = (); - foreach ($username,$domain,$id,$name,$section) { + foreach ($username,$domain,$id,$name,$section,$start,$end) { push @line,&Apache::loncommon::csv_translate($_); } if ($statusmode eq 'Any') { @@ -1343,11 +1452,19 @@ END } print $CSVfile '"'.join('","',@line).'"'."\n"; } elsif ($mode eq 'excel') { - $excel_sheet->write($row++,0,[$username,$domain,$id, - $name,$section,$status]); + $excel_sheet->write($row,0,[$username,$domain,$id, + $name,$section]); + my $col = 5; + foreach my $time ($start,$end) { + $excel_sheet->write($row,$col++, + &Apache::lonstathelpers::calc_serial($time), + $format->{'date'}); + } + $excel_sheet->write($row,$col++,$status); + $row++; } } - if ($mode eq 'view') { + if ($mode eq 'view' || $mode eq 'html' || $mode eq 'autoenroll') { $r->print('
'); } elsif ($mode eq 'excel') { $excel_workbook->close(); @@ -1360,6 +1477,10 @@ END "\n"); $r->rflush(); } + if ($mode eq 'autoenroll') { + return ($studentcount,$autocount,$manualcount,$lockcount,$unlockcount); + } + return; } @@ -1694,7 +1815,7 @@ sub show_drop_list { ['sortby']); } my $sortby = $ENV{'form.sortby'}; - if ($sortby !~ /^(username|domain|section|fullname|id)$/) { + if ($sortby !~ /^(username|domain|section|fullname|id|start|end)$/) { $sortby = 'username'; } # @@ -1718,13 +1839,14 @@ function uncheckAll(field) { END +my %lt=&Apache::lonlocal::texthash('usrn' => "username", + 'dom' => "domain", + 'sn' => "student name", + 'sec' => "section", + 'start' => "start date", + 'end' => "end date", + ); if ($nosort) { - my %lt=&Apache::lonlocal::texthash( - 'usrn' => "username", - 'dom' => "domain", - 'sn' => "student name", - 'sec' => "section", - ); $r->print(< @@ -1734,16 +1856,12 @@ END ID $lt{'sn'} $lt{'sec'} + $lt{'start'} + $lt{'end'} END } else { - my %lt=&Apache::lonlocal::texthash( - 'usrn' => "username", - 'dom' => "domain", - 'sn' => "student name", - 'sec' => "section", - ); $r->print(<   @@ -1757,6 +1875,10 @@ END $lt{'sn'} $lt{'sec'} + + $lt{'start'} + + $lt{'end'} END @@ -1780,12 +1902,25 @@ END } (keys(%$classlist)); foreach my $student (@Sorted_Students) { my $error; - my $username = $classlist->{$student}->[$index{'username'}]; - my $domain = $classlist->{$student}->[$index{'domain'}]; - my $section = $classlist->{$student}->[$index{'section'}]; - my $name = $classlist->{$student}->[$index{'fullname'}]; - my $id = $classlist->{$student}->[$index{'id'}]; - my $status = $classlist->{$student}->[$index{'status'}]; + my $sdata = $classlist->{$student}; + my $username = $sdata->[$index{'username'}]; + my $domain = $sdata->[$index{'domain'}]; + my $section = $sdata->[$index{'section'}]; + my $name = $sdata->[$index{'fullname'}]; + my $id = $sdata->[$index{'id'}]; + my $start = $sdata->[$index{'start'}]; + my $end = $sdata->[$index{'end'}]; + if (! defined($start) || $start == 0) { + $start = &mt('none'); + } else { + $start = &Apache::lonlocal::locallocaltime($start); + } + if (! defined($end) || $end == 0) { + $end = &mt('none'); + } else { + $end = &Apache::lonlocal::locallocaltime($end); + } + my $status = $sdata->[$index{'status'}]; next if ($status ne 'Active'); # $r->print(<<"END"); @@ -1796,11 +1931,13 @@ END $id $name $section + $start + $end END } $r->print('
'); - my %lt=&Apache::lonlocal::texthash( + %lt=&Apache::lonlocal::texthash( 'dp' => "Drop Students", 'ca' => "check all", 'ua' => "uncheck all", @@ -2140,14 +2277,23 @@ sub handler { text=>"Enrollment Manager", faq=>9,bug=>'Instructor Interface',}); # Needs to be in a course - if (! (($ENV{'request.course.fn'}) && - (&Apache::lonnet::allowed('cst',$ENV{'request.course.id'})))) { - # Not in a course, or not allowed to modify parms + if (! ($ENV{'request.course.fn'})) { + # Not in a course $ENV{'user.error.msg'}= "/adm/dropadd:cst:0:0:Cannot drop or add students"; 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'}); + if (! $view_permission && ! $enrl_permission) { + $ENV{'user.error.msg'}= + "/adm/dropadd:cst:0:0:Cannot 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'}, @@ -2161,13 +2307,13 @@ sub handler { if (! exists($ENV{'form.action'})) { $r->print(&Apache::lonhtmlcommon::breadcrumbs (undef,'Enrollment Manager')); - &print_main_menu($r); - } elsif ($ENV{'form.action'} eq 'upload') { + &print_main_menu($r,$enrl_permission,$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')); + (undef,'Upload Classlist','Course_Create_Class_List')); if (! exists($ENV{'form.state'})) { &print_first_courselist_upload_form($r); } elsif ($ENV{'form.state'} eq 'got_file') { @@ -2181,12 +2327,12 @@ sub handler { } else { &print_first_courselist_upload_form($r); } - } elsif ($ENV{'form.action'} eq 'drop') { + } 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')); + (undef,'Drop Students','Course_Drop_Student')); if (! exists($ENV{'form.state'})) { &print_drop_menu($r); } elsif ($ENV{'form.state'} eq 'done') { @@ -2194,12 +2340,12 @@ sub handler { } else { &print_drop_menu($r); } - } elsif ($ENV{'form.action'} eq 'enrollstudent') { + } 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')); + (undef,'Enroll Student','Course_Add_Student')); if (! exists($ENV{'form.state'})) { &get_student_username_domain_form($r); } elsif ($ENV{'form.state'} eq 'gotusername') { @@ -2209,12 +2355,12 @@ sub handler { } else { &get_student_username_domain_form($r); } - } elsif ($ENV{'form.action'} eq 'classlist') { + } 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')); + (undef,'View Classlist','Course_View_Class_List')); if (! exists($ENV{'form.state'})) { &print_html_classlist($r,undef); } elsif ($ENV{'form.state'} eq 'csv') { @@ -2224,12 +2370,12 @@ sub handler { } else { &print_html_classlist($r,undef); } - } elsif ($ENV{'form.action'} eq 'modifystudent') { + } 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')); + (undef,'Modify Student Data','Course_Modify_Student_Data')); if (! exists($ENV{'form.state'})) { &print_html_classlist($r); } elsif ($ENV{'form.state'} eq 'selected') { @@ -2246,7 +2392,7 @@ sub handler { "Someone should fix this."); $r->print(&Apache::lonhtmlcommon::breadcrumbs (undef,'Enrollment Manager')); - &print_main_menu($r); + &print_main_menu($r,$enrl_permission,$view_permission); } # # Finish up