version 1.16, 2009/08/18 01:41:37
|
version 1.23, 2009/08/22 21:08:39
|
Line 116 use LONCAPA qw(:DEFAULT :match);
|
Line 116 use LONCAPA qw(:DEFAULT :match);
|
|
|
sub handler { |
sub handler { |
my ($r) = @_; |
my ($r) = @_; |
|
&Apache::loncommon::content_type($r,'text/html'); |
|
$r->send_http_header; |
if ($r->header_only) { |
if ($r->header_only) { |
&Apache::loncommon::content_type($r,'text/html'); |
|
$r->send_http_header; |
|
return OK; |
return OK; |
} |
} |
&Apache::loncommon::content_type($r,'text/html'); |
|
$r->send_http_header; |
|
|
|
&Apache::lonhtmlcommon::clear_breadcrumbs(); |
&Apache::lonhtmlcommon::clear_breadcrumbs(); |
my $dom = &get_course_dom(); |
my $dom = &get_course_dom(); |
Line 159 sub handler {
|
Line 157 sub handler {
|
$states{'view'} = ['pick_request','details','cancel','removal']; |
$states{'view'} = ['pick_request','details','cancel','removal']; |
$states{'log'} = ['filter','display']; |
$states{'log'} = ['filter','display']; |
$states{'new'} = ['courseinfo','enrollment','personnel','review','process']; |
$states{'new'} = ['courseinfo','enrollment','personnel','review','process']; |
|
|
if (($action eq 'new') && ($env{'form.crstype'} eq 'official')) { |
if (($action eq 'new') && ($env{'form.crstype'} eq 'official')) { |
unless ($env{'form.state'} eq 'crstype') { |
unless ($env{'form.state'} eq 'crstype') { |
unshift (@{$states{'new'}},'codepick'); |
unshift(@{$states{'new'}},'codepick'); |
} |
} |
} |
} |
|
|
Line 429 sub check_can_request {
|
Line 428 sub check_can_request {
|
my ($dom,$can_request) = @_; |
my ($dom,$can_request) = @_; |
my $canreq = 0; |
my $canreq = 0; |
my ($types,$typename) = &course_types(); |
my ($types,$typename) = &course_types(); |
|
my @options = ('approval','validate','autolimit'); |
|
my $optregex = join('|',@options); |
if ((ref($can_request) eq 'HASH') && (ref($types) eq 'ARRAY')) { |
if ((ref($can_request) eq 'HASH') && (ref($types) eq 'ARRAY')) { |
foreach my $type (@{$types}) { |
foreach my $type (@{$types}) { |
if (&Apache::lonnet::usertools_access($env{'user.name'}, |
if (&Apache::lonnet::usertools_access($env{'user.name'}, |
Line 444 sub check_can_request {
|
Line 445 sub check_can_request {
|
if (@curr > 0) { |
if (@curr > 0) { |
$canreq ++; |
$canreq ++; |
unless ($dom eq $env{'user.domain'}) { |
unless ($dom eq $env{'user.domain'}) { |
if (grep(/^\Q$dom\E$/,@curr)) { |
if (grep(/^\Q$dom\E:($optregex)(=?\d*)$/,@curr)) { |
$can_request->{$type} = 1; |
$can_request->{$type} = 1; |
} |
} |
} |
} |
Line 775 sub print_request_form {
|
Line 776 sub print_request_form {
|
} |
} |
if ($instcode ne '') { |
if ($instcode ne '') { |
$code_chk = &Apache::lonnet::auto_validate_instcode('',$dom,$instcode); |
$code_chk = &Apache::lonnet::auto_validate_instcode('',$dom,$instcode); |
if ($code_chk eq 'ok') { |
if ($code_chk eq 'valid') { |
$message = '<div class="LC_info">'. |
$message = '<div class="LC_info">'. |
&mt('The chosen course category [_1] is valid.','<b>'. |
&mt('The chosen course category [_1] is valid.','<b>'. |
$instcode.'</b>').'</div>'; |
$instcode.'</b>').'</div>'; |
Line 791 sub print_request_form {
|
Line 792 sub print_request_form {
|
$message = '<div class="LC_warning">'. |
$message = '<div class="LC_warning">'. |
&mt('No course was found matching your choice of institutional course category.'); |
&mt('No course was found matching your choice of institutional course category.'); |
} |
} |
unless ($code_chk eq 'ok') { |
unless ($code_chk eq 'valid') { |
$prev = 'crstype'; |
$prev = 'crstype'; |
} |
} |
$r->print($message); |
$r->print($message); |
Line 809 sub print_request_form {
|
Line 810 sub print_request_form {
|
$r->print('<div>'.&Apache::lonhtmlcommon::start_pick_box().$codepicker. |
$r->print('<div>'.&Apache::lonhtmlcommon::start_pick_box().$codepicker. |
&Apache::lonhtmlcommon::end_pick_box().'</div>'); |
&Apache::lonhtmlcommon::end_pick_box().'</div>'); |
} else { |
} else { |
|
$next = $states->{$action}[$page+2]; |
$r->print(&courseinfo_form($dom,$formname,$crstype,$next)); |
$r->print(&courseinfo_form($dom,$formname,$crstype,$next)); |
} |
} |
} else { |
} else { |
|
if ($crstype eq 'official') { |
|
$next = $states->{$action}[$page+2]; |
|
} |
$r->print(&courseinfo_form($dom,$formname,$crstype,$next)); |
$r->print(&courseinfo_form($dom,$formname,$crstype,$next)); |
} |
} |
} elsif ($prev eq 'codepick') { |
} elsif ($prev eq 'codepick') { |
|
if ($env{'form.instcode'} eq '') { |
|
$prev = $states->{$action}[$page-2]; |
|
} |
$r->print(&courseinfo_form($dom,$formname,$crstype,$next)); |
$r->print(&courseinfo_form($dom,$formname,$crstype,$next)); |
} elsif ($state eq 'enrollment') { |
} elsif ($state eq 'enrollment') { |
if ($crstype eq 'official') { |
if ($crstype eq 'official') { |
Line 1464 sub print_review {
|
Line 1472 sub print_review {
|
$inst_values .= '<td>'.$courseenv{'description'}.' '; |
$inst_values .= '<td>'.$courseenv{'description'}.' '; |
my $cloneinst = $courseenv{'internal.coursecode'}; |
my $cloneinst = $courseenv{'internal.coursecode'}; |
if ($cloneinst ne '') { |
if ($cloneinst ne '') { |
$inst_values .= &mt('([_1] in [_2])',$cloneinst,$env{'form.clonedom'}); |
$inst_values .= $cloneinst.' '.&mt('in').' '.$env{'form.clonedom'}; |
} else { |
} else { |
$inst_values .= &mt('(from [_1])',$env{'form.clonedom'}); |
$inst_values .= &mt('from').' '.$env{'form.clonedom'}; |
} |
} |
$inst_values .= '</td><td>'; |
$inst_values .= '</td><td>'; |
if ($env{'form.datemode'} eq 'preserve') { |
if ($env{'form.datemode'} eq 'preserve') { |
Line 1749 sub coursecode_form {
|
Line 1757 sub coursecode_form {
|
|
|
sub get_course_dom { |
sub get_course_dom { |
my $codedom = &Apache::lonnet::default_login_domain(); |
my $codedom = &Apache::lonnet::default_login_domain(); |
|
if ($env{'form.showdom'} ne '') { |
|
if (&Apache::lonnet::domain($env{'form.showdom'}) ne '') { |
|
return $env{'form.showdom'}; |
|
} |
|
} |
if (($env{'user.domain'} ne '') && ($env{'user.domain'} ne 'public')) { |
if (($env{'user.domain'} ne '') && ($env{'user.domain'} ne 'public')) { |
|
my ($types,$typename) = &course_types(); |
|
if (ref($types) eq 'ARRAY') { |
|
foreach my $type (@{$types}) { |
|
if (&Apache::lonnet::usertools_access($env{'user.name'}, |
|
$env{'user.domain'},$type, |
|
undef,'requestcourses')) { |
|
return $env{'user.domain'}; |
|
} |
|
} |
|
my @possible_doms; |
|
foreach my $type (@{$types}) { |
|
my $dom_str = $env{'environment.reqcrsotherdom.'.$type}; |
|
if ($dom_str ne '') { |
|
my @domains = split(',',$dom_str); |
|
foreach my $entry (@domains) { |
|
my ($extdom,$extopt) = split(':',$entry); |
|
if ($extdom eq $env{'request.role.domain'}) { |
|
return $extdom; |
|
} |
|
unless(grep(/^\Q$extdom\E$/,@possible_doms)) { |
|
push(@possible_doms,$extdom); |
|
} |
|
} |
|
} |
|
} |
|
if (@possible_doms) { |
|
@possible_doms = sort(@possible_doms); |
|
return $possible_doms[0]; |
|
} |
|
} |
$codedom = $env{'user.domain'}; |
$codedom = $env{'user.domain'}; |
if ($env{'request.role.domain'} ne '') { |
if ($env{'request.role.domain'} ne '') { |
$codedom = $env{'request.role.domain'}; |
$codedom = $env{'request.role.domain'}; |
} |
} |
} |
} |
if ($env{'form.showdom'} ne '') { |
|
if (&Apache::lonnet::domain($env{'form.showdom'}) ne '') { |
|
$codedom = $env{'form.showdom'}; |
|
} |
|
} |
|
return $codedom; |
return $codedom; |
} |
} |
|
|
Line 1808 sub print_request_outcome {
|
Line 1846 sub print_request_outcome {
|
} |
} |
$now = time; |
$now = time; |
$crstype = $env{'form.crstype'}; |
$crstype = $env{'form.crstype'}; |
|
my @instsections; |
if ($crstype eq 'official') { |
if ($crstype eq 'official') { |
if (&Apache::lonnet::auto_run('',$dom)) { |
if (&Apache::lonnet::auto_run('',$dom)) { |
($enrollstart,$enrollend)=&dates_from_form('enrollstart','enrollend'); |
($enrollstart,$enrollend)=&dates_from_form('enrollstart','enrollend'); |
Line 1815 sub print_request_outcome {
|
Line 1854 sub print_request_outcome {
|
for (my $i=0; $i<$env{'form.sectotal'}; $i++) { |
for (my $i=0; $i<$env{'form.sectotal'}; $i++) { |
if ($env{'form.sec_'.$i}) { |
if ($env{'form.sec_'.$i}) { |
if ($env{'form.secnum_'.$i} ne '') { |
if ($env{'form.secnum_'.$i} ne '') { |
$sections{$i}{'inst'} = $env{'form.secnum_'.$i}; |
my $sec = $env{'form.secnum_'.$i}; |
|
$sections{$i}{'inst'} = $sec; |
|
if (($sec ne '') && (!grep(/^\Q$sec\E$/,@instsections))) { |
|
push(@instsections,$sec); |
|
} |
$sections{$i}{'loncapa'} = $env{'form.loncapasec_'.$i}; |
$sections{$i}{'loncapa'} = $env{'form.loncapasec_'.$i}; |
} |
} |
} |
} |
Line 1830 sub print_request_outcome {
|
Line 1873 sub print_request_outcome {
|
} |
} |
} |
} |
} |
} |
$xlistinfo .= $env{'form.crosslist_'.$i.'_instsec'}; |
$crosslistings{$i}{'instcode'} = $xlistinfo; |
$crosslistings{$i}{'inst'} = $xlistinfo; |
$crosslistings{$i}{'instsec'} = $env{'form.crosslist_'.$i.'_instsec'}; |
$crosslistings{$i}{'loncapa'} = $env{'form.crosslist_'.$i.'_lcsec'}; |
$crosslistings{$i}{'loncapa'} = $env{'form.crosslist_'.$i.'_lcsec'}; |
} |
} |
} |
} |
Line 1957 sub print_request_outcome {
|
Line 2000 sub print_request_outcome {
|
my $val = &get_processtype($dom,$crstype,\@inststatuses,\%domconfig); |
my $val = &get_processtype($dom,$crstype,\@inststatuses,\%domconfig); |
if ($val eq '') { |
if ($val eq '') { |
if ($crstype eq 'official') { |
if ($crstype eq 'official') { |
$output = &mt('You are not permitted to request creation of official courses'); |
$output = &mt('You are not permitted to request creation of official courses.'); |
} elsif ($crstype eq 'unofficial') { |
} elsif ($crstype eq 'unofficial') { |
$output = &mt('You are not permitted to request creation of unofficial courses'); |
$output = &mt('You are not permitted to request creation of unofficial courses.'); |
} elsif ($crstype eq 'community') { |
} elsif ($crstype eq 'community') { |
$output = &mt('You are not permitted to request creation of communities'); |
$output = &mt('You are not permitted to request creation of communities'); |
} else { |
} else { |
Line 1973 sub print_request_outcome {
|
Line 2016 sub print_request_outcome {
|
details => $details, |
details => $details, |
); |
); |
my $requestkey = $dom.'_'.$cnum; |
my $requestkey = $dom.'_'.$cnum; |
|
my $validationerror; |
if ($val eq 'autolimit=') { |
if ($val eq 'autolimit=') { |
$disposition = 'process'; |
$disposition = 'process'; |
} elsif ($val =~ /^autolimit=(\d+)$/) { |
} elsif ($val =~ /^autolimit=(\d+)$/) { |
Line 1980 sub print_request_outcome {
|
Line 2024 sub print_request_outcome {
|
$disposition = &check_autolimit($env{'user.name'},$env{'user.domain'}, |
$disposition = &check_autolimit($env{'user.name'},$env{'user.domain'}, |
$dom,$crstype,$limit,\$message); |
$dom,$crstype,$limit,\$message); |
} elsif ($val eq 'validate') { |
} elsif ($val eq 'validate') { |
$disposition = |
my ($inststatuslist,$validationchk,$validation); |
&Apache::lonnet::auto_courserequest_validation($dom,$details, |
if (@inststatuses > 0) { |
\@inststatuses,\$message); |
$inststatuslist = join(',',@inststatuses); |
|
} |
|
my $instseclist; |
|
if (@instsections > 0) { |
|
$instseclist = join(',',@instsections); |
|
} |
|
$validationchk = |
|
&Apache::lonnet::auto_courserequest_validation($dom, |
|
$env{'user.name'}.':'.$env{'user.domain'},$crstype, |
|
$inststatuslist,$instcode,$instseclist); |
|
if ($validationchk =~ /:/) { |
|
($validation,$message) = split(':',$validationchk); |
|
} else { |
|
$validation = $validationchk; |
|
} |
|
if ($validation =~ /^error(.*)$/) { |
|
$disposition = 'approval'; |
|
$validationerror = $1; |
|
} else { |
|
$disposition = $validation; |
|
} |
} else { |
} else { |
$disposition = 'approval'; |
$disposition = 'approval'; |
} |
} |
Line 2035 sub print_request_outcome {
|
Line 2099 sub print_request_outcome {
|
my $statuskey = 'status:'.$dom.':'.$cnum; |
my $statuskey = 'status:'.$dom.':'.$cnum; |
my %userreqhash = &Apache::lonnet::get('courserequests',[$statuskey], |
my %userreqhash = &Apache::lonnet::get('courserequests',[$statuskey], |
$env{'user.domain'},$env{'user.name'}); |
$env{'user.domain'},$env{'user.name'}); |
if (exists($userreqhash{$statuskey})) { |
if ($userreqhash{$statuskey} ne '') { |
$modified = 1; |
$modified = 1; |
my %queuehash = &Apache::lonnet::get_dom('courserequestqueue', |
my %queuehash = &Apache::lonnet::get_dom('courserequestqueue', |
[$cnum.'_approval', |
[$cnum.'_approval', |
$cnum.'_pending'],$dom); |
$cnum.'_pending'],$dom); |
if ((exists($queuehash{$cnum.'_approval'})) || |
if (($queuehash{$cnum.'_approval'} ne '') || |
(exists($queuehash{$cnum.'_pending'}))) { |
($queuehash{$cnum.'_pending'} ne '')) { |
$queued = 1; |
$queued = 1; |
} |
} |
} |
} |
Line 2084 sub print_request_outcome {
|
Line 2148 sub print_request_outcome {
|
$output .= '<p>'.&mt('Your course request has been updated').'</p>'. |
$output .= '<p>'.&mt('Your course request has been updated').'</p>'. |
¬ification_information($disposition,$req_notifylist,$cnum,$now); |
¬ification_information($disposition,$req_notifylist,$cnum,$now); |
} |
} |
|
if ($validationerror ne '') { |
|
$output .= '<span class="LC_warning">'.&mt('An error occurred validating your request with institutional data sources: [_1].',$validationerror).'</p>'; |
|
} |
} |
} |
return $output; |
return $output; |
} |
} |
Line 2111 sub notification_information {
|
Line 2178 sub notification_information {
|
my $sender = $env{'user.name'}.':'.$env{'user.domain'}; |
my $sender = $env{'user.name'}.':'.$env{'user.domain'}; |
&Apache::loncoursequeueadmin::send_selfserve_notification($req_notifylist,"$fullname ($env{'user.name'}:$env{'user.domain'})",$cnum,$env{'form.cdescr'},$now,'coursereq',$sender); |
&Apache::loncoursequeueadmin::send_selfserve_notification($req_notifylist,"$fullname ($env{'user.name'}:$env{'user.domain'})",$cnum,$env{'form.cdescr'},$now,'coursereq',$sender); |
} |
} |
} else { |
} elsif ($disposition eq 'pending') { |
$output .= '<div class="LC_info">'. |
$output .= '<div class="LC_info">'. |
&mt('Your request has been placed in a queue pending administrative action.').'<br />'. |
&mt('Your request has been placed in a queue pending administrative action.').'<br />'. |
&mt("Usually this means that your institution's information systems do not list you among the instructional personnel for this course.").'<br />'. |
&mt("Usually this means that your institution's information systems do not list you among the instructional personnel for this course.").'<br />'. |
&mt('The list of instructional personnel for the course will be automatically checked daily, and once you are listed the request will be processed.'). |
&mt('The list of instructional personnel for the course will be automatically checked daily, and once you are listed the request will be processed.'). |
'</div>'; |
'</div>'; |
|
} else { |
|
$output .= '<div class="LC_warning">'. |
|
&mt('Your request status is: [_1].',$disposition). |
|
'</div>' |
} |
} |
return $output; |
return $output; |
} |
} |
Line 2125 sub get_processtype {
|
Line 2196 sub get_processtype {
|
my ($dom,$crstype,$inststatuses,$domconfig) = @_; |
my ($dom,$crstype,$inststatuses,$domconfig) = @_; |
return unless ((ref($inststatuses) eq 'ARRAY') && (ref($domconfig) eq 'HASH')); |
return unless ((ref($inststatuses) eq 'ARRAY') && (ref($domconfig) eq 'HASH')); |
my (%userenv,%settings,$val); |
my (%userenv,%settings,$val); |
my @options = ('autolimit','validate','approve'); |
my @options = ('autolimit','validate','approval'); |
if ($dom eq $env{'user.domain'}) { |
if ($dom eq $env{'user.domain'}) { |
%userenv = |
%userenv = |
&Apache::lonnet::userenvironment($env{'user.domain'},$env{'user.name'}, |
&Apache::lonnet::userenvironment($env{'user.domain'},$env{'user.name'}, |
Line 2138 sub get_processtype {
|
Line 2209 sub get_processtype {
|
if (ref($domconfig->{'requestcourses'}) eq 'HASH') { |
if (ref($domconfig->{'requestcourses'}) eq 'HASH') { |
%settings = %{$domconfig->{'requestcourses'}}; |
%settings = %{$domconfig->{'requestcourses'}}; |
if (ref($settings{$crstype}) eq 'HASH') { |
if (ref($settings{$crstype}) eq 'HASH') { |
if (($env{'user.adv'}) && (exists($settings{$crstype}{'_LC_adv'}))) { |
if (($env{'user.adv'}) && ($settings{$crstype}{'_LC_adv'} ne '')) { |
$val = $settings{$crstype}{'_LC_adv'}; |
$val = $settings{$crstype}{'_LC_adv'}; |
@{$inststatuses} = ('_LC_adv_'); |
@{$inststatuses} = ('_LC_adv_'); |
} else { |
} else { |
Line 2191 sub get_processtype {
|
Line 2262 sub get_processtype {
|
} else { |
} else { |
%userenv = &Apache::lonnet::userenvironment($env{'user.domain'}, |
%userenv = &Apache::lonnet::userenvironment($env{'user.domain'}, |
$env{'user.name'},'reqcrsotherdom.'.$env{'form.crstype'}); |
$env{'user.name'},'reqcrsotherdom.'.$env{'form.crstype'}); |
if ($userenv{'reqcrsotherdom'}) { |
if ($userenv{'reqcrsotherdom.'.$crstype}) { |
my @doms = split(',',$userenv{'reqcrsotherdom'}); |
my @doms = split(',',$userenv{'reqcrsotherdom.'.$crstype}); |
my $optregex = join('|',@options); |
my $optregex = join('|',@options); |
if (grep(/^\Q$dom\E:($optregex=?\d*)/,@doms)) { |
foreach my $item (@doms) { |
$val = $1; |
my ($extdom,$extopt) = split(':',$item); |
|
if ($extdom eq $dom) { |
|
if ($extopt =~ /^($optregex)(=?\d*)$/) { |
|
$val = $1.$2; |
|
} |
|
last; |
|
} |
} |
} |
@{$inststatuses} = ('_external_'); |
@{$inststatuses} = ('_external_'); |
} |
} |
Line 2291 sub retrieve_settings {
|
Line 2368 sub retrieve_settings {
|
my %crscode = ( |
my %crscode = ( |
$i => $reqinfo{'crosslistings'}{$i}{'instcode'}, |
$i => $reqinfo{'crosslistings'}{$i}{'instcode'}, |
); |
); |
&extract_instcode($dom,'crosslist',\%crscode,$1,$xlistsec); |
&extract_instcode($dom,'crosslist',\%crscode,$i,$xlistsec); |
} |
} |
} |
} |
} |
} |
Line 2317 sub retrieve_settings {
|
Line 2394 sub retrieve_settings {
|
if (grep(/^\Q$sec\E/,@currsec)) { |
if (grep(/^\Q$sec\E/,@currsec)) { |
$env{'form.person_'.$i.'_sec'} = $sec; |
$env{'form.person_'.$i.'_sec'} = $sec; |
} else { |
} else { |
push (@newsecs,$sec); |
push(@newsecs,$sec); |
} |
} |
} |
} |
} |
} |