version 1.9, 2009/08/12 02:04:38
|
version 1.10, 2009/08/12 12:40:33
|
Line 114 sub handler {
|
Line 114 sub handler {
|
} |
} |
|
|
my %trail = ( |
my %trail = ( |
crstype => 'Course Request Action', |
crstype => 'Course Request Action', |
codepick => 'Category', |
codepick => 'Category', |
courseinfo => 'Description', |
courseinfo => 'Description', |
enrollment => 'Enrollment', |
enrollment => 'Enrollment', |
personnel => 'Personnel', |
personnel => 'Personnel', |
review => 'Review', |
review => 'Review', |
process => 'Result', |
process => 'Result', |
|
pick_request => 'Display Summary', |
); |
); |
|
|
my $page = 0; |
my $page = 0; |
Line 179 sub handler {
|
Line 180 sub handler {
|
'</div>'.&Apache::loncommon::end_page()); |
'</div>'.&Apache::loncommon::end_page()); |
} |
} |
} elsif ($action eq 'view') { |
} elsif ($action eq 'view') { |
&print_request_status($jscript,$loaditems,$crumb); |
if ($state eq 'crstype') { |
|
&print_main_menu($r,\%can_request,\%states,$dom,$jscript,'',$crumb); |
|
} elsif ($state eq 'pick_request') { |
|
$r->print(&print_request_status($dom,$crumb)); |
|
} |
} elsif ($action eq 'log') { |
} elsif ($action eq 'log') { |
&print_request_logs($jscript,$loaditems,$crumb); |
&print_request_logs($jscript,$loaditems,$crumb); |
} else { |
} else { |
Line 554 sub print_request_form {
|
Line 559 sub print_request_form {
|
$prev = $states->{$action}[$page-1]; |
$prev = $states->{$action}[$page-1]; |
$next = $states->{$action}[$page+1]; |
$next = $states->{$action}[$page+1]; |
my %navtxt = &Apache::lonlocal::texthash ( |
my %navtxt = &Apache::lonlocal::texthash ( |
prev => 'Previous', |
prev => 'Back', |
next => 'Next', |
next => 'Next', |
); |
); |
$crstype = $env{'form.crstype'}; |
$crstype = $env{'form.crstype'}; |
Line 636 sub print_request_form {
|
Line 641 sub print_request_form {
|
$r->print(&print_review($formname,$dom,\@codetitles,\%cat_titles,\%cat_order, |
$r->print(&print_review($formname,$dom,\@codetitles,\%cat_titles,\%cat_order, |
\@code_order)); |
\@code_order)); |
$navtxt{'next'} = &mt('Submit course request'); |
$navtxt{'next'} = &mt('Submit course request'); |
} elsif ($state eq '') { |
} elsif ($state eq 'process') { |
my $result = &print_request_outcome($dom); |
if ($crstype eq 'official') { |
|
&Apache::lonnet::auto_possible_instcodes($dom,\@codetitles,\%cat_titles, |
|
\%cat_order,\@code_order); |
|
} |
|
my $result = &print_request_outcome($dom,\@codetitles,\@code_order); |
} |
} |
my @excluded = ('counter'); |
my @excluded = ('counter'); |
my %elements = &form_elements($dom); |
my %elements = &form_elements($dom); |
Line 911 sub print_personnel_menu {
|
Line 920 sub print_personnel_menu {
|
} |
} |
|
|
sub print_request_status { |
sub print_request_status { |
return; |
my ($dom,$crumb) = @_; |
|
my $js = <<END; |
|
|
|
function backPage(formname,prevstate) { |
|
formname.state.value = prevstate; |
|
formname.submit(); |
|
} |
|
|
|
END |
|
my $output = &header('Course Requests',$js).$crumb; |
|
my %requests = &Apache::lonnet::dumpstore('courserequests',$env{'user.domain'}, |
|
$env{'user.name'}); |
|
my %queue_by_date; |
|
foreach my $key (keys(%requests)) { |
|
if (ref($requests{$key}) eq 'HASH') { |
|
my ($cdom,$cnum) = split('_',$key); |
|
next if ($cdom ne $dom); |
|
my $entry; |
|
my $timestamp = $requests{$key}{'timestamp'}; |
|
my $crstype = $requests{$key}{'crstype'}; |
|
my $status = $requests{$key}{'status'}; |
|
next unless (($env{'form.crstype'} eq 'all') || |
|
($env{'form.crstype'} eq $crstype)); |
|
next unless (($status eq 'approval') || ($status eq 'pending')); |
|
if (ref($requests{$key}{'details'}) eq 'HASH') { |
|
$entry = $key.':'.$crstype.':'.$requests{$key}{'details'}{'cdesc'}; |
|
if ($crstype eq 'official') { |
|
$entry .= ':'.$requests{$key}{'details'}{'instcode'}; |
|
} |
|
} |
|
if ($entry ne '') { |
|
if (exists($queue_by_date{$timestamp})) { |
|
if (ref($queue_by_date{$timestamp}) eq 'ARRAY') { |
|
push(@{$queue_by_date{$timestamp}},$entry); |
|
} |
|
} else { |
|
@{$queue_by_date{$timestamp}} = ($entry); |
|
} |
|
} |
|
} |
|
} |
|
my $formname = 'requestcrs'; |
|
my @sortedtimes = sort {$a <=> $b} (keys(%queue_by_date)); |
|
$output .= '<form method="post" name="'.$formname.'" action="/adm/requestcourse" />'."\n". |
|
'<input type="hidden" name="action" value="'.$env{'form.action'}.'" />'."\n". |
|
'<input type="hidden" name="state" value="'.$env{'form.state'}.'" />'."\n". |
|
'<input type="hidden" name="crstype" value="'.$env{'form.crstype'}.'" />'."\n"; |
|
if (@sortedtimes > 0) { |
|
$output .= &Apache::loncommon::start_data_table(). |
|
&Apache::loncommon::start_data_table_header_row(). |
|
'<th>'.&mt('Action').'</th>'. |
|
'<th>'.&mt('Description').'</th>'; |
|
if ($env{'form.crstype'} eq 'all') { |
|
$output .= '<th>'.&mt('Type').'</th>'; |
|
} |
|
if (($env{'form.crstype'} eq 'all') || ($env{'form.crstype'} eq 'official')) { |
|
$output .= '<th>'.&mt('Institutional Code').'</th>'; |
|
} |
|
$output .= '<th>'.&mt('Date requested').'</th>'. |
|
&Apache::loncommon::end_data_table_header_row(); |
|
my $count = 0; |
|
foreach my $item (@sortedtimes) { |
|
my $showtime = &Apache::lonlocal::locallocaltime($item); |
|
if (ref($queue_by_date{$item}) eq 'ARRAY') { |
|
foreach my $request (sort(@{$queue_by_date{$item}})) { |
|
my ($key,$type,$desc,$instcode) = split(':',$request); |
|
my ($cdom,$cnum) = split('_',$key); |
|
$output .= &Apache::loncommon::start_data_table_row(). |
|
'<td><input type="button" value="'.&mt('Select').'" onclick="javascript:viewrequest('."'$cdom','$cnum'".')" /></td>'. |
|
'<td>'.$desc.'</td>'; |
|
if ($env{'form.crstype'} eq 'all') { |
|
$output .= '<td>'.&course_types($type).'</td>'; |
|
} |
|
if (($env{'form.crstype'} eq 'all') || |
|
($env{'form.crstype'} eq 'official')) { |
|
$output .= '<td>'.$instcode.'</td>'; |
|
} |
|
$output .= '<td>'.$showtime.'</td>'. |
|
&Apache::loncommon::end_data_table_row(); |
|
} |
|
} |
|
} |
|
$output .= &Apache::loncommon::end_data_table(); |
|
} else { |
|
$output .= '<div class="LC_info">'.&mt('You have no course requests pending approval by a Domain Coordinator or held in a queue pending administrative action at your institution.').'</div>'; |
|
} |
|
$output .= ' |
|
<input type="button" name="prev" value="'.&mt('Back').'" onclick="javascript:backPage(document.'.$formname.",'crstype'".')" /> |
|
</form>'. |
|
&Apache::loncommon::end_page(); |
|
return $output; |
} |
} |
|
|
sub print_request_logs { |
sub print_request_logs { |
|
my ($jscript,$loaditems,$crumb) = @_; |
return; |
return; |
} |
} |
|
|
Line 1318 sub display_navbuttons {
|
Line 1418 sub display_navbuttons {
|
} |
} |
|
|
sub print_request_outcome { |
sub print_request_outcome { |
my ($dom) = @_; |
my ($dom,$codetitles,$code_order) = @_; |
my $output; |
my ($output,$cnum,$now,$req_notifylist,$crstype,$startenroll,$endenroll, |
my $cnum = $env{'form.cnum'}; |
%sections,%crosslistings,%personnel,@baduname,@missingdom,%domconfig,); |
|
$cnum = $env{'form.cnum'}; |
unless ($cnum =~ /^$match_courseid$/) { |
unless ($cnum =~ /^$match_courseid$/) { |
$output = &mt('Invalid LON-CAPA course number for the new course')."\n"; |
$output = &mt('Invalid LON-CAPA course number for the new course')."\n"; |
return $output; |
return $output; |
} |
} |
my $req_notifylist; |
%domconfig = &Apache::lonnet::get_dom('configuration',['requestcourses'],$dom); |
my %domconfig = &Apache::lonnet::get_dom('configuration',['requestcourses'],$dom); |
|
if (ref($domconfig{'requestcourses'}) eq 'HASH') { |
if (ref($domconfig{'requestcourses'}) eq 'HASH') { |
if (ref($domconfig{'requestcourses'}{'notify'}) eq 'HASH') { |
if (ref($domconfig{'requestcourses'}{'notify'}) eq 'HASH') { |
$req_notifylist = $domconfig{'requestcourses'}{'notify'}{'approval'}; |
$req_notifylist = $domconfig{'requestcourses'}{'notify'}{'approval'}; |
} |
} |
} |
} |
my $now = time; |
$now = time; |
my $crstype = $env{'form.crstype'}; |
$crstype = $env{'form.crstype'}; |
my ($startenroll,$endenroll,%sections,%crosslistings,%personnel); |
|
if ($crstype eq 'official') { |
if ($crstype eq 'official') { |
if (&Apache::lonnet::auto_run('',$dom)) { |
if (&Apache::lonnet::auto_run('',$dom)) { |
($startenroll,$endenroll)=&dates_from_form('startenroll','endenroll'); |
($startenroll,$endenroll)=&dates_from_form('startenroll','endenroll'); |
} |
} |
%sections = (); |
for (my $i=0; $i<$env{'form.sectotal'}; $i++) { |
%crosslistings = (); |
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 ($startaccess,$endaccess) = &dates_from_form('startaccess','endacess'); |
my $details = { |
my $details = { |
owner => $env{'user.name'}, |
owner => $env{'user.name'}, |
domain => $env{'user.domain'}, |
domain => $env{'user.domain'}, |
cdom => $dom, |
cdom => $dom, |
cnum => $cnum, |
cnum => $cnum, |
cdesc => $env{'form.cdesc'}, |
cdesc => $env{'form.cdesc'}, |
crstype => $env{'form.crstype'}, |
crstype => $env{'form.crstype'}, |
instcode => $env{'form.instcode'}, |
instcode => $env{'form.instcode'}, |
clonedomain => $env{'form.clonedomain'}, |
clonedomain => $env{'form.clonedomain'}, |
clonecourse => $env{'form.clonecourse'}, |
clonecourse => $env{'form.clonecourse'}, |
datemode => $env{'form.datemode'}, |
datemode => $env{'form.datemode'}, |
dateshift => $env{'form.datshift'}, |
dateshift => $env{'form.datshift'}, |
sectotal => $env{'form.sectotal'}, |
sectotal => $env{'form.sectotal'}, |
sections => \%sections, |
sections => \%sections, |
crosstotal => $env{'form.crosstotal'}, |
crosslisttotal => $env{'form.crosslisttotal'}, |
crosslistings => \%crosslistings, |
crosslistings => \%crosslistings, |
autoadds => $env{'form.autoadds'}, |
autoadds => $env{'form.autoadds'}, |
autodrops => $env{'form.autodrops'}, |
autodrops => $env{'form.autodrops'}, |
startenroll => $startenroll, |
startenroll => $startenroll, |
endenroll => $endenroll, |
endenroll => $endenroll, |
startaccess => $startaccess, |
startaccess => $startaccess, |
endaccess => $endaccess, |
endaccess => $endaccess, |
personnel => \%personnel |
personnel => \%personnel, |
}; |
}; |
my @inststatuses; |
my @inststatuses; |
my $val = &get_processtype($dom,$crstype,\@inststatuses,\%domconfig); |
my $val = &get_processtype($dom,$crstype,\@inststatuses,\%domconfig); |
Line 1382 sub print_request_outcome {
|
Line 1521 sub print_request_outcome {
|
} else { |
} else { |
my ($disposition,$message); |
my ($disposition,$message); |
my %reqhash = ( |
my %reqhash = ( |
crstype => $crstype, |
timestamp => $now, |
details => $details, |
crstype => $crstype, |
|
details => $details, |
); |
); |
my $requestkey = $dom.'_'.$cnum; |
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'}, |
$disposition = &check_autolimit($env{'user.name'},$env{'user.domain'}, |
$dom,$crstype,$val,\$message); |
$dom,$crstype,$limit,\$message); |
} elsif ($val eq 'validate') { |
} elsif ($val eq 'validate') { |
$disposition = |
$disposition = |
&Apache::lonnet::auto_courserequest_validation($dom,$details, |
&Apache::lonnet::auto_courserequest_validation($dom,$details, |
Line 1471 sub print_request_outcome {
|
Line 1614 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') { |
if ($storeresult ne 'ok') { |
$output .= '<span class="LC_warning">'.&mt('An error occurred saving a record of the details of your request.').'</span><br />'; |
$output .= '<span class="LC_warning">'.&mt('An error occurred saving a record of the details of your request.').'</span><br />'; |
&logthis("Error saving course request - $requestkey for $env{'user.name'}:$env{'user.domain'} - $storeresult"); |
&logthis("Error saving course request - $requestkey for $env{'user.name'}:$env{'user.domain'} - $storeresult"); |
Line 1562 sub get_processtype {
|
Line 1711 sub get_processtype {
|
} |
} |
|
|
sub check_autolimit { |
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.').'<br />'.&mt("Your $typename->{$crstype} limit is [_1].",$limit); |
|
} |
|
return 'rejected'; |
|
} |
return; |
return; |
} |
} |
|
|