--- loncom/interface/lonrequestcourse.pm 2009/09/06 19:09:54 1.29 +++ loncom/interface/lonrequestcourse.pm 2009/09/07 06:30:49 1.30 @@ -1,7 +1,7 @@ # The LearningOnline Network # Request a course # -# $Id: lonrequestcourse.pm,v 1.29 2009/09/06 19:09:54 raeburn Exp $ +# $Id: lonrequestcourse.pm,v 1.30 2009/09/07 06:30:49 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -122,6 +122,7 @@ use Apache::lonnet; use Apache::loncommon; use Apache::lonlocal; use Apache::loncoursequeueadmin; +use Apache::lonuserutils; use LONCAPA qw(:DEFAULT :match); sub handler { @@ -262,7 +263,11 @@ sub handler { if (($state eq 'courseinfo') && ($env{'form.clonedom'} eq '')) { $env{'form.clonedom'} = $dom; } - $jscript = &Apache::lonhtmlcommon::set_form_elements($elementsref,\%stored); + if ($state eq 'crstype') { + $jscript = &mainmenu_javascript(); + } else { + $jscript = &Apache::lonhtmlcommon::set_form_elements($elementsref,\%stored); + } } if ($state eq 'personnel') { @@ -291,7 +296,7 @@ sub handler { } } elsif ($action eq 'view') { if ($state eq 'crstype') { - &print_main_menu($r,\%can_request,\%states,$dom,$jscript,'',$crumb); + &print_main_menu($r,\%can_request,\%states,$dom,$jscript,$loaditems,$crumb); } else { &request_administration($r,$action,$state,$page,\%states,$dom,$jscript, $loaditems,$crumb); @@ -315,6 +320,30 @@ sub handler { return OK; } +sub mainmenu_javascript { + return <<"END"; +function setType(courseForm) { + for (var i=0; i'; if ($state eq 'pick_request') { $r->print('

'.&mt('Pending course requests').'

