--- loncom/interface/Attic/londropadd.pm 2002/04/15 23:37:37 1.24 +++ loncom/interface/Attic/londropadd.pm 2002/04/16 21:02:17 1.26 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Handler to drop and add students in courses # -# $Id: londropadd.pm,v 1.24 2002/04/15 23:37:37 albertel Exp $ +# $Id: londropadd.pm,v 1.26 2002/04/16 21:02:17 matthew Exp $ # # Copyright Michigan State University Board of Trustees # @@ -75,42 +75,37 @@ ENDHEAD } # =========== Drop student from all sections of a course, except optional $csec - -sub dropstudent { - my ($udom,$unam,$courseid,$csec)=@_; - $courseid=~s/\_/\//g; - $courseid=~s/^(\w)/\/$1/; - foreach (split(/\&/, - &Apache::lonnet::reply('dump:'.$udom.':'.$unam.':roles', - &Apache::lonnet::homeserver($unam,$udom)))) { - my ($key,$value)=split(/\=/,$_); - $key=&Apache::lonnet::unescape($key); - if ($key=~/^$courseid(?:\/)*(\w+)*\_st$/) { - my $section=$1; - if ($key eq $courseid.'_st') { $section=''; } - if (((!$section) && (!$csec)) || ($section ne $csec)) { - my ($dummy,$end,$start)=split(/\_/, - &Apache::lonnet::unescape($value)); - my $now=time; - my $notactive=0; - if ($start) { - if ($now<$start) { $notactive=1; } - } - if ($end) { - if ($now>$end) { $notactive=1; } - } - unless ($notactive) { - my $reply=&Apache::lonnet::modifystudent( - $udom,$unam,'','','', - '','','','',$section,time); +sub modifystudent { + my ($udom,$unam,$courseid,$csec)=@_; + # 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 %roles = &Apache::lonnet::dump('roles',$udom,$unam); + my ($tmp) = keys(%roles); + # Bail out if we were unable to get the students roles + return if ($tmp =~ /^(con_lost|error|no_such_host)/i); + # Go through the roles looking for enrollment in this course + foreach my $course (keys(%roles)) { + my $value = $roles{$course}; + if ($course=~/^$courseid(?:\/)*(\w+)*\_st$/) { + # We are in this course + my $section=$1; + $section='' if ($course eq $courseid.'_st'); + if (((!$section) && (!$csec)) || ($section ne $csec)) { + my (undef,$end,$start)=split(/\_/,$course); + my $now=time; + if (($start) && ($end) && ($now>$start) && ($now<$end)) { + my $reply=&Apache::lonnet::modifystudent + ($udom,$unam,'','','','','','','',$section,time); + } } - } } } } # ============================================================== Menu Phase One - sub menu_phase_one { my $r=shift; my $upfile_select=&Apache::loncommon::upfile_select_html(); @@ -129,7 +124,6 @@ $upfile_select ENDUPFORM } - sub phase_two_header { my ($r,$datatoken,$distotal,$krbdefdom)=@_; my $javascript; @@ -145,16 +139,16 @@ sub phase_two_header { Total number of records found in file: $distotal
Note: this will not take effect if the user already exists
- + Kerberos authenticated with domain - +
- + Internally authenticated (with initial password -) +)
- + Local Authentication with argument - +
@@ -459,13 +452,12 @@ LON-CAPA domain: Disable ID/Student Number Safeguard and Force Change of Conflicting IDs (only do if you know what you are doing)
-
+
Note: for large courses, this operation might be time consuming.
ENDPICK
}
# ======================================================= Menu Phase Two Upload
-
sub menu_phase_two_upload {
my $r=shift;
@@ -479,18 +471,13 @@ sub menu_phase_two_upload {
my @records=&Apache::loncommon::upfile_record_sep();
my $total=$#records;
my $distotal=$total+1;
-
$ENV{'SERVER_NAME'}=~/(\w+\.\w+)$/;
my $krbdefdom=$1;
$krbdefdom=~tr/a-z/A-Z/;
-
my $today=time;
my $halfyear=$today+15552000;
-
my $defdom=$r->dir_config('lonDefDomain');
-
&phase_two_header($r,$datatoken,$distotal,$krbdefdom);
-
my $i;
my $keyfields;
if ($total>=0) {
@@ -511,13 +498,10 @@ sub menu_phase_two_upload {
$keyfields=join(',',sort(keys(%sone)));
}
}
-
-
&phase_two_end($r,$i,$keyfields,$defdom,$today,$halfyear);
}
# ======================================================= Enroll single student
-
sub enroll_single_student {
my $r=shift;
$r->print('
+First Name:
+Middle Name:
+Last Name:
+Generation:
-ID/Student Number:
+
ID/Student Number:
-Group/Section:+
Group/Section:
-Domain:
-Note: login settings below will not take effect if the user already exists
- - -Kerberos authenticated with domain -
- +
Username:
+Domain:
+Note: login settings below will not take effect if the user already exists +
+ +Kerberos authenticated with domain + +
+ Internally authenticated (with initial password -) -
- +) +
+ Local Authentication with argument - -
+ +
- +>Set Starting Date +
+>Set Ending Date +
-
-
+
+
+
'. - $sname.' | '.$sdom.' | '. - $reply{$sname}.' | '. - &Apache::lonnet::unescape($reply[2]).' '. - &Apache::lonnet::unescape($reply[3]).', '. - &Apache::lonnet::unescape($reply[0]).' '. - &Apache::lonnet::unescape($reply[1]). - ' | '. - $ssec." |
username | domain | +ID | student name | generation | +section | |
---|---|---|---|---|---|---|
'. + 'Internal error: unable to get environment '. + 'for '.$sname.' in domain '.$sdom.' | ||||||
+ | $sname | +$sdom | +$reply{$sname} | +$info{'lastname'}, $info{'firstname'} $info{'middlename'} | +$info{'generation'} | +$ssec | +
Unacceptable username: '.
+ 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};
+ }
+ } else {
+ $fields{$ENV{'form.f'.$i}}=$keyfields[$i];
+ }
+ }
+ #
+ my $startdate = $ENV{'form.startdate'};
+ my $enddate = $ENV{'form.enddate'};
+ if ($startdate=~/\D/) { $startdate=''; }
+ if ($enddate=~/\D/) { $enddate=''; }
+ #
+ my $domain=$ENV{'form.lcdomain'};
+ # Determine authentication mechanism
+ my $amode = '';
+ my $genpwd = '';
+ if ($ENV{'form.login'} eq 'krb') {
+ $amode='krb4';
+ $genpwd=$ENV{'form.krbdom'};
+ } elsif ($ENV{'form.login'} eq 'int') {
+ $amode='internal';
+ if ((defined($ENV{'form.intpwd'})) && ($ENV{'form.intpwd'})) {
+ $genpwd=$ENV{'form.intpwd'};
+ }
+ } elsif ($ENV{'form.login'} eq 'loc') {
+ $amode='localauth';
+ if ((defined($ENV{'form.locarg'})) && ($ENV{'form.locarg'})) {
+ $genpwd=$ENV{'form.locarg'};
+ }
+ }
+ unless (($domain=~/\W/) || ($amode eq '')) {
+ #######################################
+ ## Enroll Students ##
+ #######################################
+ $r->print('Enrolling Students
');
+ my $count=0;
+ my $flushc=0;
+ my %student=();
+ # Get new classlist
+ foreach (@studentdata) {
+ my %entries=&Apache::loncommon::record_sep($_);
+ # Determine student name
+ unless (($entries{$fields{'username'}} eq '') ||
+ (!defined($entries{$fields{'username'}}))) {
+ my ($fname, $mname, $lname,$gen) = ('','','','');
+ if (defined($fields{'names'})) {
+ ($lname,$fname,$mname)=($entries{$fields{'names'}}=~
+ /([^\,]+)\,\s*(\w+)\s*(.*)$/);
+ } else {
+ if (defined($fields{'fname'})) {
+ $fname=$entries{$fields{'fname'}};
+ }
+ if (defined($fields{'mname'})) {
+ $mname=$entries{$fields{'mname'}};
+ }
+ if (defined($fields{'lname'})) {
+ $lname=$entries{$fields{'lname'}};
+ }
+ if (defined($fields{'gen'})) {
+ $gen=$entries{$fields{'gen'}};
+ }
+ }
+ if ($entries{$fields{'username'}}=~/\W/) {
+ $r->print('
Unacceptable username: '. $entries{$fields{'username'}}.' for user '. $fname.' '.$mname.' '.$lname.' '.$gen.'
'); - } else { - my $sec=''; - my $username=$entries{$fields{'username'}}; - if (defined($fields{'sec'})) { - if (defined($entries{$fields{'sec'}})) { - $sec=$entries{$fields{'sec'}}; - } - } - my $id=''; - if (defined($fields{'id'})) { - if (defined($entries{$fields{'id'}})) { - $id=$entries{$fields{'id'}}; - } - $id=~tr/A-Z/a-z/; - } - my $password=''; - if ($genpwd) { - $password=$genpwd; - } else { - if (defined($fields{'ipwd'})) { - if ($entries{$fields{'ipwd'}}) { - $password=$entries{$fields{'ipwd'}}; - } - } - } - if ($password) { - &dropstudent($domain,$username,$cid,$sec); - my $reply=&Apache::lonnet::modifystudent( - $domain,$username,$id,$amode,$password, - $fname,$mname,$lname,$gen,$sec,$enddate,$startdate, - $ENV{'form.forceid'}); - unless ($reply eq 'ok') { - $r->print( - "
Error enrolling $username: $reply
"); + } else { + # determine section number + my $sec=''; + my $username=$entries{$fields{'username'}}; + if (defined($fields{'sec'})) { + if (defined($entries{$fields{'sec'}})) { + $sec=$entries{$fields{'sec'}}; + } + } + # determine student id number + my $id=''; + if (defined($fields{'id'})) { + if (defined($entries{$fields{'id'}})) { + $id=$entries{$fields{'id'}}; + } + $id=~tr/A-Z/a-z/; + } + # determine student password + my $password=''; + if ($genpwd) { + $password=$genpwd; + } else { + if (defined($fields{'ipwd'})) { + if ($entries{$fields{'ipwd'}}) { + $password=$entries{$fields{'ipwd'}}; + } + } + } + if ($password) { + &modifystudent($domain,$username,$cid,$sec); + my $reply=&Apache::lonnet::modifystudent + ($domain,$username,$id,$amode,$password, + $fname,$mname,$lname,$gen,$sec,$enddate, + $startdate,$ENV{'form.forceid'}); + if ($reply ne 'ok') { + $r->print('
'. + 'Error enrolling '.$username.': '. + $reply.'
'); } else { $count++; $flushc++; $student{$username}=1; @@ -833,146 +841,117 @@ sub upfile_drop_add { $flushc=0; } } - } else { - $r->print( - "No password for $username
"); - } - } - } - } - $r->print('
Processed Students: '.$count); -# --------------------------------------------------------------- Drop students - if ($ENV{'form.fullup'} eq 'yes') { - $r->print('
No password for $username
"); + } + } + } + } # end of foreach (@studentdata) + $r->print('
Processed Students: '.$count); + ##################################### + # Drop students # + ##################################### + if ($ENV{'form.fullup'} eq 'yes') { + $r->print('
Dropped '.$count.' student(s).'); $r->print('
Re-enrollment will re-activate data.'); } # ================================================================ Main Handler - sub handler { - my $r=shift; - $Apache::lonxml::debug=1; - if ($r->header_only) { - $r->content_type('text/html'); - $r->send_http_header; - return OK; - } - -# ----------------------------------------------------- Needs to be in a course - - if (($ENV{'request.course.fn'}) && - (&Apache::lonnet::allowed('cst',$ENV{'request.course.id'}))) { - -# ------------------------------------------------------------------ Start page - $r->content_type('text/html'); - $r->send_http_header; - &header($r); - -# --------------------------------------------------- Phase one, initial screen - unless ($ENV{'form.phase'}) { - &menu_phase_one($r); - } -# ------------------------------------------------------------------- Phase two - - if ($ENV{'form.associate'} eq 'Reverse Association') { - $ENV{'form.phase'} = 'two'; - if ( $ENV{'form.upfile_associate'} ne 'reverse' ) { - $ENV{'form.upfile_associate'} = 'reverse'; - } else { - $ENV{'form.upfile_associate'} = 'forward'; - } - } - if ($ENV{'form.phase'} eq 'two') { - if ($ENV{'form.fileupload'}) { - &menu_phase_two_upload($r); - } elsif ($ENV{'form.enroll'}) { - &menu_phase_two_enroll($r); - } elsif ($ENV{'form.drop'}) { - &menu_phase_two_drop($r); - } - } - - - - -# ----------------------------------------------------------------- Phase three - if ($ENV{'form.phase'} eq 'three') { - if ($ENV{'form.datatoken'}) { - &upfile_drop_add($r); - } - } -# ------------------------------------------------------------------ Phase four - if ($ENV{'form.phase'} eq 'four') { - &drop_student_list($r); - } -# ------------------------------------------------------------------ Phase five - if ($ENV{'form.phase'} eq 'five') { - &enroll_single_student($r); - } -# ------------------------------------------------------------------------- End - $r->print('