'.&mt('You have no matching course requests awaiting approval by a Domain Coordinator or held in a queue pending administrative action at your institution.').'
';
+ }
+ $output .= '
+
+';
+ return $output;
}
sub print_request_logs {
+ my ($jscript,$loaditems,$crumb) = @_;
return;
}
@@ -1318,54 +1468,94 @@ sub display_navbuttons {
}
sub print_request_outcome {
- my ($dom) = @_;
- my $output;
- my $cnum = $env{'form.cnum'};
+ my ($dom,$codetitles,$code_order) = @_;
+ my ($output,$cnum,$now,$req_notifylist,$crstype,$startenroll,$endenroll,
+ %sections,%crosslistings,%personnel,@baduname,@missingdom,%domconfig,);
+ $cnum = $env{'form.cnum'};
unless ($cnum =~ /^$match_courseid$/) {
$output = &mt('Invalid LON-CAPA course number for the new course')."\n";
return $output;
}
- my $req_notifylist;
- my %domconfig = &Apache::lonnet::get_dom('configuration',['requestcourses'],$dom);
+
+ %domconfig = &Apache::lonnet::get_dom('configuration',['requestcourses'],$dom);
if (ref($domconfig{'requestcourses'}) eq 'HASH') {
if (ref($domconfig{'requestcourses'}{'notify'}) eq 'HASH') {
$req_notifylist = $domconfig{'requestcourses'}{'notify'}{'approval'};
}
}
- my $now = time;
- my $crstype = $env{'form.crstype'};
- my ($startenroll,$endenroll,%sections,%crosslistings,%personnel);
+ $now = time;
+ $crstype = $env{'form.crstype'};
if ($crstype eq 'official') {
if (&Apache::lonnet::auto_run('',$dom)) {
($startenroll,$endenroll)=&dates_from_form('startenroll','endenroll');
}
- %sections = ();
- %crosslistings = ();
+ for (my $i=0; $i<$env{'form.sectotal'}; $i++) {
+ if ($env{'form.sec_'.$i}) {
+ if ($env{'form.secnum_'.$i} ne '') {
+ $sections{$env{'form.secnum_'.$i}} = $env{'form.loncapasec_'.$i};
+ }
+ }
+ }
+ for (my $i=0; $i<$env{'form.crosslisttotal'}; $i++) {
+ if ($env{'form.crosslist_'.$i}) {
+ my $xlistinfo = '';
+ if (ref($code_order) eq 'ARRAY') {
+ if (@{$code_order} > 0) {
+ foreach my $item (@{$code_order}) {
+ $xlistinfo .= $env{'form.crosslist_'.$i.'_'.$item};
+ }
+ }
+ }
+ $xlistinfo .= $env{'form.crosslist_'.$i.'_instsec'};
+ $crosslistings{$xlistinfo} = $env{'form.crosslist_'.$i.'_lcsec'};
+ }
+ }
}
+
+ for (my $i=0; $i<$env{'form.persontotal'}; $i++) {
+ my $uname = $env{'form.person_'.$i.'_uname'};
+ my $udom = $env{'form.person_'.$i.'_uname'};
+ if (($uname =~ /^$match_username$/) && ($udom =~ /^$match_domain$/)) {
+ if (&Apache::lonnet::domain($udom) ne '') {
+ $personnel{$uname.':'.$udom} = {
+ first => $env{'form.person_'.$i.'_first'},
+ last => $env{'form.person_'.$i.'_last'},
+ email => $env{'form.person_'.$i.'_email'},
+ role => $env{'form.person_'.$i.'_role'},
+ sections => $env{'form.person_'.$i.'_sections'},
+ };
+ } else {
+ push(@missingdom,$uname.':'.$udom);
+ }
+ } else {
+ push(@baduname,$uname.':'.$udom);
+ }
+ }
+
my ($startaccess,$endaccess) = &dates_from_form('startaccess','endacess');
my $details = {
- owner => $env{'user.name'},
- domain => $env{'user.domain'},
- cdom => $dom,
- cnum => $cnum,
- cdesc => $env{'form.cdesc'},
- crstype => $env{'form.crstype'},
- instcode => $env{'form.instcode'},
- clonedomain => $env{'form.clonedomain'},
- clonecourse => $env{'form.clonecourse'},
- datemode => $env{'form.datemode'},
- dateshift => $env{'form.datshift'},
- sectotal => $env{'form.sectotal'},
- sections => \%sections,
- crosstotal => $env{'form.crosstotal'},
- crosslistings => \%crosslistings,
- autoadds => $env{'form.autoadds'},
- autodrops => $env{'form.autodrops'},
- startenroll => $startenroll,
- endenroll => $endenroll,
- startaccess => $startaccess,
- endaccess => $endaccess,
- personnel => \%personnel
+ owner => $env{'user.name'},
+ domain => $env{'user.domain'},
+ cdom => $dom,
+ cnum => $cnum,
+ cdesc => $env{'form.cdesc'},
+ crstype => $env{'form.crstype'},
+ instcode => $env{'form.instcode'},
+ clonedomain => $env{'form.clonedomain'},
+ clonecourse => $env{'form.clonecourse'},
+ datemode => $env{'form.datemode'},
+ dateshift => $env{'form.datshift'},
+ sectotal => $env{'form.sectotal'},
+ sections => \%sections,
+ crosslisttotal => $env{'form.crosslisttotal'},
+ crosslistings => \%crosslistings,
+ autoadds => $env{'form.autoadds'},
+ autodrops => $env{'form.autodrops'},
+ startenroll => $startenroll,
+ endenroll => $endenroll,
+ startaccess => $startaccess,
+ endaccess => $endaccess,
+ personnel => \%personnel,
};
my @inststatuses;
my $val = &get_processtype($dom,$crstype,\@inststatuses,\%domconfig);
@@ -1382,13 +1572,17 @@ sub print_request_outcome {
} else {
my ($disposition,$message);
my %reqhash = (
- crstype => $crstype,
- details => $details,
+ timestamp => $now,
+ crstype => $crstype,
+ details => $details,
);
my $requestkey = $dom.'_'.$cnum;
- if ($val =~ /^autolimit=/) {
+ if ($val eq 'autolimit=') {
+ $disposition = 'process';
+ } elsif ($val =~ /^autolimit=(\d+)$/) {
+ my $limit = $1;
$disposition = &check_autolimit($env{'user.name'},$env{'user.domain'},
- $dom,$crstype,$val,\$message);
+ $dom,$crstype,$limit,\$message);
} elsif ($val eq 'validate') {
$disposition =
&Apache::lonnet::auto_courserequest_validation($dom,$details,
@@ -1471,7 +1665,13 @@ sub print_request_outcome {
}
}
- my $storeresult = &Apache::lonnet::store_coursereq($requestkey,\%reqhash);
+ my $storeresult;
+ if ($requestkey =~ /^($match_domain)_($match_courseid)$/) {
+ $storeresult = &Apache::lonnet::store_userdata(\%reqhash,$requestkey,
+ 'courserequests');
+ } else {
+ $storeresult = 'error: invalid requestkey format';
+ }
if ($storeresult ne 'ok') {
$output .= ''.&mt('An error occurred saving a record of the details of your request.').' ';
&logthis("Error saving course request - $requestkey for $env{'user.name'}:$env{'user.domain'} - $storeresult");
@@ -1562,6 +1762,36 @@ sub get_processtype {
}
sub check_autolimit {
+ my ($uname,$udom,$dom,$crstype,$limit,$message) = @_;
+ my %crsroles = &Apache::lonnet::get_my_roles($env{'user.name'},$env{'user.domain'},
+ 'userroles',['active','future'],['cc'],[$dom]);
+ my ($types,$typename) = &course_types();
+ my %requests = &Apache::lonnet::dumpstore('courserequests',$udom,$uname);
+ my %count;
+ if (ref($types) eq 'ARRAY') {
+ foreach my $type (@{$types}) {
+ $count{$type} = 0;
+ }
+ }
+ foreach my $key (keys(%requests)) {
+ my ($cdom,$cnum) = split('_',$key);
+ if (exists($crsroles{$cnum.':'.$cdom.':cc'})) {
+ if (ref($requests{$key}) eq 'HASH') {
+ my $type = $requests{$key}{'crstype'};
+ if ($type =~ /^official|unofficial|community$/) {
+ $count{$type} ++;
+ }
+ }
+ }
+ }
+ if ($count{$crstype} < $limit) {
+ return 'process';
+ } else {
+ if (ref($typename) eq 'HASH') {
+ $$message = &mt('Your request has not been processed because you have reached the limit for the number of courses of this type.').' '.&mt("Your $typename->{$crstype} limit is [_1].",$limit);
+ }
+ return 'rejected';
+ }
return;
}