'."\n".$form."\n". - &print_request_status($dom).''); + &print_request_status($dom).'
'); } elsif ($state eq 'details') { my (@codetitles,%cat_titles,%cat_order,@code_order,$instcode,$code_chk); my $origcnum = $env{'form.cnum'}; @@ -934,7 +967,8 @@ sub print_request_form { ); $crstype = $env{'form.crstype'}; $r->print('
'); - my (@codetitles,%cat_titles,%cat_order,@code_order,$instcode,$code_chk); + my (@codetitles,%cat_titles,%cat_order,@code_order,$instcode,$code_chk, + @disallowed); if ($crstype eq 'official') { if ($env{'form.instcode'} ne '') { $instcode = $env{'form.instcode'}; @@ -997,6 +1031,79 @@ sub print_request_form { } elsif ($state eq 'personnel') { $r->print(&print_personnel_menu($dom,$formname,$crstype,$invalidcrosslist)); } elsif ($state eq 'review') { + my (%alerts,%rulematch,%inst_results,%curr_rules,%got_rules,%disallowmsg); + my $now = time; + for (my $i=0; $i<$env{'form.persontotal'}; $i++) { + my $personname = $env{'form.person_'.$i.'_uname'}; + my $persondom = $env{'form.person_'.$i.'_dom'}; + if (($personname =~ /^$match_username$/) && + ($persondom =~ /^$match_domain$/)) { + if (&Apache::lonnet::domain($persondom)) { + my $personhome = + &Apache::lonnet::homeserver($personname,$persondom); + if ($personhome eq 'no_host') { + if ($persondom ne $dom) { + my $skipuser = 1; + if ($env{'user.role.dc./'.$persondom.'/'}) { + my ($start,$end) = split('.',$env{'user.role.dc./'.$persondom.'/'}); + if (((!$start) || ($start < $now)) && + ((!$end) || ($end > $now))) { + $skipuser = 0; + } + } + if ($skipuser) { + push(@disallowed,$i); + $disallowmsg{$i} = &mt('[_1] was excluded because new users need be from the course domain',''.$personname.':'.$persondom.''); + next; + } + } + if (&get_cancreate_status($persondom,$personname,$dom)) { + my ($allowed,$msg) = + &check_newuser_rules($persondom,$personname, + \%alerts,\%rulematch,\%inst_results, + \%curr_rules,\%got_rules); + if ($allowed) { + if (ref($inst_results{$personname.':'.$persondom}) eq 'HASH') { + if ($inst_results{$personname.':'.$persondom}{'lastname'} ne '') { + $env{'form.person_'.$i.'_lastname'} = $inst_results{$personname.':'.$persondom}{'lastname'}; + } + if ($inst_results{$personname.':'.$persondom}{'firstname'} ne '') { + $env{'form.person_'.$i.'_firstname'} = $inst_results{$personname.':'.$persondom}{'firstname'}; + } + if ($inst_results{$personname.':'.$persondom}{'permanentemail'} ne '') { + $env{'form.person_'.$i.'_emailaddr'} = $inst_results{$personname.':'.$persondom}{'permanentemail'}; + } + } + } else { + push(@disallowed,$i); + $disallowmsg{$i} = &mt('[_1] was excluded because the username violated format rules for the domain',''.$personname.':'.$persondom.''); + } + } else { + push(@disallowed,$i); + $disallowmsg{$i} = &mt('[_1] was excluded because you may not request new users in the domain',''.$personname.':'.$persondom.''); + } + } else { + my %userenv = + &Apache::lonnet::userenvironment($persondom,$personname,'lastname','firstname','permanentemail'); + if ($env{'form.person_'.$i.'_lastname'} eq '') { + $env{'form.person_'.$i.'_lastname'} = $userenv{'lastname'}; + } + if ($env{'form.person_'.$i.'_firstname'} eq '') { + $env{'form.person_'.$i.'_firstname'} = $userenv{'firstname'}; + } + if ($env{'form.person_'.$i.'_emailaddr'} eq '') { + $env{'form.person_'.$i.'_emailaddr'} = $userenv{'permanentemail'}; + } + } + } elsif ($personname ne '') { + push(@disallowed,$i); + $disallowmsg{$i} = &mt('[_1] was excluded because the domain is invalid',''.$personname.':'.$persondom.''); + } + } elsif ($personname ne '') { + push(@disallowed,$i); + $disallowmsg{$i} = &mt('[_1] was excluded because the username or domain is invalid.',''.$personname.':'.$persondom.''); + } + } my $cnum; if ($env{'form.origcnum'} =~ /^($match_courseid)$/) { $cnum = $env{'form.origcnum'}; @@ -1006,7 +1113,7 @@ sub print_request_form { &Apache::lonnet::auto_possible_instcodes($dom,\@codetitles,\%cat_titles, \%cat_order,\@code_order); $r->print('

'.&mt('Review course request details before submission').'

