--- loncom/interface/lonrequestcourse.pm 2009/08/19 20:12:04 1.18 +++ loncom/interface/lonrequestcourse.pm 2009/08/22 21:08:39 1.23 @@ -1,7 +1,7 @@ # The LearningOnline Network # Request a course # -# $Id: lonrequestcourse.pm,v 1.18 2009/08/19 20:12:04 raeburn Exp $ +# $Id: lonrequestcourse.pm,v 1.23 2009/08/22 21:08:39 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -116,13 +116,11 @@ use LONCAPA qw(:DEFAULT :match); sub handler { my ($r) = @_; + &Apache::loncommon::content_type($r,'text/html'); + $r->send_http_header; if ($r->header_only) { - &Apache::loncommon::content_type($r,'text/html'); - $r->send_http_header; return OK; } - &Apache::loncommon::content_type($r,'text/html'); - $r->send_http_header; &Apache::lonhtmlcommon::clear_breadcrumbs(); my $dom = &get_course_dom(); @@ -159,9 +157,10 @@ sub handler { $states{'view'} = ['pick_request','details','cancel','removal']; $states{'log'} = ['filter','display']; $states{'new'} = ['courseinfo','enrollment','personnel','review','process']; + if (($action eq 'new') && ($env{'form.crstype'} eq 'official')) { unless ($env{'form.state'} eq 'crstype') { - unshift (@{$states{'new'}},'codepick'); + unshift(@{$states{'new'}},'codepick'); } } @@ -429,6 +428,8 @@ sub check_can_request { my ($dom,$can_request) = @_; my $canreq = 0; my ($types,$typename) = &course_types(); + my @options = ('approval','validate','autolimit'); + my $optregex = join('|',@options); if ((ref($can_request) eq 'HASH') && (ref($types) eq 'ARRAY')) { foreach my $type (@{$types}) { if (&Apache::lonnet::usertools_access($env{'user.name'}, @@ -444,7 +445,7 @@ sub check_can_request { if (@curr > 0) { $canreq ++; unless ($dom eq $env{'user.domain'}) { - if (grep(/^\Q$dom\E$/,@curr)) { + if (grep(/^\Q$dom\E:($optregex)(=?\d*)$/,@curr)) { $can_request->{$type} = 1; } } @@ -791,7 +792,7 @@ sub print_request_form { $message = '
'. &mt('No course was found matching your choice of institutional course category.'); } - unless ($code_chk eq 'ok') { + unless ($code_chk eq 'valid') { $prev = 'crstype'; } $r->print($message); @@ -809,12 +810,19 @@ sub print_request_form { $r->print('
'.&Apache::lonhtmlcommon::start_pick_box().$codepicker. &Apache::lonhtmlcommon::end_pick_box().'
'); } else { + $next = $states->{$action}[$page+2]; $r->print(&courseinfo_form($dom,$formname,$crstype,$next)); } } else { + if ($crstype eq 'official') { + $next = $states->{$action}[$page+2]; + } $r->print(&courseinfo_form($dom,$formname,$crstype,$next)); } } elsif ($prev eq 'codepick') { + if ($env{'form.instcode'} eq '') { + $prev = $states->{$action}[$page-2]; + } $r->print(&courseinfo_form($dom,$formname,$crstype,$next)); } elsif ($state eq 'enrollment') { if ($crstype eq 'official') { @@ -1749,17 +1757,47 @@ sub coursecode_form { sub get_course_dom { 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')) { + 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'}; if ($env{'request.role.domain'} ne '') { $codedom = $env{'request.role.domain'}; } } - if ($env{'form.showdom'} ne '') { - if (&Apache::lonnet::domain($env{'form.showdom'}) ne '') { - $codedom = $env{'form.showdom'}; - } - } return $codedom; } @@ -1835,8 +1873,8 @@ sub print_request_outcome { } } } - $xlistinfo .= $env{'form.crosslist_'.$i.'_instsec'}; - $crosslistings{$i}{'inst'} = $xlistinfo; + $crosslistings{$i}{'instcode'} = $xlistinfo; + $crosslistings{$i}{'instsec'} = $env{'form.crosslist_'.$i.'_instsec'}; $crosslistings{$i}{'loncapa'} = $env{'form.crosslist_'.$i.'_lcsec'}; } } @@ -1962,9 +2000,9 @@ sub print_request_outcome { my $val = &get_processtype($dom,$crstype,\@inststatuses,\%domconfig); if ($val eq '') { 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') { - $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') { $output = &mt('You are not permitted to request creation of communities'); } else { @@ -1986,7 +2024,7 @@ sub print_request_outcome { $disposition = &check_autolimit($env{'user.name'},$env{'user.domain'}, $dom,$crstype,$limit,\$message); } elsif ($val eq 'validate') { - my $inststatuslist; + my ($inststatuslist,$validationchk,$validation); if (@inststatuses > 0) { $inststatuslist = join(',',@inststatuses); } @@ -1994,23 +2032,20 @@ sub print_request_outcome { if (@instsections > 0) { $instseclist = join(',',@instsections); } - my $validation = - &Apache::lonnet::auto_validate_instcode('',$dom,$instcode, - $env{'user.name'}.':'.$env{'user.domain'},$inststatuslist, - $instseclist); - if ($validation eq 'valid') { - $disposition = 'process'; - } elsif ($validation eq 'rejected') { - $disposition = 'rejected'; - } elsif ($validation eq 'pending') { - $disposition = 'pending'; - } elsif ($disposition eq 'approval') { - $disposition = 'approval'; - } elsif ($disposition =~ /^error(.*)$/) { + $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 = 'approval'; + $disposition = $validation; } } else { $disposition = 'approval'; @@ -2114,7 +2149,7 @@ sub print_request_outcome { ¬ification_information($disposition,$req_notifylist,$cnum,$now); } if ($validationerror ne '') { - $output .= ''.&mt('An error occurred validating your request with institutional data sources: {_1].',$validationerror).'

'; + $output .= ''.&mt('An error occurred validating your request with institutional data sources: [_1].',$validationerror).'

'; } } return $output; @@ -2161,7 +2196,7 @@ sub get_processtype { my ($dom,$crstype,$inststatuses,$domconfig) = @_; return unless ((ref($inststatuses) eq 'ARRAY') && (ref($domconfig) eq 'HASH')); my (%userenv,%settings,$val); - my @options = ('autolimit','validate','approve'); + my @options = ('autolimit','validate','approval'); if ($dom eq $env{'user.domain'}) { %userenv = &Apache::lonnet::userenvironment($env{'user.domain'},$env{'user.name'}, @@ -2174,7 +2209,7 @@ sub get_processtype { if (ref($domconfig->{'requestcourses'}) eq 'HASH') { %settings = %{$domconfig->{'requestcourses'}}; 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'}; @{$inststatuses} = ('_LC_adv_'); } else { @@ -2227,11 +2262,17 @@ sub get_processtype { } else { %userenv = &Apache::lonnet::userenvironment($env{'user.domain'}, $env{'user.name'},'reqcrsotherdom.'.$env{'form.crstype'}); - if ($userenv{'reqcrsotherdom'}) { - my @doms = split(',',$userenv{'reqcrsotherdom'}); - my $optregex = join('|',@options); - if (grep(/^\Q$dom\E:($optregex=?\d*)/,@doms)) { - $val = $1; + if ($userenv{'reqcrsotherdom.'.$crstype}) { + my @doms = split(',',$userenv{'reqcrsotherdom.'.$crstype}); + my $optregex = join('|',@options); + foreach my $item (@doms) { + my ($extdom,$extopt) = split(':',$item); + if ($extdom eq $dom) { + if ($extopt =~ /^($optregex)(=?\d*)$/) { + $val = $1.$2; + } + last; + } } @{$inststatuses} = ('_external_'); } @@ -2327,7 +2368,7 @@ sub retrieve_settings { my %crscode = ( $i => $reqinfo{'crosslistings'}{$i}{'instcode'}, ); - &extract_instcode($dom,'crosslist',\%crscode,$1,$xlistsec); + &extract_instcode($dom,'crosslist',\%crscode,$i,$xlistsec); } } } @@ -2353,7 +2394,7 @@ sub retrieve_settings { if (grep(/^\Q$sec\E/,@currsec)) { $env{'form.person_'.$i.'_sec'} = $sec; } else { - push (@newsecs,$sec); + push(@newsecs,$sec); } } }