--- loncom/interface/lonrequestcourse.pm 2009/08/18 20:06:51 1.17
+++ 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.17 2009/08/18 20:06:51 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') {
@@ -1464,9 +1472,9 @@ sub print_review {
$inst_values .= '
'.$courseenv{'description'}.' ';
my $cloneinst = $courseenv{'internal.coursecode'};
if ($cloneinst ne '') {
- $inst_values .= &mt('([_1] in [_2])',$cloneinst,$env{'form.clonedom'});
+ $inst_values .= $cloneinst.' '.&mt('in').' '.$env{'form.clonedom'};
} else {
- $inst_values .= &mt('(from [_1])',$env{'form.clonedom'});
+ $inst_values .= &mt('from').' '.$env{'form.clonedom'};
}
$inst_values .= ' | ';
if ($env{'form.datemode'} eq 'preserve') {
@@ -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);
}
}
}
|