Diff for /loncom/metadata_database/searchcat.pl between versions 1.83 and 1.84

version 1.83, 2016/01/27 22:22:59 version 1.84, 2016/01/31 21:25:49
Line 273  foreach my $dom (@domains) { Line 273  foreach my $dom (@domains) {
             &portfolio_logging(%portmetalog);              &portfolio_logging(%portmetalog);
         }          }
     }      }
     my (%names_by_id,,%ids_by_name,%idstodelete,%idstoadd,%duplicates);      my %duplicates;
       my %names_by_id = (
                             id       => {},
                             clickers => {},
                         );
       my %ids_by_name = (
                             id       => {},
                             clickers => {},
                         );
       my %idstodelete = (
                             id       => {},
                             clickers => {}, 
                         );
       my %idstoadd    = (
                             id       => {},
                             clickers => {},
                         );
       my %namespace  = (
                            id       => 'ids',
                            clickers => 'clickers',
                        );
       my %idtext = (
                        id       => 'employee/student IDs',
                        clickers => 'clicker IDs',
                    );
     unless ($simulate || $oneuser) {      unless ($simulate || $oneuser) {
         my $idshashref;          foreach my $key ('id','clickers') {
         $idshashref = &tie_domain_hash($dom, "ids", &GDBM_WRCREAT());              my $hashref = &tie_domain_hash($dom,$namespace{$key},&GDBM_WRCREAT());
         if (ref($idshashref) eq 'HASH') {              if (ref($hashref) eq 'HASH') {
             %names_by_id = %{$idshashref};                  while (my ($id,$unamestr) = each(%{$hashref}) ) {
             while (my ($id,$uname) = each(%{$idshashref}) ) {                      $id = &unescape($id);
                 $id = &unescape($id);                      $unamestr = &unescape($unamestr);
                 $uname = &unescape($uname);                       if ($key eq 'clickers') {
                 $names_by_id{$id} = $uname;                          my @unames = split(/,/,$unamestr);
                 push(@{$ids_by_name{$uname}},$id);                          foreach my $uname (@unames) {
                               push(@{$ids_by_name{$key}{$uname}},$id);
                           }
                           $names_by_id{$key}{$id} = $unamestr;
                       } else {
                           $names_by_id{$key}{$id} = $unamestr;
                           push(@{$ids_by_name{$key}{$unamestr}},$id);
                       }
                   }
                   &untie_domain_hash($hashref);
             }              }
             &untie_domain_hash($idshashref);  
         }          }
     }      }
     # Update allusers      # Update allusers
