[LON-CAPA-cvs] cvs: loncom /enrollment Autoupdate.pl

raeburn raeburn at source.lon-capa.org
Wed Dec 6 18:46:16 EST 2023


raeburn		Wed Dec  6 23:46:16 2023 EDT

  Modified files:              
    /loncom/enrollment	Autoupdate.pl 
  Log:
  - Sanity checking during automated update of user information using
    institutional data to prevent deletion of first and last name, or
    student/employee ID, in the case of institutional data feed issues.
  
  
Index: loncom/enrollment/Autoupdate.pl
diff -u loncom/enrollment/Autoupdate.pl:1.26 loncom/enrollment/Autoupdate.pl:1.27
--- loncom/enrollment/Autoupdate.pl:1.26	Wed Dec  6 23:38:45 2023
+++ loncom/enrollment/Autoupdate.pl	Wed Dec  6 23:46:16 2023
@@ -1,7 +1,7 @@
 #!/usr/bin/perl
 #
 # Automated Userinfo update script
-# $Id: Autoupdate.pl,v 1.26 2023/12/06 23:38:45 raeburn Exp $
+# $Id: Autoupdate.pl,v 1.27 2023/12/06 23:46:16 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -49,7 +49,7 @@
     # find out which users we need to examine
     my @domains = sort(&Apache::lonnet::current_machine_domains());
     foreach my $dom (@domains) {
-        my %domconfig = &Apache::lonnet::get_dom('configuration',['autoupdate'],
+        my %domconfig = &Apache::lonnet::get_dom('configuration',['autoupdate','usercreation'],
                                                  $dom);
         #only run if configured to
         my $run_update = 0;
@@ -74,7 +74,7 @@
         # get courseIDs for domain
         my %courses=&Apache::lonnet::courseiddump($dom,'.',1,'.','.','.',1,[$hostid],'.');
         # get user information
-        my (%users,%instusers,%instids,%counts);
+        my (%users,%instusers,%instids,%counts, at idrules);
         my $dir = $Apache::lonnet::perlvar{lonUsersDir}.'/'.$dom;
         &descend_tree($dom,$dir,0,\%users,\%courses,$allowed_inactivity,$check_unexpired);
         my $resp = &localenroll::allusers_info($dom,\%instusers,\%instids,\%users,\%counts);
@@ -98,6 +98,11 @@
         my @types = ('active','future');
         my @roles = ('st');
         my @cdoms = ($dom);
+        if (ref($domconfig{'usercreation'}) eq 'HASH') {
+            if (ref($domconfig{'usercreation'}{'id_rule'}) eq 'ARRAY') {
+                @idrules = @{$domconfig{'usercreation'}{'id_rule'}};
+            }
+        }
         foreach my $uname (sort(keys(%users))) {
             my %userhash = &Apache::lonnet::userenvironment($dom,$uname, at info);
             my (@inststatuses);
@@ -132,12 +137,59 @@
                     }
                     foreach my $field (@fields) {
                         if ($userhash{$field} ne $instusers{$uname}{$field}) {
-                            $changed = 1;
-                            if ($settings->{'classlists'} == 1) {
-                                if ($field eq 'id') {
-                                    $changes{'id'} = 1;
-                                } elsif ($field eq 'lastname' || $field eq 'firstname' || $field eq 'middlename' || $field eq 'generation') {
-                                    $changes{'fullname'} = 1;
+                            # Do not change student/employee ID when field is modifiable
+                            # but institutional data is absent or does not match rules
+                            # defined for IDs for institutional users in domain
+                            if ($field eq 'id') {
+                                if ($instusers{$uname}{$field} eq '') {
+                                    $instusers{$uname}{$field} = $userhash{$field};
+                                    next;
+                                } elsif (@idrules > 0) {
+                                    my %idchecks;
+                                    if (&LONCAPA::localenroll::id_check($dom,$instusers{$uname}{$field},
+                                                                        \@idrules,\%idchecks) eq 'ok') {
+                                        my $matches;
+                                        foreach my $result (values(%idchecks)) {
+                                            if ($result) {
+                                                $matches = 1;
+                                                last;
+                                            }
+                                        }
+                                        if ($matches) {
+                                            $changed = 1;
+                                        } else {
+                                            $instusers{$uname}{$field} = $userhash{$field}; 
+                                            next;
+                                        }
+                                    }
+                                }
+                            } else {
+                                $changed = 1;
+                            }
+                            if ($field eq 'id') {
+                                $changes{'id'} = 1;
+                            } elsif ($field eq 'lastname' || $field eq 'firstname' || $field eq 'middlename' || $field eq 'generation') {
+                                $changes{'fullname'} = 1;
+                            }
+                        }
+                    }
+                    # Do not change name information when lastname and firstname are modifiable
+                    # but institutional data is absent for both components of a user's name.
+                    if ($changed) {
+                        if ($changes{'fullname'}) {
+                            my %modifiable;
+                            map { $modifiable{$_} = 1; } @fields;
+                            if (($modifiable{'lastname'}) && ($modifiable{'firstname'}) &&
+                                ($instusers{$uname}{'lastname'} eq '') && ($instusers{$uname}{'firstname'} eq '')) {
+                                if ($changes{'fullname'}) {
+                                    undef($changes{'fullname'});
+                                }
+                                if ($changes{'id'}) {
+                                    foreach my $field ('lastname','firstname','middlename','generation') {
+                                        $instusers{$uname}{$field} = $userhash{$field};
+                                    }
+                                } else {
+                                    undef($changed);
                                 }
                             }
                         }




More information about the LON-CAPA-cvs mailing list