[LON-CAPA-cvs] cvs: loncom /enrollment Enrollment.pm

raeburn lon-capa-cvs@mail.lon-capa.org
Tue, 07 Dec 2004 06:40:10 -0000


This is a MIME encoded message

--raeburn1102401610
Content-Type: text/plain

raeburn		Tue Dec  7 01:40:10 2004 EDT

  Modified files:              
    /loncom/enrollment	Enrollment.pm 
  Log:
  Functionality for creation of a new user account moved into a separate subroutine - &create_newuser() to facilitate its use when creating new iuser accounts during batch creation of courses, as well as supporting current use during auto-enrollment.
  
  
--raeburn1102401610
Content-Type: text/plain
Content-Disposition: attachment; filename="raeburn-20041207014010.txt"

Index: loncom/enrollment/Enrollment.pm
diff -u loncom/enrollment/Enrollment.pm:1.18 loncom/enrollment/Enrollment.pm:1.19
--- loncom/enrollment/Enrollment.pm:1.18	Mon Sep 13 12:36:34 2004
+++ loncom/enrollment/Enrollment.pm	Tue Dec  7 01:40:09 2004
@@ -1,5 +1,5 @@
 # Automated Enrollment manager
-# $Id: Enrollment.pm,v 1.18 2004/09/13 16:36:34 raeburn Exp $
+# $Id: Enrollment.pm,v 1.19 2004/12/07 06:40:09 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -37,6 +37,9 @@
 
 sub update_LC {
     my ($dom,$crs,$adds,$drops,$startdate,$enddate,$authtype,$autharg,$classesref,$groupref,$logmsg,$newusermsg,$context) = @_; 
+# Get institutional code and title of this class
+    my %courseinfo = ();
+    &get_courseinfo($dom,$crs,\%courseinfo);
 # Get current LON-CAPA student enrollment for this class
     my $configvars = &LONCAPA::Configuration::read_conf('loncapa.conf');
     my $cid = $dom."_".$crs;
@@ -79,6 +82,17 @@
     my $enrollcount = 0;
     my $dropcount = 0;
 
+# Get role names
+    my %longroles = ();
+    open(FILE,"<$$configvars{'lonTabDir'}.'/rolesplain.tab");
+    my @rolesplain = <FILE>;
+    close(FILE);
+    foreach (@rolesplain) {
+        if ($_ =~ /^(st|ta|ex|ad|in|cc):([\w\s]+)$/) {
+            $longroles{$1} = $2;
+        }
+    }
+
     srand( time() ^ ($$ + ($$ << 15))  ); # Seed rand in case initial passwords have to be generated for new users.
 
 # Get mapping of IDs to usernames for current LON-CAPA student enrollment for this class 
@@ -270,70 +284,28 @@
 # Check for existing account in this LON-CAPA domain for this username
                     my $uhome=&Apache::lonnet::homeserver($uname,$dom);
                     if ($uhome eq 'no_host') { # User does not exist
-                        my $create_passwd = 0;
-                        my $authchk = '';
-                        unless ($authparam eq '') { $authchk = 'ok'; };
-# If no account exists and passwords should be generated
-                        if ($auth eq "internal") {
-                            if ($authparam eq '') {
-                                ($authparam) = &create_password();
-                                if ($authparam eq '') {
-                                    $authchk = '';
-                                } else {
-                                    $create_passwd = 1;
-                                    $authchk = 'ok';
-                                }        
-                            }
-                        } elsif ($auth eq "localauth") {
-                            ($authparam,$create_passwd,$authchk) = &Apache::lonnet::auto_create_password($crs,$dom,$authparam);
-                        } elsif ($auth =~ m/^krb/) {
-                            if ($authparam eq '') {
-                                $$logmsg .= "No Kerberos domain was provided for the new user - $uname, so the new student was not enrolled in the course.".$linefeed;
-                                $authchk = 'invalid';
-                            }
-                        } else {
-                            $authchk = 'invalid';
-                            $$logmsg .= "An invalid authentication type was provided for the new user - $uname, so the student was not enrolled in the course.".$linefeed;
-                        }
-                        if ($authchk eq 'ok') { 
-# Now create user.
-                            my $reply=&Apache::lonnet::modifystudent($dom,$uname,$pid,$auth,$authparam,$first,$middle,$last,$gene,$usec,$end,$start,'',undef,$emailaddr,'auto','',$cid);
-                            if ($reply eq 'ok') {
-                                $access = &showaccess($end,$start);
-                                $enrollcount ++;
-                                $addresult .= "$first $last ($pid) - $uname enrolled in section/group $usec.".$access.$linefeed;
-                                if ($context eq 'automated') {
-                                    $$logmsg .= "New $dom user $uname added successfully.";
-                                }
-                                unless ($emailenc eq '') {
-                                    my %emailHash;
-                                    $emailHash{'critnotification'}  = $emailenc;
-                                    $emailHash{'notification'} = $emailenc;
-                                    my $putresult = &Apache::lonnet::put('environment',\%emailHash,$dom,$uname);
-                                }
-                                if ($create_passwd) {
-# Send e-mail with initial password to new user at $emailaddr. 
-# If e-mail address is invalid, send password via message to courseowner i
-# (if automated call) or to user if roster update. 
-                                    if ($emailaddr eq '') {
-                                        $$newusermsg .= " username: $uname, password: ".$authparam.$linefeed."\n";
-                                    } else {
-                                        my $subject = "New LON-CAPA account";
-                                        my $body = "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 course management and online homework system.\n\nYou should log-in to the system using the following credentials:\nusername: $uname\npassword: $authparam\n\nThe URL you should use to access the LON-CAPA system at your school is: http://".$ENV{'SERVER_NAME'};
-                                       &Apache::lonmsg::sendemail($emailaddr,$subject,$body); 
-                                    }                                 
-                                    if ($context eq 'automated') {
-                                        $$logmsg .= " Initial password -  - sent to ".$emailaddr.$linefeed;
-                                    }
-                                } else {
-                                    if ($context eq 'automated') {
-                                        $$logmsg .= $linefeed;
-                                    }
-                                }
-                            } else {
-                                $$logmsg .= "An error occurred adding new user $uname - ".$reply.$linefeed;
-                            }
-                        }
+                        my $args = {'auth' => $auth,
+                                    'authparam' => $authparam,
+                                    'emailenc' => $emailenc,
+                                    'udom' => $dom,
+                                    'uname' => $uname,
+                                    'pid' => $pid,
+                                    'first' => $first,
+                                    'middle' => $middle,
+                                    'last' => $last,
+                                    'gene' => $gene,
+                                    'usec' => $usec,
+                                    'end' => $end,
+                                    'start' => $start,
+                                    'emailaddr' => $emailaddr,
+                                    'cid' => $cid,
+                                    'crs' => $crs,
+                                    'cdom' => $dom,
+                                    'context' => $context,
+                                    'linefeed' => $linefeed,
+                                    'role' => 'st'
+                                   };
+                        my $outcome = &create_newuser($args,\$logmsg,\$newusermsg,\$enrollcount,\$addresult,\%longroles,\%courseinfo) = @_;
                     } else {
                         &execute_add($context,'newstudent',$uname,$dom,$auth,$authparam,$first,$middle,$last,$gene,$pid,$usec,$end,$start,$emailenc,$cid,\$addresult,\$enrollcount,$linefeed,$logmsg);
                     }
@@ -411,6 +383,126 @@
     return ($changecount,$addresult.$dropresult); 
 }
 
