--- loncom/interface/loncoursequeueadmin.pm 2014/01/08 17:18:11 1.42
+++ loncom/interface/loncoursequeueadmin.pm 2014/02/12 20:47:40 1.43
@@ -1,7 +1,7 @@
# The LearningOnline Network
# Utilities to administer domain course requests and course self-enroll requests
#
-# $Id: loncoursequeueadmin.pm,v 1.42 2014/01/08 17:18:11 bisitz Exp $
+# $Id: loncoursequeueadmin.pm,v 1.43 2014/02/12 20:47:40 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -124,6 +124,15 @@ sub send_selfserve_notification {
if (ref($textstr) eq 'ARRAY') {
push(@rawmsg,@{$textstr});
}
+ } elsif ($context eq 'usernamemanagers') {
+ $rawsubj = 'LON-CAPA account requests reviewed';
+ push(@rawmsg,{
+ mt => 'Account requests in the following domain: "[_1]" have been reviewed.',
+ args => ["\n$contextdesc"],
+ });
+ if (ref($textstr) eq 'ARRAY') {
+ push(@rawmsg,@{$textstr});
+ }
} elsif ($context eq 'enroller') {
$rawsubj = 'Enrollment request';
if ($crstype eq 'community') {
@@ -223,6 +232,28 @@ sub send_selfserve_notification {
if (ref($textstr) eq 'ARRAY') {
push(@rawmsg,@{$textstr});
}
+ } elsif ($context eq 'usernamereq') {
+ $rawsubj = 'LON-CAPA account request';
+ $msgtxt = 'Creation of a LON-CAPA account in the [_1] domain[_2]was requested by [_3] on [_4].';
+ push(@rawmsg,{
+ mt => $msgtxt,
+ args => [$contextdesc,"\n",$textstr,$timestamp],
+ },
+ {
+ mt =>'[_1]As Domain Coordinator, use: [_2]Main Menu -> Create users or modify the roles and privileges of users
+ -> LON-CAPA account requests[_3]to display a list of pending requests, which you can either approve or reject.',
+ args => ["\n","\n\n ","\n\n"],
+ });
+ } elsif ($context eq 'requestusername') {
+ $rawsubj = 'LON-CAPA account request';
+ $msgtxt = 'Your request for a LON-CAPA account requested on [_1]has been reviewed by a Domain Coordinator.';
+ push(@rawmsg,{
+ mt => $msgtxt,
+ args => [$timestamp."\n"],
+ });
+ if (ref($textstr) eq 'ARRAY') {
+ push(@rawmsg,@{$textstr});
+ }
} elsif ($context eq 'uniquecode') {
$rawsubj = 'Course Identifier';
if (ref($textstr) eq 'ARRAY') {
@@ -255,9 +286,14 @@ sub send_selfserve_notification {
my %reciphash = (
cc => $msgcc,
);
- my ($uname,$udom);
+ my ($uname,$udom,$need_temp_env);
if ($sender =~ /:/) {
($uname,$udom) = split(/:/,$sender);
+ if ($context eq 'usernamereq') {
+ unless ($env{'user.name'} && $env{'user.domain'}) {
+ $need_temp_env = 1;
+ }
+ }
} elsif ($context eq 'course') {
$uname = $sender;
my %courseinfo = &Apache::lonnet::coursedescription($cid);
@@ -274,9 +310,14 @@ sub send_selfserve_notification {
$message .= &Apache::lonlocal::mt_user($sender_lh,$item->{mt},@{$item->{args}})."\n";
}
}
- &Apache::lonmsg::process_sent_mail($subject,'',$numsent,$stamp,$uname,$udom,$msgcount,$cid,$$,$message,\@recusers,\@recudoms,undef,undef,undef,undef,$senderuname,$senderudom);
+ &Apache::lonmsg::process_sent_mail($subject,'',$numsent,$stamp,$uname,$udom,$msgcount,$cid,$$,$message,
+ \@recusers,\@recudoms,undef,undef,undef,undef,$senderuname,$senderudom);
my ($recipid,$recipstatus) = &Apache::lonmsg::store_recipients($subject,$uname,$udom,\%reciphash);
my $status;
+ if ($need_temp_env) {
+ $env{'user.name'} = $uname;
+ $env{'user.domain'} = $udom;
+ }
foreach my $recip (sort(keys(%{$msgcc}))) {
my ($ccname,$ccdom) = split(/:/,$recip);
my $recip_lh = &Apache::loncommon::user_lang($ccname,$ccdom,$cid);
@@ -309,10 +350,22 @@ sub send_selfserve_notification {
if ($rejectedlist) {
$message .= "\n\n".&Apache::lonlocal::mt_user($sender_lh,'Rejected author role requests:')."\n".$rejectedlist;
}
+ } elsif ($context eq 'usernamemanagers') {
+ if ($approvedlist) {
+ $message .= "\n\n".&Apache::lonlocal::mt_user($sender_lh,'Approved LON-CAPA account requests:')."\n".$approvedlist;
+ }
+ if ($rejectedlist) {
+ $message .= "\n\n".&Apache::lonlocal::mt_user($sender_lh,'Rejected LON-CAPA account requests:')."\n".$rejectedlist;
+ }
}
- $status .= &Apache::lonmsg::user_normal_msg($ccname,$ccdom,$subject,$message,undef,undef,undef,1,\%sentmessage,undef,undef,undef,1,$recipid).',';
+ $status .= &Apache::lonmsg::user_normal_msg($ccname,$ccdom,$subject,$message,undef,undef,undef,1,
+ \%sentmessage,undef,undef,undef,1,$recipid).',';
}
$status =~ s/,$//;
+ if ($need_temp_env) {
+ undef($env{'user.name'});
+ undef($env{'user.domain'});
+ }
return ($recipstatus,$status);
}
@@ -329,6 +382,11 @@ sub display_queued_requests {
$namespace = 'requestauthorqueue';
%requesthash = &Apache::lonnet::dump_dom($namespace,$dom);
$nextelement = ' ';
+ } elsif ($context eq 'requestusername') {
+ $formaction = '/adm/createuser';
+ $namespace = 'usernamequeue';
+ %requesthash = &Apache::lonnet::dump_dom($namespace,$dom);
+ $nextelement = ' ';
} else {
$formaction = '/adm/createcourse';
$namespace = 'courserequestqueue';
@@ -354,6 +412,9 @@ sub display_queued_requests {
} elsif ($context eq 'requestauthor') {
$timestamp = $requesthash{$item};
($entry) = ($item =~ /^($match_username)_approval$/);
+ } elsif ($context eq 'requestusername') {
+ $timestamp = $requesthash{$item};
+ ($entry) = (&unescape($item) =~ /^($match_username)_approval$/);
} else {
$timestamp = $requesthash{$item}{'timestamp'};
if (ref($requesthash{$item}) eq 'HASH') {
@@ -385,6 +446,8 @@ sub display_queued_requests {
&mt('Validation is attempted when the request is submitted.').' '.&mt('If unvalidated, the request will be held in a queue.').' '.&mt('Validation of pending requests is automatically repeated daily.').'
';
} elsif ($context eq 'requestauthor') {
$output .= ''.&mt('Requests for Authoring Space queued pending approval by a Domain Coordinator').' ';
+ } elsif ($context eq 'requestusername') {
+ $output .= ''.&mt('Requests for LON-CAPA accounts queued pending approval by a Domain Coordinator').' ';
} else {
$output .= ''.&mt('Course/Community requests queued pending approval by a Domain Coordinator').' ';
}
@@ -398,6 +461,8 @@ sub display_queued_requests {
$output .= &mt('There are currently no requests for official courses awaiting validation.');
} elsif ($context eq 'requestauthor') {
$output .= &mt('There are currently no requests for Authoring Space awaiting approval.');
+ } elsif ($context eq 'requestusername') {
+ $output .= &mt('There are currently no requests for LON-CAPA accounts awaiting approval.');
} elsif ($context eq 'domain') {
$output .= &mt('There are currently no course or community requests awaiting approval.');
}
@@ -417,6 +482,10 @@ sub display_queued_requests {
$output .= &mt('There are currently no enrollment requests awaiting approval.');
} elsif ($context eq 'pending') {
$output .= &mt('There are currently no requests for official courses awaiting validation.');
+ } elsif ($context eq 'requestauthor') {
+ $output .= &mt('There are currently no requests for Authoring Space awaiting approval.');
+ } elsif ($context eq 'requestusername') {
+ $output .= &mt('There are currently no requests for LON-CAPA accounts awaiting approval.');
} else {
$output .= &mt('There are currently no course or community requests awaiting approval.');
}
@@ -440,6 +509,9 @@ sub build_queue_display {
''.&mt('Date requested').' ';
} elsif ($context eq 'requestauthor') {
$output .= ''.&mt('Date requested').' ';
+ } elsif ($context eq 'requestusername') {
+ $output .= ''.&mt('Date requested').' '.
+ ''.&mt('Details').' ';
} elsif ($context eq 'pending' || $context eq 'stillpending') {
$output .= ''.&mt('Institutional code').' '.
''.&mt('Date requested').' '.
@@ -483,12 +555,21 @@ sub build_queue_display {
&Apache::loncommon::plainname($request,$dom),
$request,$dom);
}
+ } elsif ($context eq 'requestusername') {
+ if (&Apache::lonnet::homeserver($request,$dom) eq 'no_host') {
+ my $queued = 'approval';
+ $approve = $count.':'.$request;
+ $reject = $request;
+ $detailslink=''.$request.' ';
+ $namelink = $request;
+ }
} else {
my ($cnum,$ownername,$ownerdom,$type,$cdesc);
- my $queue = 'approval';
+ my $queued = 'approval';
if ($context eq 'pending' || $context eq 'stillpending') {
($cnum,$ownername,$ownerdom,$instcode,$cdesc)=split(/:/,$request,5);
- $queue = 'pending';
+ $queued = 'pending';
} else {
($cnum,$ownername,$ownerdom,$type,$cdesc)=split(/:/,$request,5);
$crstype = $type;
@@ -497,7 +578,7 @@ sub build_queue_display {
}
}
$detailslink=''.$cdesc.' ';
+ "'$dom','$cnum','$queued'".');">'.$cdesc.'';
$approve = $count.':'.$cnum;
$reject = $cnum;
$namelink = &Apache::loncommon::aboutmewrapper(
@@ -519,6 +600,9 @@ sub build_queue_display {
''.$showtime.' '."\n";
} elsif ($context eq 'requestauthor') {
$row .= ''.$showtime.' '."\n";
+ } elsif ($context eq 'requestusername') {
+ $row .= ''.$showtime.' '."\n".
+ ''.$detailslink.' '."\n";
} else {
if ($context eq 'pending' || $context eq 'stillpending') {
$row .= ''.$instcode.' '."\n";
@@ -550,15 +634,13 @@ sub update_request_queue {
%communityroles,%domdefs,%approvalmsg,%rejectionmsg,$crstype,$queue,
$firsturl,$uniquecode,%codes);
my $count=0;
- while (my @course = &Apache::loncommon::get_env_multiple('form.'.$count.'radioreq')) {
- if ($course[0] =~ /^\d+:.*/) {
- push(@approvals,$course[0]);
- } elsif ($course[0] =~ /^later:.*/) {
- #decide later
- } else {
- push(@rejections,$course[0]);
+ while (my $item = $env{'form.'.$count.'radioreq'}) {
+ if ($item =~ /^\d+:/) {
+ push(@approvals,$item);
+ } elsif ($item !~ /^later:/) {
+ push(@rejections,$item);
}
- $count+=1;
+ $count ++;
}
$now = time;
@@ -609,6 +691,31 @@ sub update_request_queue {
mt => 'Your request for Authoring Space has not been approved.',
}];
$domdesc = &Apache::lonnet::domain($cdom);
+ } elsif ($context eq 'requestusername') {
+ $namespace = 'usernamequeue';
+ $beneficiary = 'requestusername';
+ %requesthash = &Apache::lonnet::dump_dom($namespace,$cdom);
+ my %domconfig = &Apache::lonnet::get_dom('configuration',['usercreation'],$cdom);
+ if (ref($domconfig{'usercreation'}) eq 'HASH') {
+ if (ref($domconfig{'usercreation'}{'cancreate'}) eq 'HASH') {
+ if (ref($domconfig{'usercreation'}{'cancreate'}{'notify'}) eq 'HASH') {
+ $notifylist = $domconfig{'usercreation'}{'cancreate'}{'notify'}{'approval'};
+ }
+ }
+ }
+ my $domconfiguser = &Apache::lonnet::get_domainconfiguser($cdom);
+ $firsturl = &course_portal_url($domconfiguser,$cdom);
+ $approvedmsg = [{
+ mt => 'Your request for a LON-CAPA account has been approved.',
+ },
+ {
+ mt => 'Visit [_1] to log-in.',
+ args => [$firsturl],
+ }];
+ $rejectedmsg = [{
+ mt => 'Your request for a LON-CAPA account has not been approved.',
+ }];
+ $domdesc = &Apache::lonnet::domain($cdom);
} else {
$domdesc = &Apache::lonnet::domain($cdom);
$namespace = 'courserequestqueue';
@@ -732,9 +839,6 @@ sub update_request_queue {
if (&Apache::lonnet::allowed('cau',$cdom)) {
if (&Apache::lonnet::assignrole($cdom,$uname,'/'.$cdom.'/','au',undef,time,undef,undef,'requestauthor') eq 'ok') {
push(@completed,$uname);
- unless (&Apache::lonnet::del_dom($namespace,[$uname.'_approval'],$cdom) eq 'ok') {
- push(@warn_dels,$uname);
- }
&send_selfserve_notification($uname.':'.$cdom,
$approvedmsg,undef,undef,$now,
$beneficiary,$sender);
@@ -749,7 +853,7 @@ sub update_request_queue {
my $userresult =
&Apache::lonnet::put('requestauthor',\%userrequest,$cdom,$uname);
if ($userresult ne 'ok') {
- push(@warn_approves,$item);
+ push(@warn_approves,$uname.':'.$cdom);
}
} else {
push(@processing_errors,$uname);
@@ -764,6 +868,56 @@ sub update_request_queue {
push(@invalidusers,$uname.':'.$cdom);
}
push(@toremove,(@invalidusers,@nopermissions));
+ } elsif ($context eq 'requestusername') {
+ my ($num,$uname) = split(/:/,$item);
+ my $dbname = 'nohist_requestedusernames';
+ my $domconfiguser = &Apache::lonnet::get_domainconfiguser($cdom);
+ my %curr = &Apache::lonnet::get($dbname,[$uname],$cdom,$domconfiguser);
+
+ if (ref($curr{$uname}) eq 'HASH') {
+ my ($username,$logtoken,$serverid,$encpass,$courseid,$id,$firstname,
+ $middlename,$lastname,$generation);
+ $curr{$uname}{'timestamp'} = $now;
+ $curr{$uname}{'adjudicator'} = $env{'user.name'}.':'.$env{'user.domain'};
+ $courseid = $curr{$uname}{'courseid'};
+ $id = $curr{$uname}{'id'};
+ $firstname = $curr{$uname}{'firstname'};
+ $middlename = $curr{$uname}{'middlename'};
+ $lastname = $curr{$uname}{'lastname'};
+ $generation = $curr{$uname}{'generation'};
+
+ my ($key,$caller)=split(/&/,$curr{$uname}{'tmpinfo'});
+ if ($caller eq 'createaccount') {
+ my $upass = &Apache::loncommon::des_decrypt($key,$curr{$uname}{'upass'});
+ undef($curr{$uname}{'upass'});
+ my $result =
+ &Apache::lonnet::modifyuser($cdom,$uname,$id,'internal',$upass,
+ $firstname,$middlename,$lastname,
+ $generation,undef,undef,$uname);
+ if ($result eq 'ok') {
+ $curr{$uname}{'status'} = 'created';
+ push(@completed,$uname);
+ my $uhome = &Apache::lonnet::homeserver($uname,$cdom);
+ if ($uhome eq 'no_host') {
+ push(@warn_approves,$uname);
+ } else {
+ &send_selfserve_notification($uname.':'.$cdom,
+ $approvedmsg,undef,undef,$now,
+ $beneficiary,$sender);
+ if (&Apache::lonnet::put($dbname,\%curr,$cdom,$domconfiguser) ne 'ok') {
+ push(@warn_approves,$uname);
+ }
+ }
+ } else {
+ push(@processing_errors,$uname);
+ }
+ } else {
+ push(@processing_errors,$uname);
+ }
+ } else {
+ push(@invalidusers,$uname);
+ }
+ push(@toremove,@invalidusers);
} else {
my ($num,$cnum) = split(':',$item);
if (ref($requesthash{$cnum.'_'.$queue}) eq 'HASH') {
@@ -899,20 +1053,24 @@ sub update_request_queue {
@changes = map {$_.'_'.$queue} (@changes);
} elsif ($context eq 'requestauthor') {
@changes = map {$_.'_approval'} (@changes);
+ } elsif ($context eq 'requestusername') {
+ @changes = map {&escape($_).'_approval'} (@changes);
}
if (@rejections) {
foreach my $item (@rejections) {
if (($context eq 'course') || ($context eq 'requestauthor')) {
- my ($user,$uname,$udom,%userrequest,$key);
+ my ($user,$uname,$udom,%userrequest,$key,$dbname);
if ($context eq 'requestauthor') {
$uname = $item;
$udom = $cdom;
$user = $uname.':'.$udom;
$key = 'author';
+ $dbname = 'requestauthor';
} else {
$user = $item;
($uname,$udom) = split(/:/,$user);
$key = $cdom.'_'.$cnum;
+ $dbname = $namespace;
}
&send_selfserve_notification($user,$rejectedmsg,$cid,$coursedesc,
$now,$beneficiary,$sender,undef,undef,
@@ -928,10 +1086,29 @@ sub update_request_queue {
$userrequest{'author_status'} = 'rejection';
}
my $userresult =
- &Apache::lonnet::put('requestauthor',\%userrequest,$udom,$uname);
+ &Apache::lonnet::put($dbname,\%userrequest,$udom,$uname);
if ($userresult ne 'ok') {
push(@warn_rejects,$item);
}
+ } elsif ($context eq 'requestusername') {
+ my ($uname,$udom,$dbname);
+ $uname = $item;
+ $udom = $cdom;
+ $dbname = 'nohist_requestedusernames';
+ my $domconfiguser = &Apache::lonnet::get_domainconfiguser($cdom);
+ my %curr = &Apache::lonnet::get($dbname,[$uname],$cdom,$domconfiguser);
+ if (ref($curr{$uname}) eq 'HASH') {
+ $curr{$uname}{'status'} = 'rejected';
+ $curr{$uname}{'timestamp'} = $now;
+ $curr{$uname}{'adjudicator'} = $env{'user.name'}.':'.$env{'user.domain'};
+ undef($curr{$uname}{'tmpinfo'});
+ undef($curr{$uname}{'upass'});
+ }
+ my $userresult =
+ &Apache::lonnet::put($dbname,\%curr,$cdom,$domconfiguser);
+ if ($userresult ne 'ok') {
+ push(@warn_rejects,$uname);
+ }
} else {
my $cnum = $item;
if (ref($requesthash{$cnum.'_'.$queue}) eq 'HASH') {
@@ -994,16 +1171,29 @@ sub update_request_queue {
}
}
if (@toremove) {
+ my $domconfiguser = &Apache::lonnet::get_domainconfiguser($cdom);
foreach my $item (@toremove) {
- my %userrequest = (
- author => {
- timestamp => $now,
- adjudicator => $env{'user.name'}.':'.$env{'user.domain'},
- status => 'deleted',
- },
- author_status => 'deleted',
- );
- &Apache::lonnet::put('requestauthor',\%userrequest,$cdom,$item);
+ if ($context eq 'requestauthor') {
+ my %userrequest = (
+ author => {
+ timestamp => $now,
+ adjudicator => $env{'user.name'}.':'.$env{'user.domain'},
+ status => 'deleted',
+ },
+ author_status => 'deleted',
+ );
+ &Apache::lonnet::put('requestauthor',\%userrequest,$cdom,$item);
+ } elsif ($context eq 'requestusername') {
+ my $dbname = 'nohist_requestedusernames';
+ my %curr = &Apache::lonnet::get($dbname,[$item],$cdom,$domconfiguser);
+ if (ref($curr{$item}) eq 'HASH') {
+ $curr{$item}{'status'} = 'deleted';
+ $curr{$item}{'timestamp'} = $now;
+ $curr{$item}{'adjudicator'} = $env{'user.name'}.':'.$env{'user.domain'};
+ undef($curr{$item}{'upass'});
+ undef($curr{$item}{'tmpinfo'});
+ }
+ }
}
@toremove = map {$_.'_approval'} (@toremove);
my $delresult = &Apache::lonnet::del_dom($namespace,\@toremove,$cdom);
@@ -1077,6 +1267,30 @@ sub update_request_queue {
$now,'authormanagers',$sender,
$approvedlist,$rejectedlist);
}
+ } elsif ($context eq 'requestusername') {
+ $chgmsg = "'Action was taken on the following LON-CAPA account requests by [_1].',$namelink";
+ if (@completed) {
+ $approvedlist = join("\n",@completed);
+ $output .= ''.&mt('The following requests were approved:').'
';
+ foreach my $uname (@completed) {
+ $output .= ''.$uname.' ';
+
+ }
+ $output .= ' ';
+ }
+ if (@rejections) {
+ $rejectedlist = join("\n",@rejections);
+ $output .= ''.&mt('The following requests were rejected:').'
';
+ foreach my $uname (@rejections) {
+ $output .= ''.$uname.' ';
+ }
+ $output .= ' ';
+ }
+ if ($notifylist ne '') {
+ &send_selfserve_notification($notifylist,$chgmsg,undef,$domdesc,
+ $now,'usernamemanagers',$sender,
+ $approvedlist,$rejectedlist);
+ }
} else {
$chgmsg = "'Action was taken on the following course and community requests by [_1].',$namelink";
if (@completed) {
@@ -1118,6 +1332,10 @@ sub update_request_queue {
$approvedlist,$rejectedlist,$crstype);
}
}
+ } else {
+ if (($context eq 'requestauthor') || ($context eq 'requestusername')) {
+ push(@warn_dels,@changes);
+ }
}
}
if (@existing) {
@@ -1237,6 +1455,12 @@ sub update_request_queue {
$output .= ''.$userlink.' ';
}
$output .= '';
+ } elsif ($context eq 'requestusername') {
+ $output .= ''.&mt('The following requests could not be processed because an error occurred:').'
';
+ foreach my $uname (@processing_errors) {
+ $output .= ''.$uname.' ';
+ }
+ $output .= ' ';
} else {
$output .= ''.&mt('The following course/community creation requests could not be processed because an error occurred:').'
';
foreach my $cnum (@processing_errors) {
@@ -1279,6 +1503,12 @@ sub update_request_queue {
$output .= ''.$userlink.' ';
}
$output .= ' ';
+ } elsif ($context eq 'requestusername') {
+ $output .= ''.&mt("For the following users, an error occurred when updating the account request record for the user:").'
';
+ foreach my $uname (@warn_approves,@warn_rejects) {
+ $output .= ''.$uname.' ';
+ }
+ $output .= ' ';
} else {
$output .= ''.&mt("For the following course/community requests an error occurred when updating the requestor's own requests record:").'
';
foreach my $cnum (@warn_approves,@warn_rejects) {
@@ -1302,6 +1532,13 @@ sub update_request_queue {
$output .= ''.$userlink.' ';
}
$output .= ' ';
+ } elsif ($context eq 'requestusername') {
+ $output .= ''.&mt("For the following requests an error occurred when removing the request from the queue:").'
';
+ foreach my $item (@warn_dels) {
+ my ($escuname) = split(/_/,$item);
+ $output .= ''.&unescape($escuname).' ';
+ }
+ $output .= ' ';
} else {
$output .= ''.&mt("For the following course/community requests an error occurred when removing requests from the pending queue:").'
';
foreach my $cnum (@warn_dels) {