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}})); |
|
} |
} |
} |
} |
} |
} |
} |