'. - &print_review($dom,\@codetitles,\%cat_titles,\%cat_order,\@code_order). + &print_review($dom,\@codetitles,\%cat_titles,\%cat_order,\@code_order,'','',\@disallowed,\%disallowmsg). ''); $navtxt{'next'} = &mt('Submit course request'); } elsif ($state eq 'process') { @@ -1031,6 +1138,32 @@ sub print_request_form { if ($state eq 'personnel') { push(@excluded,'persontotal'); } + if ($state eq 'review') { + if (@disallowed > 0) { + my @items = qw(uname dom lastname firstname emailaddr hidedom role newsec); + my @currsecs = ¤t_lc_sections(); + if (@currsecs) { + push(@items,'sec'); + } + my $count = 0; + for (my $i=0; $i<$env{'form.persontotal'}; $i++) { + unless ($env{'form.person_'.$i.'_uname'} eq '') { + if (grep(/^$i$/,@disallowed)) { + foreach my $item (@items) { + $env{'form.person_'.$i.'_'.$item} = ''; + } + } else { + foreach my $item (@items) { + $env{'form.person_'.$count.'_'.$item} = $env{'form.person_'.$i.'_'.$item}; + } + } + } + $count ++; + } + $env{'form.persontotal'} = $count; + + } + } if ($state eq 'enrollment') { push(@excluded,'crosslisttotal'); } @@ -1039,6 +1172,45 @@ sub print_request_form { return; } +sub get_cancreate_status { + my ($persondom,$personname,$dom) = @_; + my ($rules,$ruleorder) = + &Apache::lonnet::inst_userrules($persondom,'username'); + my $usertype = &Apache::lonuserutils::check_usertype($persondom,$personname, + $rules); + return &Apache::lonuserutils::can_create_user($dom,'requestcrs',$usertype); +} + +sub check_newuser_rules { + my ($persondom,$personname,$alerts,$rulematch,$inst_results,$curr_rules, + $got_rules) = @_; + my $allowed = 1; + my $newuser = 1; + my ($checkhash,$userchkmsg); + my $checks = { 'username' => 1 }; + $checkhash->{$personname.':'.$persondom} = { 'newuser' => $newuser }; + &Apache::loncommon::user_rule_check($checkhash,$checks,$alerts,$rulematch, + $inst_results,$curr_rules,$got_rules); + if (ref($alerts->{'username'}) eq 'HASH') { + if (ref($alerts->{'username'}{$persondom}) eq 'HASH') { + my $domdesc = + &Apache::lonnet::domain($persondom,'description'); + if ($alerts->{'username'}{$persondom}{$personname}) { + if (ref($curr_rules->{$persondom}) eq 'HASH') { + $userchkmsg = + &Apache::loncommon::instrule_disallow_msg('username', + $domdesc,1). + &Apache::loncommon::user_rule_formats($persondom, + $domdesc,$curr_rules->{$persondom}{'username'}, + 'username'); + } + $allowed = 0; + } + } + } + return ($allowed,$userchkmsg); +} + sub get_excluded_elements { my ($dom,$states,$action,$state) = @_; my @excluded = ('counter'); @@ -1272,17 +1444,7 @@ sub print_personnel_menu { } } - my @currsecs; - if ($env{'form.sectotal'}) { - for (my $i=0; $i<$env{'form.sectotal'}; $i++) { - if (defined($env{'form.loncapasec_'.$i})) { - my $lcsec = $env{'form.loncapasec_'.$i}; - unless (grep(/^\Q$lcsec\E$/,@currsecs)) { - push(@currsecs,$lcsec); - } - } - } - } + my @currsecs = ¤t_lc_sections(); my ($existtitle,$existops,$existmult,$newtitle,$seccolspan); if (@currsecs) { @@ -1360,6 +1522,21 @@ sub print_personnel_menu { return $output; } +sub current_lc_sections { + my @currsecs; + if ($env{'form.sectotal'}) { + for (my $i=0; $i<$env{'form.sectotal'}; $i++) { + if (defined($env{'form.loncapasec_'.$i})) { + my $lcsec = $env{'form.loncapasec_'.$i}; + unless (grep(/^\Q$lcsec\E$/,@currsecs)) { + push(@currsecs,$lcsec); + } + } + } + } + return @currsecs; +} + sub print_request_status { my ($dom) = @_; my %statusinfo = &Apache::lonnet::dump('courserequests',$env{'user.domain'}, @@ -1468,8 +1645,7 @@ sub print_request_status { $output .= '
'.&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; } @@ -1575,7 +1751,8 @@ sub print_request_logs { } sub print_review { - my ($dom,$codetitles,$cat_titles,$cat_order,$code_order,$uname,$udom) = @_; + my ($dom,$codetitles,$cat_titles,$cat_order,$code_order,$uname,$udom, + $disallowed,$disallowmsg) = @_; my ($types,$typename) = &course_types(); my ($owner,$ownername,$owneremail); if ($uname eq '' || $udom eq '') { @@ -1753,6 +1930,9 @@ sub print_review { ''.&mt('None').''; for (my $i=0; $i<$env{'form.persontotal'}; $i++) { if ($env{'form.person_'.$i.'_uname'} ne '') { + if (ref($disallowed) eq 'ARRAY') { + next if (grep(/^$i$/,@{$disallowed})); + } my @allsecs = &Apache::loncommon::get_env_multiple('form.person_'.$i.'_sec'); my $newsec = $env{'form.person_'.$i.'_newsec'}; $newsec =~ s/^\s+//; @@ -1787,8 +1967,20 @@ sub print_review { ''.$showsec.''; } } - my $output = - '
'.&Apache::lonhtmlcommon::start_pick_box(). + my $output; + if (ref($disallowed) eq 'ARRAY') { + if (@{$disallowed} > 0) { + if (ref($disallowmsg) eq 'HASH') { + $output = '

'. + &mt('Not all requested personnel could be included.').'

'; + } + } + } + $output .= '
'.&Apache::lonhtmlcommon::start_pick_box(). &Apache::lonhtmlcommon::row_title(&mt('Owner')). ''. ''.
'.&mt('Name').'