Line 293  foreach my $dom (@domains) { Line 325  foreach my $dom (@domains) {
         next if (exists($courses{$dom.'_'.$uname}));          next if (exists($courses{$dom.'_'.$uname}));
         my %userdata =           my %userdata = 
             &Apache::lonnet::get('environment',['firstname','lastname',              &Apache::lonnet::get('environment',['firstname','lastname',
                 'middlename','generation','id','permanentemail'],$dom,$uname);                  'middlename','generation','id','permanentemail','clickers'],
                                    $dom,$uname);
         unless ($simulate || $oneuser) {          unless ($simulate || $oneuser) {
             my $addid;              foreach my $key ('id','clickers') {
             if ($userdata{'id'} ne '') {                  my %addid = ();
                 $addid = $userdata{'id'};                  if ($userdata{$key} ne '') {
                 $addid=~tr/A-Z/a-z/;                      my $idfromenv = $userdata{$key};
             }                      if ($key eq 'id') {
             if (exists($ids_by_name{$uname})) {                          $idfromenv=~tr/A-Z/a-z/;
                 if (ref($ids_by_name{$uname}) eq 'ARRAY') {                          $addid{$idfromenv} = 1;
                     if (scalar(@{$ids_by_name{$uname}}) > 1) {                      } else {
                         &log(0,"Multiple employee/student IDs found in ids.db for $uname:$dom -- ".join(', ',@{$ids_by_name{$uname}}));                          $idfromenv =~ s/^\s+//;
                     }                          $idfromenv =~ s/\s+$//;
                     foreach my $id (@{$ids_by_name{$uname}}) {                          map { $addid{$_} = 1; } split(/,/,$idfromenv);
                         if ($id eq $userdata{'id'}) {                      }
                             undef($addid);                  }
                         } else {                   if (ref($ids_by_name{$key}{$uname}) eq 'ARRAY') {
                             $idstodelete{$id} = $uname;                      if (scalar(@{$ids_by_name{$key}{$uname}}) > 1) {
                           &log(0,"Multiple $idtext{$key} found in $namespace{$key}.db for $uname:$dom -- ".
                                join(', ',@{$ids_by_name{$key}{$uname}}));
                       }
                       foreach my $id (@{$ids_by_name{$key}{$uname}}) {
                            if ($addid{$id}) {
                               delete($addid{$id});
                            } else {
                               if ($key eq 'id') {
                                   $idstodelete{$key}{$id} = $uname;
                               } else {
                                   $idstodelete{$key}{$id} .= $uname.',';
                               }
                         }                          }
                     }                      }
                 }                  }
             }                  if (keys(%addid)) {
             if ($addid ne '') {                      foreach my $id (keys(%addid)) {
                 if (exists($idstoadd{$addid})) {                          if ($key eq 'id') {
                     push(@{$duplicates{$addid}},$uname);                              if (exists($idstoadd{$key}{$id})) {
                 } else {                                  push(@{$duplicates{$id}},$uname);
                     $idstoadd{$addid} = $uname;                              } else {
                                   $idstoadd{$key}{$id} = $uname;
                               }
                           } else {
                               $idstoadd{$key}{$id} .= $uname.',';
                           }
                       }
                 }                  }
             }              }
         }          }
           
         $userdata{'username'} = $uname;          $userdata{'username'} = $uname;
         $userdata{'domain'} = $dom;          $userdata{'domain'} = $dom;
         my %alluserslog =           my %alluserslog = 
Line 333  foreach my $dom (@domains) { Line 384  foreach my $dom (@domains) {
         }          }
     }      }
     unless ($simulate || $oneuser) {      unless ($simulate || $oneuser) {
         if (keys(%idstodelete) > 0) {          foreach my $key ('id','clickers') { 
             my %resulthash = &Apache::lonnet::iddel($dom,\%idstodelete,$hostid);              if (keys(%{$idstodelete{$key}}) > 0) {
             if ($resulthash{$hostid} eq 'ok') {                  my %resulthash;
                 foreach my $id (sort(keys(%idstodelete))) {                  if ($key eq 'id') {
                     &log(0,"Record deleted from ids.db for $dom -- $id => ".$idstodelete{$id});                      %resulthash = &Apache::lonnet::iddel($dom,$idstodelete{$key},$hostid,$namespace{$key});
                   } else {
                       foreach my $delid (sort(keys(%{$idstodelete{$key}}))) {
                           $idstodelete{$key}{$delid} =~ s/,$//;
                       }
                       %resulthash = &Apache::lonnet::iddel($dom,$idstodelete{$key},$hostid,$namespace{$key});
                 }                  }
             } else {                  if ($resulthash{$hostid} eq 'ok') {
                 &log(0,"Error: '$resulthash{$hostid}' occurred when attempting to delete records from ids.db for $dom");                      foreach my $id (sort(keys(%{$idstodelete{$key}}))) {
             }                          &log(0,"Record deleted from $namespace{$key}.db for $dom -- $id => ".$idstodelete{$key}{$id});
         }                      }
         if (keys(%idstoadd) > 0) {  
             my $idmessage = '';  
             my %newids;  
             foreach my $addid (sort(keys(%idstoadd))) {  
                 if ((exists($names_by_id{$addid})) && ($names_by_id{$addid} ne $idstoadd{$addid})  && !($idstodelete{$addid})) {  
                     &log(0,"Two usernames associated with a single ID $addid in domain: $dom: $names_by_id{$addid} (current) and $idstoadd{$addid}\n");  
                     $idmessage .= "$addid,$names_by_id{$addid},$idstoadd{$addid}\n";  
                 } else {                  } else {
                     $newids{$addid} = $idstoadd{$addid};                      &log(0,"Error: '$resulthash{$hostid}' occurred when attempting to delete records from $namespace{$key}.db for $dom");
                 }                  }
             }              }
             if (keys(%newids) > 0) {              if (keys(%{$idstoadd{$key}}) > 0) {
                 my $putresult = &Apache::lonnet::put_dom('ids',\%idstoadd,$dom,$hostid);                  my $idmessage = '';
                 if ($putresult eq 'ok') {                  my %newids;
                     foreach my $id (sort(keys(%idstoadd))) {                  if ($key eq 'id') {
                         &log(0,"Record added to ids.db for $dom -- $id => ".$idstoadd{$id});                      foreach my $addid (sort(keys(%{$idstoadd{$key}}))) {
                           if ((exists($names_by_id{$key}{$addid})) && ($names_by_id{$key}{$addid} ne $idstoadd{$key}{$addid})  && !($idstodelete{$key}{$addid})) {
                               &log(0,"Two usernames associated with a single ID $addid in domain: $dom: $names_by_id{$key}{$addid} (current) and $idstoadd{$key}{$addid}\n");
                               $idmessage .= "$addid,$names_by_id{$key}{$addid},$idstoadd{$key}{$addid}\n";
                           } else {
                               $newids{$addid} = $idstoadd{$key}{$addid};
                           }
                     }                      }
                 } else {                  } else {
                     &log(0,"Error: '$putresult' occurred when attempting to add records to ids.db for $dom");                       foreach my $addid (sort(keys(%{$idstoadd{$key}}))) {
                           $idstoadd{$key}{$addid} =~ s/,$//;
                           $newids{$addid} = $idstoadd{$key}{$addid};
                       }
                 }                  }
             }                  if (keys(%newids) > 0) {
             if ($idmessage) {                      my $putresult;
                 my $to = &Apache::loncommon::build_recipient_list(undef,'idconflictsmail',$dom);                      if ($key eq 'clickers') {
                 if ($to ne '') {                          $putresult = &Apache::lonnet::updateclickers($dom,'add',\%newids,$hostid); 
                     my $msg = new Mail::Send;                      } else {
                     $msg->to($to);                          $putresult = &Apache::lonnet::put_dom($namespace{$key},\%newids,$dom,$hostid);
                     $msg->subject('LON-CAPA studentIDs conflict');                      } 
                     my $lonhost = $Apache::lonnet::perlvar{'lonHostID'};                      if ($putresult eq 'ok') {
                     my $hostname = &Apache::lonnet::hostname($lonhost);                          foreach my $id (sort(keys(%newids))) {
                     my $replytoaddress = 'do-not-reply@'.$hostname;                              &log(0,"Record added to $namespace{$key}.db for $dom -- $id => ".$newids{$id});
                     $msg->add('Reply-to',$replytoaddress);                          }
                     $msg->add('From','www@'.$hostname);                      } else {
                     $msg->add('Content-type','text/plain; charset=UTF-8');                          &log(0,"Error: '$putresult' occurred when attempting to add records to $namespace{$key}.db for $dom"); 
                     if (my $fh = $msg->open()) {                      }
                         print $fh                   }
                             'The following IDs are used for more than one user in your domain:'."\n".                  if ($idmessage) {
                             'Each row contains: Student/Employee ID, Current username in ids.db file, '.                      my $to = &Apache::loncommon::build_recipient_list(undef,'idconflictsmail',$dom);
                             'Additional username'."\n\n".                      if ($to ne '') {
                             $idmessage;                          my $msg = new Mail::Send;
                         $fh->close;                          $msg->to($to);
                           $msg->subject('LON-CAPA studentIDs conflict');
                           my $lonhost = $Apache::lonnet::perlvar{'lonHostID'};
                           my $hostname = &Apache::lonnet::hostname($lonhost);
                           my $replytoaddress = 'do-not-reply@'.$hostname;
                           $msg->add('Reply-to',$replytoaddress);
                           $msg->add('From','www@'.$hostname);
                           $msg->add('Content-type','text/plain; charset=UTF-8');
                           if (my $fh = $msg->open()) {
                               print $fh 
                                   'The following IDs are used for more than one user in your domain:'."\n".
                                   'Each row contains: Student/Employee ID, Current username in ids.db file, '.
                                   'Additional username'."\n\n".
                                   $idmessage;
                               $fh->close;
                           }
                     }                      }
                 }                  }
             }              }
         }          }
         if (keys(%duplicates) > 0) {          if (keys(%duplicates) > 0) {
             foreach my $id (sort(keys(%duplicates))) {              foreach my $id (sort(keys(%duplicates))) {
                 &log(0,"Duplicate IDs found for entries to add to ids.db in $dom -- $id => $idstodelete{$id}");                  if (ref($duplicates{$id}) eq 'ARRAY') {
                       &log(0,"Duplicate IDs found for entries to add to ids.db in $dom -- $id => ".join(',',@{$duplicates{$id}}));
                   }
             }              }
         }          }
     }      }

Removed from v.1.83  
changed lines
  Added in v.1.84


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>