+sub create_newuser {
+    my ($args,$logmsg,$newusermsg,$enrollcount,$addresult,$longroles,$courseinfo) = @_;
+    my $auth = $args->{'auth'};
+    my $authparam = $args->{'authparam'};
+    my $emailenc = $args->{'emailenc'};
+    my $udom = $args->{'udom'};
+    my $uname = $args->{'uname'};
+    my $pid = $args->{'pid'};
+    my $first = $args->{'first'};
+    my $middle = $args->{'middle'};
+    my $last = $args->{'last'} ;
+    my $gene = $args->{'gene'};
+    my $usec = $args->{'usec'};
+    my $end = $args->{'end'};
+    my $start = $args->{'start'};
+    my $emailaddr = $args->{'emailaddr'};
+    my $cid = $args->{'cid'};
+    my $crs = $args->{'crs'};
+    my $cdom = $args->{'cdom'};
+    my $context = $args->{'context'};
+    my $linefeed = $args->{'linefeed'};
+    my $role = $args->{'role'};
+    my $create_passwd = 0;
+    my $authchk = '';
+    my $outcome;
+    unless ($authparam eq '') { $authchk = 'ok'; };
+# If no account exists and passwords should be generated
+    if ($auth eq "internal") {
+        if ($authparam eq '') {
+            $authparam = &create_password();
+            if ($authparam eq '') {
+                $authchk = '';
+            } else {
+                $create_passwd = 1;
+                $authchk = 'ok';
+            }
+        }
+    } elsif ($auth eq "localauth") {
+        ($authparam,$create_passwd,$authchk) = &Apache::lonnet::auto_create_password($crs,$cdom,$authparam);
+    } elsif ($auth =~ m/^krb/) {
+        if ($authparam eq '') {
+            $$logmsg .= "No Kerberos domain was provided for the new user - $uname, so the new user was not enrolled in the course.".$linefeed;
+            $authchk = 'invalid';
+        }
+    } else {
+        $authchk = 'invalid';
+        $$logmsg .= "An invalid authentication type was provided for the new user - $uname, so the user was not enrolled in the course.".$linefeed;
+    }   
+    if ($authchk eq 'ok') {
+# Now create user.
+        my $type = 'auto';
+        my $userurl = '/'.$cdom.'/'.$crs;
+        if ($usec ne '') {
+            $userurl .= '/'.$usec;
+        }
+        if ($context eq 'createowner' || $context eq 'createcourse') {
+            my $result = &Apache::lonnet::modifyuser($udom,$uname,$pid,$auth,$authparam,$first,$middle,$last,$gene,'1',undef,$emailaddr);
+            if ($result eq 'ok' && $context eq 'createcourse') {
+                $outcome = &Apache::loncreateuser::commit_standardrole($userurl,$role,$cdom,$crs,$start,$end);
+                unless ($outcome =~ /^Error:/) {
+                    $outcome = 'ok';
+                }
+            } else {
+                $outcome = $result;
+            }
+        } else {
+            $outcome=&Apache::lonnet::modifystudent($udom,$uname,$pid,$auth,$authparam,$first,$middle,$last,$gene,$usec,$end,$start,'',undef,$emailaddr,'auto','',$cid);
+        }
+        if ($outcome eq 'ok') {
+            my $access = &showaccess($end,$start);
+            $$addresult .= "$first $last ($pid) - $uname enrolled in section/group $usec.".$access.$linefeed;
+            unless ($context eq 'createowner' || $context eq 'createcourse') {
+                $$enrollcount ++;
+            }
+            if ($context eq 'automated') {
+                $$logmsg .= "New $udom user $uname added successfully.";
+            }
+            unless ($emailenc eq '' || $context eq 'createowner' || $context eq 'createcourse') {
+                my %emailHash;
+                $emailHash{'critnotification'}  = $emailenc;
+                $emailHash{'notification'} = $emailenc;
+                my $putresult = &Apache::lonnet::put('environment',\%emailHash,$udom,$uname);
+            }
+            if ($create_passwd) {
+# Send e-mail with initial password to new user at $emailaddr.
+# If e-mail address is invalid, send password via message to courseowner i
+# (if automated call) or to user if roster update.
+                if ($emailaddr eq '') {
+                    $$newusermsg .= " username: $uname, password: ".$authparam.$linefeed."\n";
+                } else {
+                    my $subject = "New LON-CAPA account";
+                    my $body;
+                    if ($context eq 'createowner') {
+                        $body = "A user account has been created for you while creating your new course in the LON-CAPA course management and online homework system.\n\nYou should log-in to the system using the following credentials:\nusername: $uname\npassword: $authparam\n\nThe URL you should use to access the LON-CAPA system at your school is: http://".$ENV{'SERVER_NAME'}."\n\n";
+                    } elsif ($context eq 'createcourse') {
+                        $body = "You have been assigned the role of $$longroles{$role} in a new course: $$courseinfo{'description'} - $$courseinfo{'inst_code'} in the LON-CAPA course management and online homework system.  As you did not have an existing user account in the system, one has been created for you.\n\nYou should log-in to the system using the following credentials:\nusername: $uname\npassword: $authparam\n\nThe URL you should use to access the LON-CAPA system at your school is: http://".$ENV{'SERVER_NAME'}."\n\n"; 
+                    } else {
+                        my $access_start = 'immediately';
+                        if ($start > 0) {
+                            $access_start = localtime($start)
+                        }
+                        $body = "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\nYou should log-in to the system using the following credentials:\nusername: $uname\npassword: $authparam\n\nThe URL you should use to access the LON-CAPA system at your school is: http://".$ENV{'SERVER_NAME'}."\n\n.When you log-in you will be able to access the LON-CAPA course for $$courseinfo{'description'} - $$courseinfo{'inst_code'} starting $access_start.\n";
+                    }
+                    &Apache::lonmsg::sendemail($emailaddr,$subject,$body);
+                }
+                if ($context eq 'automated') {
+                    $$logmsg .= " Initial password -  - sent to ".$emailaddr.$linefeed;
+                }
+            } else {
+                if ($context eq 'automated') {
+                    $$logmsg .= $linefeed;
+                }
+            }
+        } else {
+            $$logmsg .= "An error occurred adding new user $uname - ".$outcome.$linefeed;
+        }
+    }
+    return $outcome;
+}
+
 sub prepare_add {
     my ($authtype,$autharg,$enddate,$startdate,$stuinfo,$place,$dom,$uname,$auth,$authparam,$first,$middle,$last,$gene,$usec,$end,$start,$emailaddr,$pid,$emailenc) = @_;
     $$auth = $$stuinfo[ $$place{'authtype'} ];
@@ -698,6 +790,22 @@
     return $active_chk;
 }
 
+sub get_courseinfo {
+    my ($dom,$crs,$courseinfo) = @_;
+    my $owner;
+    if (defined($dom) && defined($crs)) {
+        my %settings = &Apache::lonnet::get('environment',['internal.coursecode','description'],$dom,$crs);
+        if ( defined($settings{'internal.coursecode'}) ) {
+            $$courseinfo{'inst_code'} = $settings{'internal.coursecode'};
+
+        }
+        if ( defined($settings{'description'}) ) {
+            $$courseinfo{'description'} = $settings{'description'};
+        }
+    }
+    return;
+}
+
 sub CL_autharg { return 0; }
 sub CL_authtype { return 1;}
 sub CL_email { return 2;}

--raeburn1102401610--