--- loncom/enrollment/Enrollment.pm 2007/12/23 02:48:50 1.37 +++ loncom/enrollment/Enrollment.pm 2010/08/20 21:44:59 1.43 @@ -1,5 +1,5 @@ # Automated Enrollment manager -# $Id: Enrollment.pm,v 1.37 2007/12/23 02:48:50 raeburn Exp $ +# $Id: Enrollment.pm,v 1.43 2010/08/20 21:44:59 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -92,9 +92,17 @@ sub update_LC { open(FILE,"<$$configvars{'lonTabDir'}.'/rolesplain.tab"); my @rolesplain = ; close(FILE); - foreach (@rolesplain) { - if ($_ =~ /^(st|ta|ex|ad|in|cc):([\w\s]+)$/) { - $longroles{$1} = $2; + foreach my $item (@rolesplain) { + if ($_ =~ /^(st|ta|ex|ad|in|cc|co):([\w\s]+):?([\w\s]*)/) { + if ($courseinfo{'type'} eq 'Community') { + unless($1 eq 'cc') { + $longroles{$1} = $3; + } + } else { + unless($1 eq 'co') { + $longroles{$1} = $2; + } + } } } @@ -115,18 +123,7 @@ sub update_LC { # Get latest institutional enrollment for this class. my %allenrolled = (); my @reg_students = (); - my %place = (); - $place{'autharg'} = &CL_autharg(); - $place{'authtype'} = &CL_authtype(); - $place{'email'} = &CL_email(); - $place{'enddate'} = &CL_enddate(); - $place{'firstname'} = &CL_firstname(); - $place{'generation'} = &CL_generation(); - $place{'groupID'} = &CL_groupID(); - $place{'lastname'} = &CL_lastname(); - $place{'middlename'} = &CL_middlename(); - $place{'startdate'} = &CL_startdate(); - $place{'studentID'} = &CL_studentID(); + my %place = &place_hash(); my %ucount = (); my %enrollinfo = (); foreach my $class (@{$classesref}) { @@ -182,7 +179,7 @@ sub update_LC { push @okusers, $uname; } } -# Get mapping of student IDs to usernames for users in institutional data for this class +# Get mapping of student/employee IDs to usernames for users in institutional data for this class my @allINids = (); my %unameFromINid = (); foreach my $uname (@okusers) { @@ -217,7 +214,7 @@ sub update_LC { # Check for switch from manual to auto unless (($$currlist{$uname}[$type] eq "auto") || ($$currlist{$uname}[$lockedtype] eq "1") || (!$adds) ) { # drop manually added student - my $drop_reply = &Apache::lonnet::modifystudent($dom,$uname,'','','',undef,undef,undef,undef,$$currlist{$uname}[$sec],time,undef,undef,undef,undef,'auto','',$cid); + my $drop_reply = &Apache::lonnet::modifystudent($dom,$uname,'','','',undef,undef,undef,undef,$$currlist{$uname}[$sec],time,undef,undef,undef,undef,'auto','',$cid,'',$context); # re-enroll as auto student if ($drop_reply !~ /^ok/) { $$logmsg .= &mt('An error occured during the attempt to convert [_1] from a manual type to an auto type student - [_2].',$uname,$drop_reply).$linefeed; @@ -249,7 +246,7 @@ sub update_LC { if ( (grep/^$uname$/,@futurestudents) && ($$currlist{$uname}[$type] eq "auto") && ($adds == 1) ) { my $datechange = &datechange_check($$currlist{$uname}[$cstart],$$currlist{$uname}[$cend],$startdate,$enddate); if ($datechange) { - my $modify_access_result = &Apache::lonnet::modify_student_enrollment($dom,$uname,undef,undef,undef,undef,undef,$stuinfo[ $place{groupID} ],$enddate,$startdate,'auto','',$cid); + my $modify_access_result = &Apache::lonnet::modify_student_enrollment($dom,$uname,undef,undef,undef,undef,undef,$stuinfo[ $place{groupID} ],$enddate,$startdate,'auto','',$cid,'',$context); $access = &showaccess($enddate,$startdate); if ($modify_access_result =~ /^ok/) { $$logmsg .= &mt('Change in access dates for [_1].',$uname).$access.$linefeed; @@ -267,13 +264,13 @@ sub update_LC { if ($$currlist{$uname}[$sec]) { $uurl.='/'.$$currlist{$uname}[$sec]; } - my $expire_role_result = &Apache::lonnet::assignrole($dom,$uname,$uurl,'st',$expiretime); + my $expire_role_result = &Apache::lonnet::assignrole($dom,$uname,$uurl,'st',$expiretime,'','','',$context); if ($expire_role_result eq 'ok') { my $modify_section_result; if (grep/^$uname$/,@activestudents) { - $modify_section_result = &Apache::lonnet::modify_student_enrollment($dom,$uname,undef,undef,undef,undef,undef,$stuinfo[ $place{groupID} ],$$currlist{$uname}[$cend],$$currlist{$uname}[$cstart],'auto','',$cid); + $modify_section_result = &Apache::lonnet::modify_student_enrollment($dom,$uname,undef,undef,undef,undef,undef,$stuinfo[ $place{groupID} ],$$currlist{$uname}[$cend],$$currlist{$uname}[$cstart],'auto','',$cid,'',$context); } else { - $modify_section_result = &Apache::lonnet::modify_student_enrollment($dom,$uname,undef,undef,undef,undef,undef,$stuinfo[ $place{groupID} ],$enddate,$startdate,'auto','',$cid); + $modify_section_result = &Apache::lonnet::modify_student_enrollment($dom,$uname,undef,undef,undef,undef,undef,$stuinfo[ $place{groupID} ],$enddate,$startdate,'auto','',$cid,'',$context); $access = &showaccess($enddate,$startdate); } if ($modify_section_result =~ /^ok/) { @@ -294,15 +291,15 @@ sub update_LC { # Check for changed usernames by checking studentIDs if ( ($stuinfo[ $place{studentID} ] ne '') && (grep/^$stuinfo[ $place{studentID} ]$/,@LCids) ) { foreach my $match ( @{ $unameFromLCid{ $stuinfo[ $place{studentID} ] } } ) { - $$logmsg .= &mt('A possible change in username has been detected for a student enrolled in this course.').' '.&mt('The existing LON-CAPA classlist contains user: [_1] and student ID: [_2].',$match,$stuinfo[ $place{studentID} ]); + $$logmsg .= &mt('A possible change in username has been detected for a student enrolled in this course.').' '.&mt('The existing LON-CAPA classlist contains user: [_1] and student/employee ID: [_2].',$match,$stuinfo[ $place{studentID} ]); if (grep/^$match$/,@okusers) { - $$logmsg .= &mt('The username [_1] remains in the institutional classlist, but the same student ID is used for new user: [_2] now found in the institutional classlist.',$match,$uname).' '.&mt('You may need to contact your Domain Coordinator to determine how to resolve this issue and whether to move student data files for user: [_1] to [_2].',$match,$uname).' '; + $$logmsg .= &mt('The username [_1] remains in the institutional classlist, but the same student/employee ID is used for new user: [_2] now found in the institutional classlist.',$match,$uname).' '.&mt('You may need to contact your Domain Coordinator to determine how to resolve this issue and whether to move student data files for user: [_1] to [_2].',$match,$uname).' '; } else { unless ($drops == 1) { - $$logmsg .= &mt('This username - [_1] - has been dropped from the institutional classlist, but the student ID of this user is also used by [_2] who now appears in the institutional classlist.',$match,$uname).' '.&mt('You may need to contact your Domain Coordinator to request a move of the student data files for user: [_1] to [_2].',$match,$uname).' '; + $$logmsg .= &mt('This username - [_1] - has been dropped from the institutional classlist, but the student/employee ID of this user is also used by [_2] who now appears in the institutional classlist.',$match,$uname).' '.&mt('You may need to contact your Domain Coordinator to request a move of the student data files for user: [_1] to [_2].',$match,$uname).' '; } } - $$logmsg .= &mt('Because of this student ID conflict, the new username - [_1] - has not been added to the LON-CAPA classlist',$uname).$linefeed; + $$logmsg .= &mt('Because of this student/employee ID conflict, the new username - [_1] - has not been added to the LON-CAPA classlist',$uname).$linefeed; } } elsif ($adds == 1) { my ($auth,$authparam,$first,$middle,$last,$gene,$usec,$end,$start,$emailaddr,$pid,$emailenc); @@ -331,7 +328,7 @@ sub update_LC { 'linefeed' => $linefeed, 'role' => 'st' }; - my $outcome = &create_newuser($args,$logmsg,$newusermsg,\$enrollcount,\$addresult,\%longroles,\%courseinfo); + my $outcome = &create_newuser($args,$logmsg,$newusermsg,\$enrollcount,\$addresult,\%longroles,\%courseinfo,$context); } else { &execute_add($context,'newstudent',$uname,$dom,$auth,$authparam,$first,$middle,$last,$gene,$pid,$usec,$end,$start,$emailenc,$cid,\$addresult,\$enrollcount,$linefeed,$logmsg); } @@ -384,17 +381,17 @@ sub update_LC { # Check for changed usernames by checking studentIDs if (grep/^$$currlist{$uname}[ $stuid ]$/,@allINids) { foreach my $match (@{$unameFromINid{$$currlist{$uname}[ $stuid ]}} ) { - $$logmsg .= &mt('A possible change in username has been detected for a student enrolled in this course.').' '.&mt('The existing LON-CAPA classlist contains user: [_1] and student ID: [_2].',$uname,$$currlist{$uname}[ $place{studentID} ]).' '.&mt('This username has been dropped from the institutional classlist, but the same student ID is used for user: [_1] who still appears in the institutional classlist.',$match).' '.&mt('You may need to move the student data files for user: [_1] to [_2]',$uname,$match).' '.&mt('Because of this, user [_1] has not been dropped from the course.',$uname).$linefeed; + $$logmsg .= &mt('A possible change in username has been detected for a student enrolled in this course.').' '.&mt('The existing LON-CAPA classlist contains user: [_1] and student/employee ID: [_2].',$uname,$$currlist{$uname}[ $place{studentID} ]).' '.&mt('This username has been dropped from the institutional classlist, but the same student/employee ID is used for user: [_1] who still appears in the institutional classlist.',$match).' '.&mt('You may need to move the student data files for user: [_1] to [_2]',$uname,$match).' '.&mt('Because of this, user [_1] has not been dropped from the course.',$uname).$linefeed; push @saved,$uname; } } elsif (@saved == 0) { - my $drop_reply = &Apache::lonnet::modifystudent($dom,$uname,'','','',undef,undef,undef,undef,$$currlist{$uname}[$sec],time,undef,undef,undef,undef,'auto','',$cid); + my $drop_reply = &Apache::lonnet::modifystudent($dom,$uname,'','','',undef,undef,undef,undef,$$currlist{$uname}[$sec],time,undef,undef,undef,undef,'auto','',$cid,'',$context); if ($drop_reply !~ /^ok/) { $$logmsg .= &mt('An error occured during the attempt to expire the [_1] from the old section [_2] - [_3].',$uname,$$currlist{$uname}[$sec],$drop_reply).$linefeed; } else { $dropcount ++; my %userenv = &Apache::lonnet::get('environment',['firstname','lastname','id'],$dom,$uname); - $dropresult .= $userenv{'firstname'}." ".$userenv{'lastname'}." (".$userenv{'id'}.") - ".$uname.' '.&mt("dropped from section/group: '[_1]'.",$$currlist{$uname}[$sec]).$linefeed; + $dropresult .= $userenv{'firstname'}." ".$userenv{'lastname'}." (".$userenv{'id'}.") - ".$uname.' '.&mt("dropped from section: '[_1]'.",$$currlist{$uname}[$sec]).$linefeed; if ($context eq 'automated') { $$logmsg .= &mt('User [_1] student role expired from course.',$uname).$linefeed; } @@ -520,7 +517,7 @@ sub create_newuser { $outcome = $result; } } else { - $outcome=&Apache::lonnet::modifystudent($udom,$uname,$pid,$auth,$authparam,$first,$middle,$last,$gene,$usec,$end,$start,'',undef,$emailaddr,'auto','',$cid); + $outcome=&Apache::lonnet::modifystudent($udom,$uname,$pid,$auth,$authparam,$first,$middle,$last,$gene,$usec,$end,$start,'',undef,$emailaddr,'auto','',$cid,'',$called_context); } if ($outcome eq 'ok') { my $access = &showaccess($end,$start); @@ -528,7 +525,7 @@ sub create_newuser { if ($usec eq '') { $showsec = &mt('none'); } - $$addresult .= "$first $last ($pid) - $uname ".&mt("enrolled in section/group: '[_1]'.",$showsec).$access.$linefeed; + $$addresult .= "$first $last ($pid) - $uname ".&mt("enrolled in section: '[_1]'.",$showsec).$access.$linefeed; unless ($context eq 'createowner' || $context eq 'createcourse') { $$enrollcount ++; } @@ -551,16 +548,28 @@ sub create_newuser { } else { my $subject = &mt('New LON-CAPA account'); my $body; + my $portalurl = 'http://'.$ENV{'SERVER_NAME'}; + my $protocol = 'http'; + my $lonhost=&Apache::lonnet::domain($udom,'primary'); + if ($lonhost ne '') { + my $ip = &Apache::lonnet::get_host_ip($lonhost); + if ($Apache::lonnet::protocol{$lonhost} eq 'https') { + $protocol = 'https'; + } + if ($ip ne '') { + $portalurl = $protocol.'://'.$ip + } + } if ($context eq 'createowner') { - $body = &mt('A user account has been created for you while creating your new course in the LON-CAPA course management and online homework system.')."\n\n".&mt('You should log-in to the system using the following credentials:')."\n".&mt('username: ').$uname."\n".&mt('password: ').$authparam."\n\n".&mt('The URL you should use to access the LON-CAPA system at your school is: ').'http://'.$ENV{'SERVER_NAME'}."\n\n"; + $body = &mt('A user account has been created for you while creating your new course in the LON-CAPA course management and online homework system.')."\n\n".&mt('You should log-in to the system using the following credentials:')."\n".&mt('username: ').$uname."\n".&mt('password: ').$authparam."\n\n".&mt('The URL you should use to access the LON-CAPA system at your institution is: ').$portalurl."\n\n"; } elsif ($context eq 'createcourse') { - $body = &mt('You have been assigned the role of [_1] in a new course: [_2] - [_3] in the LON-CAPA course management and online homework system.',$$longroles{$role},$$courseinfo{'description'},$$courseinfo{'inst_code'}).' '.&mt('As you did not have an existing user account in the system, one has been created for you.')."\n\n".&mt("You should log-in to the system using the following credentials:\nusername: [_1]\npassword: [_2]",$uname,$authparam)."\n\n".&mt('The URL you should use to access the LON-CAPA system at your school is: '),'http://'.$ENV{'SERVER_NAME'}."\n\n"; + $body = &mt('You have been assigned the role of [_1] in a new course: [_2] - [_3] in the LON-CAPA course management and online homework system.',$$longroles{$role},$$courseinfo{'description'},$$courseinfo{'inst_code'}).' '.&mt('As you did not have an existing user account in the system, one has been created for you.')."\n\n".&mt("You should log-in to the system using the following credentials:\nusername: [_1]\npassword: [_2]",$uname,$authparam)."\n\n".&mt('The URL you should use to access the LON-CAPA system at your institution is: ').$portalurl."\n\n"; } else { my $access_start = 'immediately'; if ($start > 0) { $access_start = localtime($start) } - $body = &mt('You have been enrolled in the LON-CAPA system at your school, because you are a registered student in a class that is using the LON-CAPA couse management and online homework system.')."\n\n".&mt("You should log-in to the system using the following credentials:\nusername: [_1]\npassword: [_2]",$uname,$authparam)."\n\n".&mt('The URL you should use to access the LON-CAPA system at your school is: ').'http://'.$ENV{'SERVER_NAME'}."\n\n".&mt('When you log-in you will be able to access the LON-CAPA course for [_1] - [_2] starting [_3].',$$courseinfo{'description'},$$courseinfo{'inst_code'},$access_start)."\n"; + $body = &mt('You have been enrolled in the LON-CAPA system at your institution, because you are a registered student in a class which is using the LON-CAPA couse management and online homework system.')."\n\n".&mt("You should log-in to the system using the following credentials:\nusername: [_1]\npassword: [_2]",$uname,$authparam)."\n\n".&mt('The URL you should use to access the LON-CAPA system at your institution is: ').$portalurl."\n\n".&mt('When you log-in you will be able to access the LON-CAPA course for [_1] - [_2] starting [_3].',$$courseinfo{'description'},$$courseinfo{'inst_code'},$access_start)."\n"; } &Apache::lonmsg::sendemail($emailaddr,$subject,$body); } @@ -632,14 +641,16 @@ sub execute_add { # Get the user's e-mail address if ($userenv{critnotification} =~ m/%40/) { unless ($emailenc eq $userenv{critnotification}) { - $$logmsg .= &mt('Current critical notification e-mail -- [_1] for [_2] is different to e-mail address in institutional classlist - [_3].',$userenv{critnotification},$uname,$emailenc).$linefeed; + $$logmsg .= &mt('Current critical notification e-mail - [_1] for [_2] is different to e-mail address in institutional classlist - [_3].', + $userenv{critnotification},$uname,$emailenc). + $linefeed; } } if ($userenv{notification} =~ m/%40/) { unless ($emailenc eq $userenv{notification}) { - $$logmsg .= &mt('Current standard notification e-mail -- [_1] for [_2] is different to e-mail address in institutional classlist - [_3]',$userenv{notification},$uname,$emailenc).$linefeed; + $$logmsg .= &mt('Current standard notification e-mail - [_1] for [_2] is different to e-mail address in institutional classlist - [_3].', + $userenv{notification},$uname,$emailenc). + $linefeed; } } if ($userenv{permanentemail} =~ m/%40/) { @@ -691,7 +702,7 @@ sub execute_add { } # Assign the role of student in the course. - my $classlist_reply = &Apache::lonnet::modify_student_enrollment($dom,$uname,$pid,$first,$middle,$last,$gene,$usec,$end,$start,'auto','',$cid); + my $classlist_reply = &Apache::lonnet::modify_student_enrollment($dom,$uname,$pid,$first,$middle,$last,$gene,$usec,$end,$start,'auto','',$cid,'',$context); if ($classlist_reply eq 'ok') { my $access = &showaccess($end,$start); my $showsec = $usec; @@ -699,10 +710,10 @@ sub execute_add { $showsec = &mt('none'); } if ($caller eq 'switchtype') { - $$logmsg .= &mt("Existing user [_1] detected in institutional classlist - switched from 'manual' to 'auto' enrollment in section/group [_2].",$uname,$showsec).$access.$linefeed; + $$logmsg .= &mt("Existing user [_1] detected in institutional classlist - switched from 'manual' to 'auto' enrollment in section [_2].",$uname,$showsec).$access.$linefeed; } elsif ($caller eq 'newstudent') { $$enrollcount ++; - $$addresult .= "$first $last ($pid) - $uname ".&mt("enrolled in section/group '[_1]'.",$showsec).$access.$linefeed; + $$addresult .= "$first $last ($pid) - $uname ".&mt("enrolled in section '[_1]'.",$showsec).$access.$linefeed; } if ($context eq 'automated') { $$logmsg .= &mt('Existing [_1] user [_2] enrolled successfully.',$dom,$uname).$linefeed; @@ -764,14 +775,13 @@ sub parse_classlist { push @state, $tagname; if ("@state" eq "students student") { $uname = $attr->{username}; + $$studentsref{$uname}[ $$placeref{'groupID'} ] = $groupID; } }, "tagname, attr"], text_h => [sub { my ($text) = @_; - if ("@state" eq "students student groupID") { - $$studentsref{$uname}[ $$placeref{'groupID'} ] = $groupID; - } elsif ("@state" eq "students student startdate") { + if ("@state" eq "students student startdate") { my $start = $text; unless ($text eq '') { $start = &process_date($text); @@ -860,17 +870,22 @@ sub get_courseinfo { return; } -sub CL_autharg { return 0; } -sub CL_authtype { return 1;} -sub CL_email { return 2;} -sub CL_enddate { return 3;} -sub CL_firstname { return 4;} -sub CL_generation { return 5;} -sub CL_groupID { return 6;} -sub CL_lastname { return 7;} -sub CL_middlename { return 8;} -sub CL_startdate { return 9; } -sub CL_studentID { return 10; } +sub place_hash { + my %place = ( + autharg => 0, + authtype => 1, + email => 2, + enddate => 3, + firstname => 4, + generation => 5, + groupID => 6, + lastname => 7, + middlename => 8, + startdate => 9, + studentID => 10, + ); + return %place; +} sub photo_response_types { my %lt = &Apache::lonlocal::texthash( @@ -880,7 +895,7 @@ sub photo_response_types { 'missing' => 'were missing', 'error' => 'were not imported because an error occurred', 'nouser' => 'were for users without accounts', - 'noid' => 'were for users without student IDs', + 'noid' => 'were for users without student/employee IDs', ); return %lt; }