Diff for /loncom/interface/lonrequestcourse.pm between versions 1.29 and 1.30

version 1.29, 2009/09/06 19:09:54 version 1.30, 2009/09/07 06:30:49
Line 122  use Apache::lonnet; Line 122  use Apache::lonnet;
 use Apache::loncommon;  use Apache::loncommon;
 use Apache::lonlocal;  use Apache::lonlocal;
 use Apache::loncoursequeueadmin;  use Apache::loncoursequeueadmin;
   use Apache::lonuserutils;
 use LONCAPA qw(:DEFAULT :match);  use LONCAPA qw(:DEFAULT :match);
   
 sub handler {  sub handler {
Line 262  sub handler { Line 263  sub handler {
         if (($state eq 'courseinfo') && ($env{'form.clonedom'} eq '')) {          if (($state eq 'courseinfo') && ($env{'form.clonedom'} eq '')) {
             $env{'form.clonedom'} = $dom;              $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') {      if ($state eq 'personnel') {
Line 291  sub handler { Line 296  sub handler {
         }          }
     } elsif ($action eq 'view') {      } elsif ($action eq 'view') {
         if ($state eq 'crstype') {          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 {          } else {
             &request_administration($r,$action,$state,$page,\%states,$dom,$jscript,              &request_administration($r,$action,$state,$page,\%states,$dom,$jscript,
                                     $loaditems,$crumb);                                      $loaditems,$crumb);
Line 315  sub handler { Line 320  sub handler {
     return OK;      return OK;
 }  }
   
   sub mainmenu_javascript {
       return <<"END";
   function setType(courseForm) {
       for (var i=0; i<courseForm.crstype.length; i++) {
           if (courseForm.crstype.options[i].value == "$env{'form.crstype'}") {
               courseForm.crstype.options[i].selected = true;
           } else {
               courseForm.crstype.options[i].selected = false;
           }
       }
   }
   
   function setAction(courseForm) {
       for (var i=0; i<courseForm.action.length; i++) {
           if (courseForm.action.options[i].value == "$env{'form.action'}") {
               courseForm.action.options[i].selected = true;
           } else {
               courseForm.action.options[i].selected = false;
           }
       }
   }
   END
   }
   
 sub get_breadcrumbs {  sub get_breadcrumbs {
     my ($dom,$action,$state,$states,$trail) = @_;      my ($dom,$action,$state,$states,$trail) = @_;
     my ($crumb,$newinstcode,$codechk,$checkedcode,$numtitles);      my ($crumb,$newinstcode,$codechk,$checkedcode,$numtitles);
Line 555  sub onload_action { Line 584  sub onload_action {
     my ($action,$state) = @_;      my ($action,$state) = @_;
     my %loaditems;      my %loaditems;
     if (($action eq 'new') || ($action eq 'view')) {      if (($action eq 'new') || ($action eq 'view')) {
         $loaditems{'onload'} = 'javascript:setFormElements(document.requestcrs)';          if ($state eq 'crstype') {
               $loaditems{'onload'} = 'javascript:setAction(document.mainmenu_action);javascript:setType(document.mainmenu_coursetype)';
           } else {
               $loaditems{'onload'} = 'javascript:setFormElements(document.requestcrs)';
           }
     }      }
     return \%loaditems;      return \%loaditems;
 }  }
Line 792  END Line 825  END
         my $form = '<form method="post" name="'.$formname.'" action="/adm/requestcourse" />';          my $form = '<form method="post" name="'.$formname.'" action="/adm/requestcourse" />';
         if ($state eq 'pick_request') {          if ($state eq 'pick_request') {
             $r->print('<h3>'.&mt('Pending course requests').'</h3><div>'."\n".$form."\n".              $r->print('<h3>'.&mt('Pending course requests').'</h3><div>'."\n".$form."\n".
                       &print_request_status($dom).'</form>');                        &print_request_status($dom).'</form></div>');
         } elsif ($state eq 'details') {          } elsif ($state eq 'details') {
             my (@codetitles,%cat_titles,%cat_order,@code_order,$instcode,$code_chk);              my (@codetitles,%cat_titles,%cat_order,@code_order,$instcode,$code_chk);
             my $origcnum = $env{'form.cnum'};              my $origcnum = $env{'form.cnum'};
Line 934  sub print_request_form { Line 967  sub print_request_form {
                                              );                                               );
     $crstype = $env{'form.crstype'};      $crstype = $env{'form.crstype'};
     $r->print('<form name="'.$formname.'" method="post" action="/adm/requestcourse">');      $r->print('<form name="'.$formname.'" method="post" action="/adm/requestcourse">');
     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 ($crstype eq 'official') {
         if ($env{'form.instcode'} ne '') {          if ($env{'form.instcode'} ne '') {
             $instcode = $env{'form.instcode'};              $instcode = $env{'form.instcode'};
Line 997  sub print_request_form { Line 1031  sub print_request_form {
     } elsif ($state eq 'personnel') {      } elsif ($state eq 'personnel') {
         $r->print(&print_personnel_menu($dom,$formname,$crstype,$invalidcrosslist));          $r->print(&print_personnel_menu($dom,$formname,$crstype,$invalidcrosslist));
     } elsif ($state eq 'review') {      } 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','<tt>'.$personname.':'.$persondom.'</tt>');
                                   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','<tt>'.$personname.':'.$persondom.'</tt>');  
                               }
                           } else {
                               push(@disallowed,$i);
                               $disallowmsg{$i} = &mt('[_1] was excluded because you may not request new users in the domain','<tt>'.$personname.':'.$persondom.'</tt>');
                           }
                       } 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','<tt>'.$personname.':'.$persondom.'</tt>');
                   }
               } elsif ($personname ne '') {
                   push(@disallowed,$i);
                   $disallowmsg{$i} = &mt('[_1] was excluded because the username or domain is invalid.','<tt>'.$personname.':'.$persondom.'</tt>');
               }
           }
         my $cnum;          my $cnum;
         if ($env{'form.origcnum'} =~ /^($match_courseid)$/) {          if ($env{'form.origcnum'} =~ /^($match_courseid)$/) {
             $cnum = $env{'form.origcnum'};              $cnum = $env{'form.origcnum'};
Line 1006  sub print_request_form { Line 1113  sub print_request_form {
         &Apache::lonnet::auto_possible_instcodes($dom,\@codetitles,\%cat_titles,          &Apache::lonnet::auto_possible_instcodes($dom,\@codetitles,\%cat_titles,
                                                  \%cat_order,\@code_order);                                                   \%cat_order,\@code_order);
         $r->print('<h3>'.&mt('Review course request details before submission').'</h3>'.          $r->print('<h3>'.&mt('Review course request details before submission').'</h3>'.
                   &print_review($dom,\@codetitles,\%cat_titles,\%cat_order,\@code_order).                    &print_review($dom,\@codetitles,\%cat_titles,\%cat_order,\@code_order,'','',\@disallowed,\%disallowmsg).
                   '<input type="hidden" name="cnum" value="'.$cnum.'" />');                    '<input type="hidden" name="cnum" value="'.$cnum.'" />');
         $navtxt{'next'} = &mt('Submit course request');          $navtxt{'next'} = &mt('Submit course request');
     }  elsif ($state eq 'process') {      }  elsif ($state eq 'process') {
Line 1031  sub print_request_form { Line 1138  sub print_request_form {
     if ($state eq 'personnel') {      if ($state eq 'personnel') {
         push(@excluded,'persontotal');          push(@excluded,'persontotal');
     }      }
       if ($state eq 'review') {
           if (@disallowed > 0) {
               my @items = qw(uname dom lastname firstname emailaddr hidedom role newsec);
               my @currsecs = &current_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') {      if ($state eq 'enrollment') {
         push(@excluded,'crosslisttotal');          push(@excluded,'crosslisttotal');
     }      }
Line 1039  sub print_request_form { Line 1172  sub print_request_form {
     return;      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 {  sub get_excluded_elements {
     my ($dom,$states,$action,$state) = @_;      my ($dom,$states,$action,$state) = @_;
     my @excluded = ('counter');      my @excluded = ('counter');
Line 1272  sub print_personnel_menu { Line 1444  sub print_personnel_menu {
         }          }
     }      }
   
     my @currsecs;      my @currsecs = &current_lc_sections();
     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 ($existtitle,$existops,$existmult,$newtitle,$seccolspan);      my ($existtitle,$existops,$existmult,$newtitle,$seccolspan);
     if (@currsecs) {      if (@currsecs) {
Line 1360  sub print_personnel_menu { Line 1522  sub print_personnel_menu {
     return $output;      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 {  sub print_request_status {
     my ($dom) = @_;      my ($dom) = @_;
     my %statusinfo = &Apache::lonnet::dump('courserequests',$env{'user.domain'},      my %statusinfo = &Apache::lonnet::dump('courserequests',$env{'user.domain'},
Line 1468  sub print_request_status { Line 1645  sub print_request_status {
         $output .= '<div>'.&mt('You have no matching course requests awaiting approval by a Domain Coordinator or held in a queue pending administrative action at your institution.').'</div>';          $output .= '<div>'.&mt('You have no matching course requests awaiting approval by a Domain Coordinator or held in a queue pending administrative action at your institution.').'</div>';
     }      }
     $output .= '      $output .= '
 <br /><input type="button" name="prev" value="'.&mt('Back').'" onclick="javascript:backPage(document.'.$formname.",'crstype'".')" />  <br /><input type="button" name="prev" value="'.&mt('Back').'" onclick="javascript:backPage(document.'.$formname.",'crstype'".')" />';
 </form></div>';  
     return $output;      return $output;
 }  }
   
Line 1575  sub print_request_logs { Line 1751  sub print_request_logs {
 }  }
   
 sub print_review {  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 ($types,$typename) = &course_types();
     my ($owner,$ownername,$owneremail);      my ($owner,$ownername,$owneremail);
     if ($uname eq '' || $udom eq '') {      if ($uname eq '' || $udom eq '') {
Line 1753  sub print_review { Line 1930  sub print_review {
                          '<td>'.&mt('None').'</td></tr>';                           '<td>'.&mt('None').'</td></tr>';
     for (my $i=0; $i<$env{'form.persontotal'}; $i++) {      for (my $i=0; $i<$env{'form.persontotal'}; $i++) {
         if ($env{'form.person_'.$i.'_uname'} ne '') {          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 @allsecs = &Apache::loncommon::get_env_multiple('form.person_'.$i.'_sec');
             my $newsec = $env{'form.person_'.$i.'_newsec'};              my $newsec = $env{'form.person_'.$i.'_newsec'};
             $newsec =~ s/^\s+//;              $newsec =~ s/^\s+//;
Line 1787  sub print_review { Line 1967  sub print_review {
                 '<td>'.$showsec.'</td></tr>';                  '<td>'.$showsec.'</td></tr>';
         }          }
     }      }
     my $output =        my $output;
                   '<div>'.&Apache::lonhtmlcommon::start_pick_box().      if (ref($disallowed) eq 'ARRAY') {
           if (@{$disallowed} > 0) {
               if (ref($disallowmsg) eq 'HASH') {
                   $output = '<p class="LC_warning">'.
                             &mt('Not all requested personnel could be included.').'<ul>'; 
                   foreach my $item (@{$disallowed}) {
                       $output .= '<li>'.$disallowmsg->{$item}.'</li>';
                   }
                   $output .= '</ul></p>';
               }
           }
       }
       $output .=    '<div>'.&Apache::lonhtmlcommon::start_pick_box().
                   &Apache::lonhtmlcommon::row_title(&mt('Owner')).                    &Apache::lonhtmlcommon::row_title(&mt('Owner')).
                   '<table class="LC_innerpickbox"><tr>'.                    '<table class="LC_innerpickbox"><tr>'.
                   '<th>'.&mt('Name').'</th>'.                    '<th>'.&mt('Name').'</th>'.

Removed from v.1.29  
changed lines
  Added in v.1.30


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>