Diff for /loncom/interface/lonrequestcourse.pm between versions 1.69 and 1.87

version 1.69, 2013/12/24 19:15:11 version 1.87, 2015/05/21 23:40:09
Line 128  sub handler { Line 128  sub handler {
     }      }
   
     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},      &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
         ['action','showdom','cnum','state','crstype','queue']);          ['action','showdom','cnum','state','crstype','queue','tabs']);
     &Apache::lonhtmlcommon::clear_breadcrumbs();      &Apache::lonhtmlcommon::clear_breadcrumbs();
     my $dom = &get_course_dom();      my $dom = &get_course_dom();
     my $action = $env{'form.action'};      my $action = $env{'form.action'};
     my $state = $env{'form.state'};      my $state = $env{'form.state'};
     my (%states,%stored);      my (%states,%stored);
     my ($jscript,$uname,$udom,$result,$warning,$showcredits,$instcredits);      my ($jscript,$uname,$udom,$result,$warning,$showcredits,$instcredits,%can_request,
           %request_domains,@incdoms);
     my %domdefs = &Apache::lonnet::get_domain_defaults($dom);      my %domdefs = &Apache::lonnet::get_domain_defaults($dom);
     if ($domdefs{'officialcredits'} || $domdefs{'unofficialcredits'} || $domdefs{'textbookcredits'}) {      if ($domdefs{'officialcredits'} || $domdefs{'unofficialcredits'} || $domdefs{'textbookcredits'}) {
         $showcredits = 1;          $showcredits = 1;
     }      }
   
       my $canreq =
           &Apache::lonnet::check_can_request($dom,\%can_request,\%request_domains);
   
       foreach my $item (keys(%request_domains)) {
           if (ref($request_domains{$item}) eq 'ARRAY') {
               foreach my $possdom (@{$request_domains{$item}}) {
                   unless(grep(/^\Q$possdom\E$/,@incdoms)) {
                       push(@incdoms,$possdom);
                   }
               }
           }
       }
   
       if ($canreq) {
           if (($env{'form.crstype'} eq 'textbook') || 
               (scalar(keys(%can_request)) == 1) && ($can_request{'textbook'})) {
               my %domconfig = &Apache::lonnet::get_dom('configuration',['requestcourses'],$dom);
               if ($action eq 'log') {
                   my $usetabs;
                   if ((scalar(keys(%can_request)) == 1) && ($can_request{'textbook'})) {
                       $usetabs = 1;
                   } elsif ($env{'form.tabs'} eq 'on') {
                       $usetabs = 1;
                   }
                   &Apache::lonhtmlcommon::add_breadcrumb({text=>'Course Request'});
                   my $crumb = &Apache::lonhtmlcommon::breadcrumbs('Course Requests','Course_Requests');
                   &print_request_logs($r,$dom,undef,undef,$crumb,$usetabs);
               } elsif ($action eq 'process') {
                   if ($can_request{'textbook'}) {
                       &process_textbook_request($r,$dom,$action,\%domdefs,\%domconfig,\%can_request);
                   } else {
                       &textbook_request_disabled($r,$dom,$action,\%can_request);
                   }
               } elsif ($action eq 'display') {
                  my ($uname,$udom,$result,$warning) = &domcoord_display($dom);
                  if ($warning ne '') {
                      my $args = { only_body => 1 };
                      $r->print(&header('Course/Community Requests','','' ,'',$args).
                                '<h3>'.&mt('Course/Community Request Details').'</h3>'.
                                '<div class="LC_warning">'.$warning.'</div>'.
                                &close_popup_form());
                   } else {
                       $states{'display'} = ['details'];
                       my $loaditems = &onload_action($action,$state);
                       my $page = 0;
                       &request_administration($r,$action,$state,$page,\%states,$dom,$jscript,
                                               $loaditems,'','','','','',$showcredits,'','',
                                               $uname,$udom);
                   }
               } else {
                   if ($can_request{'textbook'}) {
                       &print_textbook_form($r,$dom,\@incdoms,\%domdefs,$domconfig{'requestcourses'},\%can_request);
                   } else {
                       &textbook_request_disabled($r,$dom,$action,\%can_request);
                   }
               }
               return OK;
           }
       }
   
     $states{'display'} = ['details'];      $states{'display'} = ['details'];
     $states{'view'} = ['pick_request','details','cancel','removal'];      $states{'view'} = ['pick_request','details','cancel','removal'];
     $states{'log'} = ['display'];      $states{'log'} = ['display'];
Line 165  sub handler { Line 226  sub handler {
   
     my @invalidcrosslist;      my @invalidcrosslist;
     my %trail = (      my %trail = (
                  crstype       => 'Request Action',                   crstype       => 'Pick Action',
                  codepick      => 'Category',                   codepick      => 'Category',
                  courseinfo    => 'Description',                   courseinfo    => 'Description',
                  enrollment    => 'Access Dates',                   enrollment    => 'Access Dates',
Line 187  sub handler { Line 248  sub handler {
     my ($page,$crumb,$newinstcode,$codechk,$checkedcode,$description) =      my ($page,$crumb,$newinstcode,$codechk,$checkedcode,$description) =
         &get_breadcrumbs($dom,$action,\$state,\%states,\%trail);          &get_breadcrumbs($dom,$action,\$state,\%states,\%trail);
     if ($action eq 'display') {      if ($action eq 'display') {
         if (($dom eq $env{'request.role.domain'}) && (&Apache::lonnet::allowed('ccc',$dom))) {          ($uname,$udom,$result,$warning) = &domcoord_display($dom);
             if ($env{'form.cnum'} ne '') {  
                 my $cnum = $env{'form.cnum'};  
                 my $queue = $env{'form.queue'};  
                 my $reqkey = $cnum.'_'.$queue;  
                 my $namespace = 'courserequestqueue';  
                 my $domconfig = &Apache::lonnet::get_domainconfiguser($dom);  
                 my %queued =  
                     &Apache::lonnet::get($namespace,[$reqkey],$dom,$domconfig);  
                 if (ref($queued{$reqkey}) eq 'HASH') {  
                     $uname = $queued{$reqkey}{'ownername'};  
                     $udom  = $queued{$reqkey}{'ownerdom'};  
                     if (($udom =~ /^$match_domain$/) && ($uname =~ /^$match_username$/)) {  
                         $result = &retrieve_settings($dom,$cnum,$udom,$uname);  
                     } else {  
                         if ($env{'form.crstype'} eq 'community') {  
                             $warning = &mt('Invalid username or domain for community requestor');  
                         } else {  
                             $warning = &mt('Invalid username or domain for course requestor');  
                         }  
                     }  
                 } else {  
                     if ($env{'form.crstype'} eq 'community') {  
                         $warning = &mt('No information was found for this community request.');  
                     } else {  
                         $warning = &mt('No information was found for this course request.');  
                     }  
                 }  
             } else {  
                 $warning = &mt('No course request ID provided.');  
             }  
         } else {  
             if ($env{'form.crstype'} eq 'any') {  
                $warning = &mt('You do not have rights to view course or community request information.');  
             } elsif ($env{'form.crstype'} eq 'community') {  
                 $warning = &mt('You do not have rights to view community request information.');  
             } else {  
                 $warning = &mt('You do not have rights to view course request information.');  
             }  
         }  
     } elsif ((defined($state)) && (defined($action))) {      } elsif ((defined($state)) && (defined($action))) {
         if (($action eq 'view') && ($state eq 'details')) {          if (($action eq 'view') && ($state eq 'details')) {
             if ((defined($env{'form.showdom'})) && (defined($env{'form.cnum'}))) {              if ((defined($env{'form.showdom'})) && (defined($env{'form.cnum'}))) {
Line 289  sub handler { Line 311  sub handler {
             $jscript = &Apache::lonhtmlcommon::set_form_elements($elementsref,\%stored);              $jscript = &Apache::lonhtmlcommon::set_form_elements($elementsref,\%stored);
             if ($state eq 'courseinfo') {              if ($state eq 'courseinfo') {
                 $jscript .= &cloning_javascript();                  $jscript .= &cloning_javascript();
               } elsif ($state eq 'process') {
                   $jscript .= &processing_javascript();
             }              }
         }          }
     }      }
Line 299  sub handler { Line 323  sub handler {
   
     my $loaditems = &onload_action($action,$state);      my $loaditems = &onload_action($action,$state);
   
     my (%can_request,%request_domains);  
     my $canreq =   
         &Apache::lonnet::check_can_request($dom,\%can_request,\%request_domains);  
     if ($action eq 'new') {      if ($action eq 'new') {
         if ($canreq) {          if ($canreq) {
             if ($state eq 'crstype') {              if ($state eq 'crstype') {
                 &print_main_menu($r,\%can_request,\%states,$dom,$jscript,$loaditems,                  &print_main_menu($r,\%can_request,\%states,$dom,$jscript,$loaditems,
                                  $crumb,\%request_domains);                                   $crumb,\@incdoms);
             } else {              } else {
                 &request_administration($r,$action,$state,$page,\%states,$dom,                  &request_administration($r,$action,$state,$page,\%states,$dom,
                                         $jscript,$loaditems,$crumb,$newinstcode,                                          $jscript,$loaditems,$crumb,$newinstcode,
Line 321  sub handler { Line 342  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,$loaditems,$crumb,\%request_domains);              &print_main_menu($r,\%can_request,\%states,$dom,$jscript,$loaditems,$crumb,\@incdoms);
         } else {          } else {
             &request_administration($r,$action,$state,$page,\%states,$dom,$jscript,              &request_administration($r,$action,$state,$page,\%states,$dom,$jscript,
                                     $loaditems,$crumb,'','','','',$showcredits);                                      $loaditems,$crumb,'','','','',$showcredits);
Line 340  sub handler { Line 361  sub handler {
         }          }
     } elsif ($action eq 'log') {      } elsif ($action eq 'log') {
         if ($state eq 'crstype') {          if ($state eq 'crstype') {
             &print_main_menu($r,\%can_request,\%states,$dom,$jscript,'',$crumb,\%request_domains);              &print_main_menu($r,\%can_request,\%states,$dom,$jscript,'',$crumb,\@incdoms);
         } else {          } else {
             $jscript .= <<ENDJS;              $jscript .= <<ENDJS;
   
Line 355  function setPage(formname) { Line 376  function setPage(formname) {
 }  }
   
 ENDJS  ENDJS
             &print_request_logs($r,$dom,$jscript,$loaditems,$crumb);              &print_request_logs($r,$dom,$jscript,$loaditems,$crumb,\%can_request);
         }          }
     } else {      } else {
         &print_main_menu($r,\%can_request,\%states,$dom,$jscript,'',$crumb,\%request_domains);          &print_main_menu($r,\%can_request,\%states,$dom,$jscript,'',$crumb,\@incdoms);
     }      }
     return OK;      return OK;
 }  }
Line 394  function setCloneDisplay(courseForm) { Line 415  function setCloneDisplay(courseForm) {
         for (var i=0; i<courseForm.cloning.length; i++) {          for (var i=0; i<courseForm.cloning.length; i++) {
             if (courseForm.cloning[i].checked) {              if (courseForm.cloning[i].checked) {
                 if (courseForm.cloning[i].value == 1) {                  if (courseForm.cloning[i].value == 1) {
                     document.getElementById('cloneoptions').style.display="block";;                      document.getElementById('cloneoptions').style.display="block";
                 }                  }
             }              }
         }          }
Line 403  function setCloneDisplay(courseForm) { Line 424  function setCloneDisplay(courseForm) {
 END  END
 }  }
   
   sub processing_javascript {
       return <<"END";
   function hideProcessing() {
       if (document.getElementById('processing')) {
           document.getElementById('processing').style.display="none";
       }
   }
   
   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,$description);      my ($crumb,$newinstcode,$codechk,$checkedcode,$numtitles,$description);
Line 444  sub get_breadcrumbs { Line 476  sub get_breadcrumbs {
                     }                      }
                 }                  }
             }              }
             for (my $i=0; $i<@{$states->{$action}}; $i++) {              if (ref($states->{$action}) eq 'ARRAY') {
                 if ($$state eq $states->{$action}[$i]) {                  for (my $i=0; $i<@{$states->{$action}}; $i++) {
                     &Apache::lonhtmlcommon::add_breadcrumb(                      if ($$state eq $states->{$action}[$i]) {
                        {text=>"$trail->{$$state}"});  
                     $crumb = &Apache::lonhtmlcommon::breadcrumbs('Course/Community Requests','Course_Requests');  
                     last;  
                 } else {  
                     if (($$state eq 'process') || ($$state eq 'removal') || ($$state eq 'reqauthor')) {  
                         &Apache::lonhtmlcommon::add_breadcrumb(                          &Apache::lonhtmlcommon::add_breadcrumb(
                             { href => '/adm/requestcourse',                             {text=>"$trail->{$$state}"});
                               text => "$trail->{$states->{$action}[$i]}",                          $crumb = &Apache::lonhtmlcommon::breadcrumbs('Course/Community Requests','Course_Requests');
                             }                          last;
                         );  
                     } else {                      } else {
                         &Apache::lonhtmlcommon::add_breadcrumb(                          if (($$state eq 'process') || ($$state eq 'removal') || ($$state eq 'reqauthor')) {
                               &Apache::lonhtmlcommon::add_breadcrumb(
                                   { href => '/adm/requestcourse',
                                     text => "$trail->{$states->{$action}[$i]}",
                                   }
                              );
                           } else {
                               &Apache::lonhtmlcommon::add_breadcrumb(
      { href => "javascript:backPage(document.requestcrs,'$states->{$action}[$i]')",       { href => "javascript:backPage(document.requestcrs,'$states->{$action}[$i]')",
        text => "$trail->{$states->{$action}[$i]}", }         text => "$trail->{$states->{$action}[$i]}", }
                        );                             );
                    }                          }
                }                      }
            }                  }
               }
         } else {          } else {
             &Apache::lonhtmlcommon::add_breadcrumb(              &Apache::lonhtmlcommon::add_breadcrumb(
                     {text=>'Pick Action'});                      {text=>'Pick Action'});
Line 678  sub onload_action { Line 712  sub onload_action {
         if ($state eq 'courseinfo') {          if ($state eq 'courseinfo') {
             $loaditems{'onload'} .= 'javascript:setCloneDisplay(document.requestcrs);';              $loaditems{'onload'} .= 'javascript:setCloneDisplay(document.requestcrs);';
         }          }
           if ($state eq 'process') {
               $loaditems{'onload'} .= 'javascript:hideProcessing();';
           }
     }      }
     return \%loaditems;      return \%loaditems;
 }  }
   
 sub print_main_menu {  sub print_main_menu {
     my ($r,$can_request,$states,$dom,$jscript,$loaditems,$crumb,$request_domains) = @_;      my ($r,$can_request,$states,$dom,$jscript,$loaditems,$crumb,$incdoms) = @_;
     my ($types,$typename) = &Apache::loncommon::course_types();      my ($types,$typename) = &Apache::loncommon::course_types();
     my $onchange = 'this.form.submit()';      my $onchange = 'this.form.submit()';
     my $nextstate_setter = "\n";      my $nextstate_setter = "\n";
Line 775  END Line 812  END
     return true;      return true;
 }  }
 END  END
     my ($pagetitle,$pageinfo,$domaintitle);      my ($pagetitle,$pageinfo,$domaintitle,$earlyout);
     if (ref($can_request) eq 'HASH') {      if (ref($can_request) eq 'HASH') {
         if (($can_request->{'official'}) || ($can_request->{'unofficial'}) || $can_request->{'textbook'}) {          if (($can_request->{'official'}) || ($can_request->{'unofficial'}) || $can_request->{'textbook'}) {
             if ($can_request->{'community'}) {              if ($can_request->{'community'}) {
Line 791  END Line 828  END
             $pagetitle = 'Community Requests';              $pagetitle = 'Community Requests';
             $pageinfo = &mt('Request creation of a new course, or review your pending requests.');              $pageinfo = &mt('Request creation of a new course, or review your pending requests.');
             $domaintitle = &mt('Community Domain');              $domaintitle = &mt('Community Domain');
         } else {          } elsif ((ref($incdoms) eq 'ARRAY') && ((@{$incdoms} > 1) ||
                    ((@{$incdoms} == 1) && ($incdoms->[0] ne $dom)))) {
             $pagetitle = 'Course/Community Requests';              $pagetitle = 'Course/Community Requests';
             $pageinfo = &mt('You do not have rights to request creation of courses in this domain; please choose a different domain.');              $pageinfo = &mt('You do not have rights to request creation of courses in this domain; please choose a different domain.');
             $domaintitle = &mt('Course/Community Domain');              $domaintitle = &mt('Course/Community Domain');
         }          } else {
     }              $pagetitle = 'Course/Community Requests';
     my @incdoms;              $pageinfo  = &mt('You do not have rights to request creation of courses or communities.');
     if (ref($request_domains) eq 'HASH') {              $earlyout = 1;
         foreach my $item (keys(%{$request_domains})) {  
             if (ref($request_domains->{$item}) eq 'ARRAY') {  
                 foreach my $possdom (@{$request_domains->{$item}}) {  
                     unless(grep(/^\Q$possdom\E$/,@incdoms)) {  
                         push(@incdoms,$possdom);  
                     }   
                 }   
             }  
         }          }
     }      }
     $r->print(&header($pagetitle,$js.$jscript,$loaditems).$crumb.      $r->print(&header($pagetitle,$js.$jscript,$loaditems).$crumb.
              '<p>'.$pageinfo.'</p>'.               '<p>'.$pageinfo.'</p>');
              '<div>'.      if ($earlyout) {
           $r->print(&Apache::loncommon::end_page());
           return;
       }
       $r->print('<div>'.
               &Apache::lonhtmlcommon::start_pick_box().                &Apache::lonhtmlcommon::start_pick_box().
               &Apache::lonhtmlcommon::row_title($domaintitle).                &Apache::lonhtmlcommon::row_title($domaintitle).
               '<form name="domforcourse" method="post" action="/adm/requestcourse">'.                '<form name="domforcourse" method="post" action="/adm/requestcourse">'.
               &Apache::loncommon::select_dom_form($dom,'showdom','',1,$onchange,\@incdoms));                &Apache::loncommon::select_dom_form($dom,'showdom','',1,$onchange,$incdoms));
     if (!$onchange) {      if (!$onchange) {
         $r->print('&nbsp;<input type="submit" name="godom" value="'.          $r->print('&nbsp;<input type="submit" name="godom" value="'.
                    &mt('Change').'" />');                     &mt('Change').'" />');
     }      }
     unless ((ref($can_request) eq 'HASH') && (keys(%{$can_request}) > 0)) {      unless ((ref($can_request) eq 'HASH') && (keys(%{$can_request}) > 0)) {
         $r->print(&Apache::lonhtmlcommon::row_closure(1)."\n".          $r->print('</form>'.&Apache::lonhtmlcommon::row_closure(1)."\n".
                   &Apache::lonhtmlcommon::end_pick_box().'</div>'."\n".                    &Apache::lonhtmlcommon::end_pick_box().'</div>'."\n".
                   &Apache::loncommon::end_page());                    &Apache::loncommon::end_page());
         return;          return;
Line 905  END Line 939  END
     if ($action eq 'new') {      if ($action eq 'new') {
         my $jsextra;          my $jsextra;
         if (($state eq 'courseinfo') || ($state eq 'codepick')) {          if (($state eq 'courseinfo') || ($state eq 'codepick')) {
             $jsextra = "\n".&Apache::loncommon::coursebrowser_javascript($dom);              $jsextra = "\n".&Apache::loncommon::coursebrowser_javascript($dom,'','','','','',
                                                                            $newinstcode);
         } elsif ($state eq 'enrollment') {          } elsif ($state eq 'enrollment') {
             if (($env{'form.crstype'} eq 'official') &&               if (($env{'form.crstype'} eq 'official') && 
                 (&Apache::lonnet::auto_run('',$dom))) {                  (&Apache::lonnet::auto_run('',$dom))) {
Line 1090  END Line 1125  END
     return;      return;
 }  }
   
   sub domcoord_display {
       my ($dom) = @_;
       my ($uname,$udom,$result,$warning);
       if (($dom eq $env{'request.role.domain'}) && (&Apache::lonnet::allowed('ccc',$dom))) {
           if ($env{'form.cnum'} ne '') {
               my $cnum = $env{'form.cnum'};
               my $queue = $env{'form.queue'};
               my $reqkey = $cnum.'_'.$queue;
               my $namespace = 'courserequestqueue';
               my $domconfig = &Apache::lonnet::get_domainconfiguser($dom);
               my %queued =
                   &Apache::lonnet::get($namespace,[$reqkey],$dom,$domconfig);
               if (ref($queued{$reqkey}) eq 'HASH') {
                   $uname = $queued{$reqkey}{'ownername'};
                   $udom  = $queued{$reqkey}{'ownerdom'};
                   if (($udom =~ /^$match_domain$/) && ($uname =~ /^$match_username$/)) {
                       $result = &retrieve_settings($dom,$cnum,$udom,$uname);
                   } else {
                       if ($env{'form.crstype'} eq 'community') {
                           $warning = &mt('Invalid username or domain for community requestor');
                       } else {
                           $warning = &mt('Invalid username or domain for course requestor');
                       }
                   }
               } else {
                   if ($env{'form.crstype'} eq 'community') {
                       $warning = &mt('No information was found for this community request.');
                   } else {
                       $warning = &mt('No information was found for this course request.');
                   }
               }
           } else {
               $warning = &mt('No course request ID provided.');
           }
       } else {
           if ($env{'form.crstype'} eq 'any') {
               $warning = &mt('You do not have rights to view course or community request information.');
           } elsif ($env{'form.crstype'} eq 'community') {
               $warning = &mt('You do not have rights to view community request information.');
           } else {
               $warning = &mt('You do not have rights to view course request information.');
           }
       }
       return ($uname,$udom,$result,$warning);
   }
   
 sub enrollment_lcsec_js {  sub enrollment_lcsec_js {
     my %alerts = &section_check_alerts();      my %alerts = &section_check_alerts();
     my $secname = $alerts{'badsec'};      my $secname = $alerts{'badsec'};
Line 1468  sub print_request_form { Line 1549  sub print_request_form {
         }          }
         $r->print(&print_review($dom,\@codetitles,\%cat_titles,\%cat_order,\@code_order,'','',\@disallowed,\%disallowmsg,$instcredits).          $r->print(&print_review($dom,\@codetitles,\%cat_titles,\%cat_order,\@code_order,'','',\@disallowed,\%disallowmsg,$instcredits).
                   '<input type="hidden" name="cnum" value="'.$cnum.'" />');                    '<input type="hidden" name="cnum" value="'.$cnum.'" />');
           my $fullname = &Apache::loncommon::plainname($env{'user.name'},
                                                        $env{'user.domain'});
           my $postprocess = &Apache::lonnet::auto_crsreq_update($dom,$cnum,$crstype,'review',$env{'user.name'},
                                                                 $env{'user.domain'},$fullname,$env{'form.cdescr'});
           if (ref($postprocess) eq 'HASH') {
               if ($postprocess->{'reviewweb'}) {
                   $r->print($postprocess->{'reviewweb'});
               }
           }
         if ($crstype eq 'community') {          if ($crstype eq 'community') {
             $navtxt{'next'} = &mt('Submit community request');              $navtxt{'next'} = &mt('Submit community request');
         } else {          } else {
Line 1478  sub print_request_form { Line 1568  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);
         }          }
         my ($storeresult,$result) = &print_request_outcome($dom,\@codetitles,          my $lonhost = $r->dir_config('lonHostID');
           my ($storeresult,$result) = &print_request_outcome($r,$lonhost,$dom,\@codetitles,
                                                            \@code_order,$instcredits);                                                             \@code_order,$instcredits);
         $r->print($result);          $r->print($result);
         if (($storeresult eq 'ok') || ($storeresult eq 'created')) {          if (($storeresult eq 'ok') || ($storeresult eq 'created')) {
Line 1488  sub print_request_form { Line 1579  sub print_request_form {
                           '<a href="/adm/requestcourse">'.&mt('Make another request').'</a></p>');                            '<a href="/adm/requestcourse">'.&mt('Make another request').'</a></p>');
             }              }
             if (&Apache::loncoursequeueadmin::author_prompt()) {              if (&Apache::loncoursequeueadmin::author_prompt()) {
                 $r->print('<h3>'.&mt('Access to authoring space').'</h3>'.                  &print_author_prompt($r,$env{'form.action'},$env{'form.cnum'},$env{'form.showdom'},
                           '<p>'.                                       $env{'form.crstype'},$storeresult);
                           &mt('Although assessment items can be created directly inside a course, such items only use part of the assessment capabilities of LON-CAPA.').  
                           '<br />'.  
                           &mt('By contrast, items created in authoring space, then imported into a course, can use all of the features of the assessment engine.').'</p>'.  
                           '<p>'.&mt('Request authoring space access now?').  
                           '<span class="LC_nobreak">&nbsp;'.  
                           '<label><input type="radio" name="requestauthor" value="1" />'.&mt('Yes').'</label>'.  
                           ('&nbsp;'x2).  
                           '<label><input type="radio" name="requestauthor" value="0" checked="checked"/>'.&mt('No').'</label>'.  
                           '</span></p>'.  
                           '<input type="submit" name="newauthor" value="'.&mt('Submit authoring request').'" />'.  
                           '<input type="hidden" name="state" value="reqauthor" />'.  
                           '<input type="hidden" name="action" value="'.$env{'form.action'}.'" />'.  
                           '<input type="hidden" name="cnum" value="'.$env{'form.cnum'}.'" />'.  
                           '<input type="hidden" name="showdom" value="'.$env{'form.showdom'}.'" />'.  
                           '<input type="hidden" name="crstype" value="'.$env{'form.crstype'}.'" />'.  
                           '<input type="hidden" name="disposition" value="'.$storeresult.'" />'.  
                           '<br />');  
             } elsif ($storeresult eq 'created') {              } elsif ($storeresult eq 'created') {
                 $r->print('<p><a href="/adm/requestcourse">'.&mt('Make another request').'</a></p>');                  $r->print('<p><a href="/adm/requestcourse">'.&mt('Make another request').'</a></p>');
             }              }
Line 1518  sub print_request_form { Line 1592  sub print_request_form {
             if ($result eq 'created') {              if ($result eq 'created') {
                 my $role = 'au';                  my $role = 'au';
                 my $spec = "$role./$env{'form.showdom'}/";                  my $spec = "$role./$env{'form.showdom'}/";
                 push(@links,&mt('Enter your authoring space with role: [_1]',                  push(@links,&mt('Enter your Authoring Space with role: [_1]',
                                 '<a href="/adm/roles?selectrole=1&amp;'.$spec.'=1">'.                                  '<a href="/adm/roles?selectrole=1&amp;'.$spec.'=1">'.
                                 &Apache::lonnet::plaintext($role).'</a>'));                                  &Apache::lonnet::plaintext($role).'</a>'));
             }              }
Line 1591  sub print_request_form { Line 1665  sub print_request_form {
     return;      return;
 }  }
   
   sub print_author_prompt {
       my ($r,$action,$cnum,$showdom,$crstype,$storeresult) = @_;
       $r->print('<h3>'.&mt('Access to Authoring Space').'</h3>'.
                 '<p>'.
                 &mt('Although assessment items can be created directly inside a course, such items only use part of the assessment capabilities of LON-CAPA.').
                 '<br />'.
                 &mt('By contrast, items created in Authoring Space, then imported into a course, can use all of the features of the assessment engine.').'</p>'.
                 '<p>'.&mt('Request Authoring Space access now?').
                 '<span class="LC_nobreak">&nbsp;'.
                 '<label><input type="radio" name="requestauthor" value="1" />'.&mt('Yes').'</label>'.
                 ('&nbsp;'x2).
                 '<label><input type="radio" name="requestauthor" value="0" checked="checked"/>'.&mt('No').'</label>'.
                 '</span></p>'.
                 '<input type="submit" name="newauthor" value="'.&mt('Submit authoring request').'" />'.
                 '<input type="hidden" name="state" value="reqauthor" />'.
                 '<input type="hidden" name="action" value="'.$action.'" />'.
                 '<input type="hidden" name="cnum" value="'.$cnum.'" />'.
                 '<input type="hidden" name="showdom" value="'.$showdom.'" />'.
                 '<input type="hidden" name="crstype" value="'.$crstype.'" />'.
                 '<input type="hidden" name="disposition" value="'.$storeresult.'" />'.
                 '<br />');
   }    
   
 sub get_usertype {  sub get_usertype {
     my ($persondom,$personname,$curr_rules,$got_rules) = @_;      my ($persondom,$personname,$curr_rules,$got_rules) = @_;
     my ($rules,$ruleorder) =      my ($rules,$ruleorder) =
Line 2105  sub sorted_request_history { Line 2202  sub sorted_request_history {
             my $crstype = $history{'crstype'};              my $crstype = $history{'crstype'};
             my $disposition = $history{'disposition'};              my $disposition = $history{'disposition'};
             my $status = $history{'status'};              my $status = $history{'status'};
               my $uniquecode = $history{'code'}; 
             if ($action eq 'view') {              if ($action eq 'view') {
                 next if ((exists($history{'status'})) && ($history{'status'} eq 'created'));                  next if ((exists($history{'status'})) && ($history{'status'} eq 'created'));
             } else {              } else {
Line 2120  sub sorted_request_history { Line 2218  sub sorted_request_history {
                 $entry = $requestkey.':'.$crstype.':'.                  $entry = $requestkey.':'.$crstype.':'.
                          &escape($history{'details'}{'cdescr'});                           &escape($history{'details'}{'cdescr'});
                 if ($action eq 'log') {                  if ($action eq 'log') {
                     $entry .= ':'.$lastupdate.':';                      $entry .= ':'.$uniquecode.':'.$lastupdate.':';
                     if ($statusinfo{$key} ne '') {                      if ($statusinfo{$key} ne '') {
                         $entry .= $statusinfo{$key};                          $entry .= $statusinfo{$key};
                     } elsif ($status ne '') {                      } elsif ($status ne '') {
Line 2333  ENDJS Line 2431  ENDJS
 }  }
   
 sub print_request_logs {  sub print_request_logs {
     my ($r,$dom,$jscript,$loaditems,$crumb) = @_;      my ($r,$dom,$jscript,$loaditems,$crumb,$usetabs) = @_;
     my $title;      my $title;
     if ($env{'form.crstype'} eq 'community') {      if ($env{'form.crstype'} eq 'community') {
         $title = 'Community Request Logs';          $title = 'Community Request Logs';
Line 2343  sub print_request_logs { Line 2441  sub print_request_logs {
         $title = 'Course Request Logs';          $title = 'Course Request Logs';
     }      }
     $r->print(&header($title,$jscript,$loaditems).$crumb);      $r->print(&header($title,$jscript,$loaditems).$crumb);
       if ($usetabs) {
           &startContentScreen($r,'textbooklogs');
       }
     my $formname = 'requestcrs';      my $formname = 'requestcrs';
     $r->print('<form action="/adm/requestcourse" method="post" name="'.$formname.'" onsubmit="javascript:setPage(this);">'."\n".      $r->print('<form action="/adm/requestcourse" method="post" name="'.$formname.'" onsubmit="javascript:setPage(this);">'."\n".
               '<input type="hidden" name="action" value="log" />'."\n".                '<input type="hidden" name="action" value="log" />'."\n".
Line 2387  sub print_request_logs { Line 2488  sub print_request_logs {
     if (($curr{'crstype'} eq 'official') || ($curr{'crstype'} eq 'any')) {      if (($curr{'crstype'} eq 'official') || ($curr{'crstype'} eq 'any')) {
         $tablehdr .= '<th>'.&mt('Institutional Code').'</th>';          $tablehdr .= '<th>'.&mt('Institutional Code').'</th>';
     }      }
       my $showuniquecode;
       my %domconfig = &Apache::lonnet::get_dom('configuration',['requestcourses'],$dom);
       if (($curr{'status'} eq 'any') || ($curr{'status'} eq 'created')) {
           if (ref($domconfig{'requestcourses'}) eq 'HASH') {
               if (ref($domconfig{'requestcourses'}{'uniquecode'}) eq 'HASH') {
                   if ($curr{'crstype'} eq 'any') {
                       my @types = qw(official unofficial community textbook);
                       foreach my $type (@types) {
                           if ($domconfig{'requestcourses'}{'uniquecode'}{$type}) {
                               $showuniquecode = 1;
                               last;
                           }
                       }
                   } elsif ($domconfig{'requestcourses'}{'uniquecode'}{$curr{'crstype'}}) {
                       $showuniquecode = 1;
                   }
               }
           }
       }
       if ($showuniquecode) {
           $tablehdr .= '<th>'.&mt('Unique Code').'</th>';    
       }
     if ($curr{'status'} eq 'any') {      if ($curr{'status'} eq 'any') {
         $tablehdr .= '<th>'.&mt('Status').'</th>';          $tablehdr .= '<th>'.&mt('Status').'</th>';
     } elsif ($curr{'status'} eq 'created') {      } elsif ($curr{'status'} eq 'created') {
Line 2424  sub print_request_logs { Line 2547  sub print_request_logs {
             my $showtime = &Apache::lonlocal::locallocaltime($item);              my $showtime = &Apache::lonlocal::locallocaltime($item);
             if (ref($queue_by_date{$item}) eq 'ARRAY') {              if (ref($queue_by_date{$item}) eq 'ARRAY') {
                 foreach my $request (sort(@{$queue_by_date{$item}})) {                  foreach my $request (sort(@{$queue_by_date{$item}})) {
                     my ($key,$crstype,$desc,$timestamp,$status,$instcode) = split(':',$request);                      my ($key,$crstype,$desc,$uniquecode,$timestamp,$status,$instcode) = split(':',$request);
                     my ($cdom,$cnum) = split('_',$key);                      my ($cdom,$cnum) = split('_',$key);
                     my $output = &Apache::loncommon::start_data_table_row().                      my $output = &Apache::loncommon::start_data_table_row().
      '<td>'.$count.'</td>'.       '<td>'.$count.'</td>'.
Line 2450  sub print_request_logs { Line 2573  sub print_request_logs {
                         }                          }
                         $output .= '<td>'.$showinstcode.'</td>';                          $output .= '<td>'.$showinstcode.'</td>';
                     }                      }
                       if ($showuniquecode) {
                           if ($status eq 'created') {
                               $output .= '<td>'.$uniquecode.'</td>';
                           } else {
                               $output .= '<td>'.&mt('Not applicable').'</td>';
                           }    
                       }
                     if ($curr{'status'} eq 'any') {                      if ($curr{'status'} eq 'any') {
                         my $statusname = &mt('Unknown status');                          my $statusname = &mt('Unknown status');
                         if (ref($statusnames) eq 'HASH') {                          if (ref($statusnames) eq 'HASH') {
Line 2510  ENDSCRIPT Line 2640  ENDSCRIPT
                   &mt('There are no records to display').                    &mt('There are no records to display').
                   '</p>');                    '</p>');
     }      }
     $r->print('</form>'.      if ($usetabs) {
               &Apache::loncommon::end_page());          $r->print('<input type="hidden" name="tabs" value="on" />');
       }
       $r->print('</form>');
       if ($usetabs) {
           &endContentScreen($r);
       }
       $r->print(&Apache::loncommon::end_page());
     return;      return;
 }  }
   
Line 2653  sub print_review { Line 2789  sub print_review {
   
     my $enrollrow_title = &mt('Default Access Dates').'<br />'.      my $enrollrow_title = &mt('Default Access Dates').'<br />'.
                           '('.&Apache::lonnet::plaintext('st',$category).')';                            '('.&Apache::lonnet::plaintext('st',$category).')';
       my $instcode;
     if ($env{'form.crstype'} eq 'official') {      if ($env{'form.crstype'} eq 'official') {
         if ((ref($codetitles) eq 'ARRAY') && (ref($cat_titles) eq 'HASH')) {          if ((ref($codetitles) eq 'ARRAY') && (ref($cat_titles) eq 'HASH')) {
             foreach my $title (@{$codetitles}) {              foreach my $title (@{$codetitles}) {
Line 2668  sub print_review { Line 2805  sub print_review {
                 }                  }
             }              }
         }          }
           if (ref($code_order) eq 'ARRAY') {
               foreach my $item (@{$code_order}) {
                   $instcode .= $env{'form.instcode_'.$item};
               }
           }
         $inst_headers .= '<th>'.&mt('Credits').'</th>';          $inst_headers .= '<th>'.&mt('Credits').'</th>';
         if ($instcredits) {          if ($instcredits) {
             $inst_values .= '<td>'.$instcredits.'</td>';              $inst_values .= '<td>'.$instcredits.'</td>';
Line 2755  sub print_review { Line 2897  sub print_review {
         ($env{'form.clonedom'} =~ /^$match_domain$/)) {          ($env{'form.clonedom'} =~ /^$match_domain$/)) {
         my $canclone = &Apache::loncoursequeueadmin::can_clone_course($uname,          my $canclone = &Apache::loncoursequeueadmin::can_clone_course($uname,
                            $udom,$env{'form.clonecrs'},$env{'form.clonedom'},                             $udom,$env{'form.clonecrs'},$env{'form.clonedom'},
                            $env{'form.crstype'});                             $env{'form.crstype'},$dom,$instcode);
         if ($canclone) {          if ($canclone) {
             my %courseenv = &Apache::lonnet::userenvironment($env{'form.clonedom'},              my %courseenv = &Apache::lonnet::userenvironment($env{'form.clonedom'},
                               $env{'form.clonecrs'},('description','internal.coursecode'));                                $env{'form.clonecrs'},('description','internal.coursecode'));
Line 3242  sub display_navbuttons { Line 3384  sub display_navbuttons {
 }  }
   
 sub print_request_outcome {  sub print_request_outcome {
     my ($dom,$codetitles,$code_order,$instcredits) = @_;      my ($r,$lonhost,$dom,$codetitles,$code_order,$instcredits) = @_;
     my ($output,$cnum,$now,$req_notifylist,$crstype,$enrollstart,$enrollend,      my ($output,$cnum,$now,$req_notifylist,$crstype,$enrollstart,$enrollend,
         %sections,%crosslistings,%personnel,@baduname,@missingdom,%domconfig);          %sections,%crosslistings,%personnel,@baduname,@missingdom,%domconfig,
           $uniquecode);
     my $sectotal = $env{'form.sectotal'};      my $sectotal = $env{'form.sectotal'};
     my $crosslisttotal = 0;      my $crosslisttotal = 0;
     $cnum = $env{'form.cnum'};      $cnum = $env{'form.cnum'};
Line 3252  sub print_request_outcome { Line 3395  sub print_request_outcome {
         $output = &mt('Invalid LON-CAPA course number for the new course')."\n";           $output = &mt('Invalid LON-CAPA course number for the new course')."\n"; 
         return $output;          return $output;
     }      }
       $crstype = $env{'form.crstype'};
     %domconfig = &Apache::lonnet::get_dom('configuration',['requestcourses'],$dom);      my %domconfig = &Apache::lonnet::get_dom('configuration',['requestcourses'],$dom);
     if (ref($domconfig{'requestcourses'}) eq 'HASH') {      if (ref($domconfig{'requestcourses'}) eq 'HASH') {
         if (ref($domconfig{'requestcourses'}{'notify'}) eq 'HASH') {          if (ref($domconfig{'requestcourses'}{'notify'}) eq 'HASH') {
             $req_notifylist = $domconfig{'requestcourses'}{'notify'}{'approval'};              $req_notifylist = $domconfig{'requestcourses'}{'notify'}{'approval'};
         }          }
           if (ref($domconfig{'requestcourses'}{'uniquecode'}) eq 'HASH') {
               $uniquecode = $domconfig{'requestcourses'}{'uniquecode'}{$crstype};
           }
     }      }
     $now = time;      $now = time;
     $crstype = $env{'form.crstype'};  
     my $ccrole = 'cc';      my $ccrole = 'cc';
     if ($crstype eq 'community') {      if ($crstype eq 'community') {
         $ccrole = 'co';          $ccrole = 'co';
Line 3450  sub print_request_outcome { Line 3595  sub print_request_outcome {
             my $canclone =                my $canclone =  
                 &Apache::loncoursequeueadmin::can_clone_course($env{'user.name'},                  &Apache::loncoursequeueadmin::can_clone_course($env{'user.name'},
                         $env{'user.domain'},$env{'form.clonecrs'},$env{'form.clonedom'},                          $env{'user.domain'},$env{'form.clonecrs'},$env{'form.clonedom'},
                         $crstype);                          $crstype,$dom,$instcode);
             if ($canclone) {              if ($canclone) {
                 $clonecrs = $env{'form.clonecrs'};                  $clonecrs = $env{'form.clonecrs'};
                 $clonedom = $env{'form.clonedom'};                  $clonedom = $env{'form.clonedom'};
Line 3467  sub print_request_outcome { Line 3612  sub print_request_outcome {
                     crstype        => $env{'form.crstype'},                      crstype        => $env{'form.crstype'},
                     instcode       => $instcode,                      instcode       => $instcode,
                     defaultcredits => $credits,                       defaultcredits => $credits, 
                       uniquecode     => $uniquecode,
                     clonedom       => $clonedom,                      clonedom       => $clonedom,
                     clonecrs       => $clonecrs,                      clonecrs       => $clonecrs,
                     datemode       => $env{'form.datemode'},                      datemode       => $env{'form.datemode'},
Line 3483  sub print_request_outcome { Line 3629  sub print_request_outcome {
                     accessend      => $accessend,                      accessend      => $accessend,
                     personnel      => \%personnel,                      personnel      => \%personnel,
                   };                    };
     my (@inststatuses,$storeresult,$creationresult);      my ($result,$output) = &process_request($r,$lonhost,$dom,$cnum,$crstype,$now,$details,$instcode,
                                               $req_notifylist,\@instsections,\%domconfig);
       return ($result,$output);
   }
       
   sub process_request {
       my ($r,$lonhost,$dom,$cnum,$crstype,$now,$details,$instcode,$req_notifylist,$instsections,
           $domconfig) = @_; 
       my (@inststatuses,$storeresult,$creationresult,$output);
     my $val =       my $val = 
         &Apache::loncoursequeueadmin::get_processtype('course',$env{'user.name'},          &Apache::loncoursequeueadmin::get_processtype('course',$env{'user.name'},
                                                       $env{'user.domain'},$env{'user.adv'},                                                        $env{'user.domain'},$env{'user.adv'},
                                                       $dom,$crstype,\@inststatuses,\%domconfig);                                                        $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.');
Line 3502  sub print_request_outcome { Line 3656  sub print_request_outcome {
         }          }
         $storeresult = 'notpermitted';           $storeresult = 'notpermitted'; 
     } else {      } else {
         my ($disposition,$message,$reqstatus);          my ($disposition,$message,$reqstatus,$coursedesc);
         my %reqhash = (          my %reqhash = (
                         reqtime   => $now,                          reqtime   => $now,
                         crstype   => $crstype,                          crstype   => $crstype,
Line 3510  sub print_request_outcome { Line 3664  sub print_request_outcome {
                       );                        );
         my $requestkey = $dom.'_'.$cnum;          my $requestkey = $dom.'_'.$cnum;
         my $validationerror;          my $validationerror;
           my $fullname = &Apache::loncommon::plainname($env{'user.name'},
                                                        $env{'user.domain'});
           if (ref($details) eq 'HASH') {
               $coursedesc = $details->{'cdescr'};
           }
         if ($val eq 'autolimit=') {          if ($val eq 'autolimit=') {
             $disposition = 'process';              $disposition = 'process';
         } elsif ($val =~ /^autolimit=(\d+)$/) {          } elsif ($val =~ /^autolimit=(\d+)$/) {
Line 3517  sub print_request_outcome { Line 3676  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') {
             my ($inststatuslist,$validationchk,$validation);              my ($inststatuslist,$validationchk,$validation,%custominfo);
               if (ref($details) eq 'HASH') {
                   if ($details->{'clonecrs'}) {
                       $custominfo{'_LC_clonefrom'} = $details->{'clonedom'}.'_'.$details->{'clonecrs'};
                   }
               }
             if (@inststatuses > 0) {              if (@inststatuses > 0) {
                 $inststatuslist = join(',',@inststatuses);                  $inststatuslist = join(',',@inststatuses);
             }              }
             my $instseclist;              my $instseclist;
             if (@instsections > 0) {              if (ref($instsections) eq 'ARRAY') {
                 $instseclist = join(',',@instsections);                  if (@{$instsections} > 0) {
                       $instseclist = join(',',@{$instsections});
                   }
               }
               my $preprocess = &Apache::lonnet::auto_crsreq_update($dom,$cnum,$crstype,'prevalidate',$env{'user.name'},
                                                                    $env{'user.domain'},$fullname,$coursedesc);
               if (ref($preprocess) eq 'HASH') {
                   if (ref($preprocess->{'formitems'}) eq 'HASH') {
                       foreach my $key (keys(%{$preprocess->{'formitems'}})) {
                           if ($preprocess->{'formitems'}->{$key} eq 'multiple') {
                               if (exists($env{'form.'.$key})) {
                                   @{$custominfo{$key}} = &Apache::loncommon::get_env_multiple($env{'form.'.$key});
                               }
                           } else {
                               if (exists($env{'form.'.$key})) {
                                   $custominfo{$key} = $env{'form.'.$key};
                               }
                           }
                       }
                   }
             }              }
             $validationchk =               $validationchk = 
                 &Apache::lonnet::auto_courserequest_validation($dom,                  &Apache::lonnet::auto_courserequest_validation($dom,
                     $env{'user.name'}.':'.$env{'user.domain'},$crstype,                      $env{'user.name'}.':'.$env{'user.domain'},$crstype,
                     $inststatuslist,$instcode,$instseclist);                      $inststatuslist,$instcode,$instseclist,\%custominfo);
             if ($validationchk =~ /:/) {              if ($validationchk =~ /:/) {
                 ($validation,$message) = split(':',$validationchk);                  ($validation,$message) = split(':',$validationchk);
             } else {              } else {
Line 3545  sub print_request_outcome { Line 3728  sub print_request_outcome {
         }          }
         $reqhash{'disposition'} = $disposition;          $reqhash{'disposition'} = $disposition;
         $reqstatus = $disposition;          $reqstatus = $disposition;
         my ($modified,$queued);          my ($modified,$queued,$coursedesc,$token,%customitems);
           unless ($disposition eq 'rejected') {
               my $inprocess = &Apache::lonnet::auto_crsreq_update($dom,$cnum,$crstype,'process',$env{'user.name'},
                                                                   $env{'user.domain'},$fullname,$coursedesc);
               if (ref($inprocess) eq 'HASH') {
                   if (ref($inprocess->{'formitems'}) eq 'HASH') {
                       foreach my $key (keys(%{$inprocess->{'formitems'}})) {
                           if ($inprocess->{'formitems'}->{$key} eq 'multiple') {
                               if (exists($env{'form.'.$key})) {
                                   @{$customitems{$key}} = &Apache::loncommon::get_env_multiple($env{'form.'.$key});
                               }
                           } else {
                               if (exists($env{'form.'.$key})) {
                                   $customitems{$key} = $env{'form.'.$key};
                                   $reqhash{'custom'}{$key} = $customitems{$key};
                               }
                           }
                       }
                   }
               }
           }
         if ($disposition eq 'rejected') {          if ($disposition eq 'rejected') {
             if ($crstype eq 'community') {              if ($crstype eq 'community') {
                 $output = &mt('Your community request was rejected.');                  $output = &mt('Your community request was rejected.');
Line 3558  sub print_request_outcome { Line 3761  sub print_request_outcome {
             $storeresult = 'rejected';              $storeresult = 'rejected';
         } elsif ($disposition eq 'process') {          } elsif ($disposition eq 'process') {
             my %domdefs = &Apache::lonnet::get_domain_defaults($dom);              my %domdefs = &Apache::lonnet::get_domain_defaults($dom);
             my ($logmsg,$newusermsg,$addresult,$enrollcount,$response,$keysmsg,%longroles);              my ($logmsg,$newusermsg,$addresult,$enrollcount,$response,$keysmsg,%longroles,$code);
             my $type = 'Course';              my $type = 'Course';
             if ($crstype eq 'community') {              if ($crstype eq 'community') {
                 $type = 'Community';                  $type = 'Community';
Line 3567  sub print_request_outcome { Line 3770  sub print_request_outcome {
             foreach my $role (@roles) {              foreach my $role (@roles) {
                 $longroles{$role}=&Apache::lonnet::plaintext($role,$type);                  $longroles{$role}=&Apache::lonnet::plaintext($role,$type);
             }              }
             my $result = &Apache::loncoursequeueadmin::course_creation($dom,$cnum,              $r->print('<div id="processing" style="display:block;">'."\n".
                                    'autocreate',$details,\$logmsg,\$newusermsg,\$addresult,                        &mt('Your request is being processed; this page will update when processing is complete.').
                                    \$enrollcount,\$response,\$keysmsg,\%domdefs,\%longroles);                        '</div>');
               $r->rflush();
               if (ref($details) eq 'HASH') {
                   if ($details->{'clonecrs'}) {
                       $customitems{'_LC_clonefrom'} = $details->{'clonedom'}.'_'.$details->{'clonecrs'};
                   }
               }
               my ($result,$postprocess) = &Apache::loncoursequeueadmin::course_creation($dom,$cnum,
                                             'autocreate',$details,\$logmsg,\$newusermsg,\$addresult,
                                             \$enrollcount,\$response,\$keysmsg,\%domdefs,\%longroles,
                                             \$code,\%customitems);
             if ($result eq 'created') {              if ($result eq 'created') {
                 $disposition = 'created';                  $disposition = 'created';
                 $reqstatus = 'created';                  $reqstatus = 'created';
Line 3580  sub print_request_outcome { Line 3793  sub print_request_outcome {
                 } else {                  } else {
                     $output = '<p>'.&mt('Your course request has been processed and the course has been created.');                      $output = '<p>'.&mt('Your course request has been processed and the course has been created.');
                 }                  }
                   if (($code) || ((ref($postprocess) eq 'HASH') && 
                                   (($postprocess->{'createdweb'}) || ($postprocess->{'createdmsg'})))) {
                       $output .= &notification_information($disposition,$env{'user.name'}.':'.$env{'user.domain'},
                                                            $dom,$cnum,$now,$code,$postprocess);
                   }
                   if ($code) {
                       $reqhash{'code'} = $code;
                   }
                   if (ref($postprocess) eq 'HASH') {
                       if (ref($postprocess->{'createdactions'}) eq 'HASH') {
                           if (ref($postprocess->{'createdactions'}{'environment'}) eq 'HASH') {
                               &Apache::loncoursequeueadmin::postprocess_crsenv($dom,$cnum,
                                                                                $postprocess->{'createdactions'}{'environment'});
                           }
                       }
                   }
                 $output .= '<br />'.$role_result.'</p>';                  $output .= '<br />'.$role_result.'</p>';
                 $creationresult = 'created';                  $creationresult = 'created';
             } else {              } else {
Line 3596  sub print_request_outcome { Line 3825  sub print_request_outcome {
             }              }
         } else {          } else {
             my $requestid = $cnum.'_'.$disposition;              my $requestid = $cnum.'_'.$disposition;
             my $request = {               my $request = {
                             $requestid => {                              $requestid => {
                                             timestamp   => $now,                                              timestamp   => $now,
                                             crstype     => $crstype,                                              crstype     => $crstype,
                                             ownername   => $env{'user.name'},                                              ownername   => $env{'user.name'},
                                             ownerdom    => $env{'user.domain'},                                              ownerdom    => $env{'user.domain'},
                                             description => $env{'form.cdescr'},                                               description => $env{'form.cdescr'},
                                               lonhost     => $lonhost,
                                           },                                            },
                           };                            };
             if ($crstype eq 'official') {              if ($crstype eq 'official') {
Line 3620  sub print_request_outcome { Line 3850  sub print_request_outcome {
                 if (($queuehash{$cnum.'_approval'} ne '') ||                   if (($queuehash{$cnum.'_approval'} ne '') || 
                     ($queuehash{$cnum.'_pending'} ne '')) {                      ($queuehash{$cnum.'_pending'} ne '')) {
                     $queued = 1;                      $queued = 1;
                       if (ref($queuehash{$cnum.'_pending'}) eq 'HASH') {
                           $token = $queuehash{$cnum.'_pending'}{'token'};
                       } 
                 }                  }
             }              }
             unless ($queued) {              unless ($queued) {
                   if (($disposition eq 'pending') && ($crstype ne 'official')) {
                       my %reqinfo = (
                                       $cnum.':'.$dom => $now.':'.$env{'user.name'}.':'.$env{'user.domain'},
                                     );
                        $token = &Apache::lonnet::tmpput(\%reqinfo,$lonhost);
                        $request->{$requestid}->{'token'} = $token;
                   }
                 my $putresult = &Apache::lonnet::newput_dom('courserequestqueue',$request,                  my $putresult = &Apache::lonnet::newput_dom('courserequestqueue',$request,
                                                             $dom);                                                              $dom);
                 if ($putresult eq 'ok') {                  if ($putresult eq 'ok') {
Line 3631  sub print_request_outcome { Line 3871  sub print_request_outcome {
                     } else {                      } else {
                         $output .= &mt('Your course request has been recorded.')                           $output .= &mt('Your course request has been recorded.') 
                     }                      }
                     $output .= '<br />'.                      unless ($disposition eq 'pending') { 
                               &notification_information($disposition,$req_notifylist,                          $output .= '<br />'.
                                                         $cnum,$now);                                     &notification_information($disposition,$req_notifylist,
                                                                $dom,$cnum,$now);
                       }
                 } else {                  } else {
                     $reqstatus = 'domainerror';                      $reqstatus = 'domainerror';
                     $reqhash{'disposition'} = $disposition;                      $reqhash{'disposition'} = $disposition;
Line 3645  sub print_request_outcome { Line 3887  sub print_request_outcome {
         ($storeresult,my $updateresult) =           ($storeresult,my $updateresult) = 
             &Apache::loncoursequeueadmin::update_coursereq_status(\%reqhash,$dom,              &Apache::loncoursequeueadmin::update_coursereq_status(\%reqhash,$dom,
                 $cnum,$reqstatus,'request',$env{'user.domain'},$env{'user.name'});                  $cnum,$reqstatus,'request',$env{'user.domain'},$env{'user.name'});
         if ($modified && $queued && $storeresult eq 'ok') {          if ($storeresult eq 'ok') {
             if ($crstype eq 'community') {              my $postprocess;
                 $output .= '<p>'.&mt('Your community request has been updated').'</p>';              if (($disposition eq 'approval') || ($disposition eq 'pending')) {
             } else {                  my $updateaction = $disposition;
                 $output .= '<p>'.&mt('Your course request has been updated').'</p>';                  if ($disposition eq 'approval') {
                       $updateaction = 'queued';
                   }
                   my $fullname = &Apache::loncommon::plainname($env{'user.name'},
                                                                $env{'user.domain'});
                   $postprocess =
                       &Apache::lonnet::auto_crsreq_update($dom,$cnum,$crstype,$updateaction,$env{'user.name'},
                                                           $env{'user.domain'},$fullname,$env{'form.cdescr'});
               }
               if ($modified && $queued) {
                   if ($crstype eq 'community') {
                       $output .= '<p>'.&mt('Your community request has been updated').'</p>';
                   } else {
                       $output .= '<p>'.&mt('Your course request has been updated').'</p>';
                   }
                   if ($disposition eq 'approval') {
                       $output .= &notification_information($disposition,$req_notifylist,$dom,$cnum,$now);
                   }
               }
               if ($disposition eq 'approval') {
                   if ((ref($postprocess) eq 'HASH') && 
                       ((ref($postprocess->{'queuedmsg'}) eq 'HASH') || ($postprocess->{'queuedweb'}))) { 
                       &notification_information($disposition,undef,$dom,$cnum,$now,undef,$postprocess);
                   }
               } elsif ($disposition eq 'pending') {
                   my $pendingform;
                   if ($crstype ne 'official') {
                       $pendingform = &pending_validation_form($dom,$cnum,$crstype,$now,$token,
                                                               $lonhost,$env{'form.cdescr'});
                   }
                   if ($pendingform) {
                       $output .= $pendingform;
                   } else { 
                       $output .= &notification_information($disposition,undef,$dom,$cnum,$now,undef,$postprocess);
                   }
             }              }
             $output .= &notification_information($disposition,$req_notifylist,$cnum,$now);  
         }          }
         if ($validationerror ne '') {          if ($validationerror ne '') {
             $output .= '<p class="LC_warning">'.&mt('An error occurred validating your request with institutional data sources: [_1].',$validationerror).'</p>';              $output .= '<p class="LC_warning">'.&mt('An error occurred validating your request with institutional data sources: [_1].',$validationerror).'</p>';
Line 3803  sub update_requestors_roles { Line 4078  sub update_requestors_roles {
 }  }
   
 sub notification_information {  sub notification_information {
     my ($disposition,$req_notifylist,$cnum,$now) = @_;      my ($disposition,$req_notifylist,$dom,$cnum,$now,$code,$postprocess) = @_;
     my %emails = &Apache::loncommon::getemails();      my %emails = &Apache::loncommon::getemails();
     my $address;      my $address;
     if (($emails{'permanentemail'} ne '') || ($emails{'notification'} ne '')) {      if (($emails{'permanentemail'} ne '') || ($emails{'notification'} ne '')) {
Line 3821  sub notification_information { Line 4096  sub notification_information {
         }          }
         if ($req_notifylist) {          if ($req_notifylist) {
             my $fullname = &Apache::loncommon::plainname($env{'user.name'},              my $fullname = &Apache::loncommon::plainname($env{'user.name'},
                                                                      $env{'user.domain'});                                                           $env{'user.domain'});
             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'})",
                                                                         'undef',$env{'form.cdescr'},$now,'coursereq',$sender);
           }
           if (ref($postprocess) eq 'HASH') {
               if (ref($postprocess->{'queuedmsg'}) eq 'ARRAY') {
                   if (scalar(@{$postprocess->{'queuedmsg'}}) > 0) {
                       my $recipient = $env{'user.name'}.':'.$env{'user.domain'};
                       my $sender = $recipient;
                       my $addmsg = [];
                       foreach my $item (@{$postprocess->{'queuedmsg'}}) {
                           if (ref($item) eq 'HASH') {
                               if ($item->{'mt'} ne '') {
                                   push(@{$addmsg},$item);
                               }
                           }
                       }
                       if (scalar(@{$addmsg}) > 0) {
                           &Apache::loncoursequeueadmin::send_selfserve_notification($recipient,$addmsg,undef,
                                                                                     $env{'form.cdescr'},$now,
                                                                                     'queuedcrsreq',$sender);
                       }
                   }
               }
               if ($postprocess->{'queuedweb'}) {
                   $output .= $postprocess->{'queuedweb'};
               }
         }          }
     } elsif ($disposition eq 'pending') {      } elsif ($disposition eq 'pending') {
         $output .= '<div class="LC_info">'.          my $pending_default = '<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>';
           if (ref($postprocess) eq 'HASH') {
               if ($postprocess->{'pendingweb'}) {
                   $output .= $postprocess->{'pendingweb'};
               } else {
                   $output .= $pending_default;
               }
           } else {
               $output .= $pending_default;
           }
       } elsif ($disposition eq 'created') {
           if (($code) || ((ref($postprocess) eq 'HASH') && 
               ((ref($postprocess->{'createdmsg'}) eq 'ARRAY') || ($postprocess->{'createdweb'})))) {
               my $addmsg = [];
               my $recipient = $env{'user.name'}.':'.$env{'user.domain'};
               my $sender = $recipient;
               if ($code) {
                   push(@{$addmsg},{
                                     mt   => 'Students can automatically select your course: "[_1]" by entering this code: [_2]',
                                     args => [$env{'form.cdescr'},$code],
                                   });
                   $output .= '<p>'.
                              &mt('Students can automatically select your course by entering this code: [_1].','<b>'.$code.'</b>').
                              '<br />'.
                              &mt('A message has been sent to your LON-CAPA account with this information.');
                   if ($address ne '') {
                       $output.= '<br />'.&mt('An e-mail has also been sent to: [_1] with this code.',$address);
                   }
                   $output .= '</p>';
               }
               if (ref($postprocess) eq 'HASH') {
                   if (ref($postprocess->{'createdmsg'}) eq 'ARRAY') {
                       foreach my $item (@{$postprocess->{'createdmsg'}}) {
                           if (ref($item) eq 'HASH') {
                               if ($item->{'mt'} ne '') {  
                                   push(@{$addmsg},$item);
                               }
                           }
                       }
                   }
                   if ($postprocess->{'createdweb'}) {
                       $output .= $postprocess->{'createdweb'}
                   }
               }
               if (scalar(@{$addmsg}) > 0) {
                   my $type = 'createdcrsreq';
                   if ($code) {
                       $type = 'uniquecode';
                   }
                   &Apache::loncoursequeueadmin::send_selfserve_notification($recipient,$addmsg,$dom.'_'.$cnum,$env{'form.cdescr'},
                                                                             $now,$type,$sender);
               }
           }
     } else {      } else {
         $output .= '<div class="LC_warning">'.          $output .= '<div class="LC_warning">'.
                    &mt('Your request status is: [_1].',$disposition).                     &mt('Your request status is: [_1].',$disposition).
Line 3839  sub notification_information { Line 4191  sub notification_information {
     return $output;      return $output;
 }  }
   
   sub pending_validation_form {
       my ($cdom,$cnum,$crstype,$now,$token,$lonhost,$cdesc) = @_;
       my $output;
       my %postvalues = (
                         'owner'      => $env{'user.name'}.':'.$env{'user.domain'},
                         'course'     => $cdom.'_'.$cnum,
                         'coursetype' => $crstype,
                        );
       my %domconfig = &Apache::lonnet::get_dom('configuration',['requestcourses'],$cdom);
   
       if (ref($domconfig{'requestcourses'}) eq 'HASH') {
           my ($url,$buttontext,$code,@fields);
           if (ref($domconfig{'requestcourses'}{'validation'}) eq 'HASH') {
               $postvalues{'description'} = $cdesc;
               $url = $domconfig{'requestcourses'}{'validation'}{'url'};
               if (ref($domconfig{'requestcourses'}{'validation'}{'fields'}) eq 'ARRAY') {
                   @fields = @{$domconfig{'requestcourses'}{'validation'}{'fields'}};
               }
               $buttontext = $domconfig{'requestcourses'}{'validation'}{'button'};
               $output .= $domconfig{'requestcourses'}{'validation'}{'markup'};
               if (($url =~ m{^(https?\://|/)}) && (@fields > 0)) {
                   $output .= '<form name="crsreqvalidation" action="'.$url.'" method="post">'."\n";
                   foreach my $field (@fields) {
                       if ($postvalues{$field}) {
                           $output .= '<input type="hidden" name="'.$field.'" value="'.$postvalues{$field}.'" />'."\n";
                       }
                   }
                   if ($buttontext eq '') {
                       if ($crstype eq 'community') {
                           $buttontext = &mt('Create community');
                       } else {
                           $buttontext = &mt('Create course');
                       }
                   }
                   my $protocol = $Apache::lonnet::protocol{$lonhost};
                   $protocol = 'http' if ($protocol ne 'https');
                   my $crscreator = $protocol.'://'.&Apache::lonnet::hostname($lonhost).'/cgi-bin/createpending.pl';
                   $output .= '<input type="hidden" name="crscreator" value="'.$crscreator.'" />'."\n".
                              '<input type="hidden" name="token" value="'.$token.'" />'."\n".
                              '<input type="submit" name="validate" value="'.$buttontext.'" />'."\n".
                              '</form>'."\n";
               }
           }
       }
       return $output;
   }
   
 sub check_autolimit {  sub check_autolimit {
     my ($uname,$udom,$dom,$crstype,$limit,$message) = @_;      my ($uname,$udom,$dom,$crstype,$limit,$message) = @_;
     my %crsroles = &Apache::lonnet::get_my_roles($env{'user.name'},$env{'user.domain'},      my %crsroles = &Apache::lonnet::get_my_roles($env{'user.name'},$env{'user.domain'},
Line 4054  sub generate_date_items { Line 4453  sub generate_date_items {
     return;      return;
 }  }
   
   sub print_textbook_form {
       my ($r,$dom,$incdoms,$domdefs,$settings,$can_request) = @_;
       my (%prefab,%ordered,%numprefab);
       my $crstype = 'textbook';
   #
   #  Retrieve list of prefabricated courses (textbook courses and templates) cloneable by user
   #
       foreach my $type ('textbooks','templates') {
           $numprefab{$type} = 0;
           if (ref($settings) eq 'HASH') {
               $prefab{$type} = $settings->{$type};
               if (ref($prefab{$type}) eq 'HASH') {
                   foreach my $item (keys(%{$prefab{$type}})) {
                       my ($clonedom,$clonecrs) = split(/_/,$item);
                       if (ref($prefab{$type}{$item}) eq 'HASH') {
                           if (&Apache::loncoursequeueadmin::can_clone_course($env{'user.name'},
                                             $env{'user.domain'},$clonecrs,$clonedom,$crstype,$dom)) {
   
                               my $num = $prefab{$type}{$item}{'order'};
                               $ordered{$type}{$num} = $item;
                               $numprefab{$type} ++;
                           }
                       }
                   }
               }
           }
       }
   
   #
   # Check if domain has multiple library servers
   #
       my ($home_server_pick,$numlib) =
           &Apache::loncommon::home_server_form_item($dom,'chome',
                                                     'default','hide');
       if ($numlib > 1) {
           $home_server_pick = &mt('Home Server for Course').': '.$home_server_pick.'<br />';
       }
   
   #
   # Retrieve information about courses owned by user, or in which user has an active or future 
   # Course Coordinator role 
   #
       my $numcurrent;
       my %cloneable = &Apache::lonnet::courseiddump($dom,'.',1,'.',$env{'user.name'}.':'.$env{'user.domain'},
                                                 undef,undef,undef,'Course');
       my %ccroles = &Apache::lonnet::get_my_roles($env{'user.name'},$env{'user.domain'},'userroles',
                                                   ['active','future'],['cc']);
       foreach my $role (keys(%ccroles)) {
           my ($cnum,$cdom,$rest) = split(/:/,$role,3);
           unless (exists($cloneable{$cdom.'_'.$cnum})) {
               my %courseinfo = &Apache::lonnet::coursedescription($cdom.'_'.$cnum,{'one_time' => 1});
               $cloneable{$cdom.'_'.$cnum} = \%courseinfo;
           }
       }
   
       my $numcurrent = scalar(keys(%cloneable));
   
       my $jscript = &textbook_request_javascript(\%numprefab,$numcurrent);
       my %loaditems;
       $loaditems{'onload'} = 'javascript:uncheckAllRadio();';
       $r->print(&header('Course Request',$jscript,\%loaditems));
   
       if (ref($can_request) eq 'HASH') {
           unless ((scalar(keys(%{$can_request})) == 1) && ($can_request->{'textbook'})) {
               &Apache::lonhtmlcommon::add_breadcrumb(
                   { href => '/adm/requestcourse',
                     text => 'Pick action',
                   });
           }
       }
       &Apache::lonhtmlcommon::add_breadcrumb({text=>'Course Request'});
       $r->print(&Apache::lonhtmlcommon::breadcrumbs('Course Requests','Course_Requests'));
   
       &startContentScreen($r,'textbookrequests');
   #
   # Show domain selector form, if required.
   #
       if (@{$incdoms} > 1) {
           my $onchange = 'this.form.submit()';
           $r->print('<form name="domforcourse" method="post" action="/adm/requestcourse">'.
                     '<div><fieldset><legend>'.&mt('Domain').'</legend>'.
                     &Apache::loncommon::select_dom_form($dom,'showdom','',1,$onchange,$incdoms).
                     '</fieldset></form>');
       }
   
   #
   # Course request form
   #
   
   #
   # Course Title
   #
       $r->print('<form name="requestcourse" method="post" action="/adm/requestcourse" onsubmit="return validTextbookReq();">'.
                 '<div>'.
                 '<fieldset>'.
                 '<legend>'.&mt('Course Information').'</legend>'.
                 '<span class="LC_nobreak">'.&mt('Title').':&nbsp'.
                 '<input type="text" size="60" name="cdescr" value="" /></span><br />'.
                 $home_server_pick.'<br /></fieldset>'.
                 '</div>');
   
   #
   # Content source selection, if more than one available
   #
       if (keys(%cloneable) || keys(%ordered)) {
           $r->print('<div>'. 
                     '<fieldset><legend>'.&mt('Course Content').'</legend>');
           if (keys(%ordered)) {
               if (ref($ordered{'textbooks'}) eq 'HASH') {
                   $r->print('<span class="LC_nobreak"><label>'.
                             '<input type="radio" name="cloning" value="textbook" onclick="javascript:cloneChoice();" />'.
                             &mt('Load textbook content').'</span>'.('&nbsp;'x2).' ');
               }
               if (ref($ordered{'templates'}) eq 'HASH') {
                   $r->print('<span class="LC_nobreak"><label>'.
                             '<input type="radio" name="cloning" value="template" onclick="javascript:cloneChoice();" />'.
                             &mt('Load pre-existing template').'</span>'.('&nbsp;'x2).' ');
               }
           }
           if (keys(%cloneable)) {
               $r->print('<span class="LC_nobreak"><label>'.
                         '<input type="radio" name="cloning" value="existing" onclick="javascript:cloneChoice();" />'.
                         &mt('Copy one of your courses').'</label></span>'.('&nbsp;'x2).' ');
           }
           $r->print('<span class="LC_nobreak"><label>'.
                     '<input type="radio" name="cloning" value="none" checked="checked" onclick="javascript:cloneChoice();" />'.
                     &mt('Empty course shell').'</label></span>');
       } else {
           $r->print('<input type="hidden" name="cloning" value="none" />');
       }
   
   #
   # Table of cloneable textbook courses
   #
       if (keys(%ordered)) {
           foreach my $type ('textbooks','templates') {
               my $divid = 'showtextbook';
               my $radioid = 'book';
               if ($type eq 'templates') {
                   $divid = 'showtemplate'; 
                   $radioid = 'template';
               }
               if (ref($ordered{$type}) eq 'HASH') {
                   $r->print('<div id="'.$divid.'" style="display:none">'.
                             &Apache::loncommon::start_data_table().
                             &Apache::loncommon::start_data_table_header_row().
                             '<th>'.&mt('Title').'</th>');
                   if ($type eq 'textbooks') {
                       $r->print('<th>'.&mt('Author(s)').'</th>');
                   }
                   $r->print('<th>'.&mt('Subject').'</th>');
                   if ($type eq 'textbooks') {
                       $r->print('<th>'.&mt('Publisher').'</th>'.
                                 '<th>'.&mt('Book').'</th>');
                   }
                   $r->print(&Apache::loncommon::end_data_table_header_row());
                   my @items = sort { $a <=> $b } keys(%{$ordered{$type}});
                   foreach my $num (@items) {
                       my $item = $ordered{$type}{$num};
                       my $cleantitle=&HTML::Entities::encode($prefab{$type}{$item}{'title'},'<>&"');
                       $cleantitle=~s/'/\\'/g;
                       $cleantitle =~ s/^\s+//;
                       $r->print(&Apache::loncommon::start_data_table_row().
                                 '<td><label><input type="radio" name="'.$radioid.'" value="'.$item.'" />'.
                                 $cleantitle.'</label></td>');
                       if ($type eq 'textbooks') {
                            $r->print('<td>'.$prefab{$type}{$item}{'author'}.'</td>');
                       }
                       $r->print('<td>'.$prefab{$type}{$item}{'subject'}.'</td>');
                       if ($type eq 'textbooks') {
                           $r->print('<td>'.$prefab{$type}{$item}{'publisher'}.'</td>'.
                                     '<td><img border="0" src="'.$prefab{$type}{$item}{'image'}.
                                     '" alt="'.$cleantitle.'" /></td>');
                       }
                       $r->print(&Apache::loncommon::end_data_table_row());
                   }
                   $r->print(&Apache::loncommon::end_data_table().
                             '</div>');
               }
           }
       }
   
   #
   # Table of user's current courses (owner and/or course coordinator)
   #
       if (keys(%cloneable)) {
           my %lt = &clone_text();
           $r->print('<div id="showexisting" style="display:none">'.
                     &Apache::loncommon::start_data_table().
                     &Apache::loncommon::start_data_table_header_row().
                     '<th>'.&mt('Title').'</th>'.
                     '<th>'.&mt('Owner/co-owner(s)').'</th>'.
                     &Apache::loncommon::end_data_table_header_row());
           my %allownernames;
           my %sortbytitle; 
           foreach my $cid (sort(keys(%cloneable))) {
               if (ref($cloneable{$cid}) eq 'HASH') {
                   my $cdesc = $cloneable{$cid}{'description'};
                   $cdesc =~ s/`/'/g;
                   if ($cdesc ne '') {
                       push(@{$sortbytitle{$cdesc}},$cid);
                   }
               }
            }
            foreach my $title (sort(keys(%sortbytitle))) {
                if (ref($sortbytitle{$title}) eq 'ARRAY') {
                   foreach my $cid (sort(@{$sortbytitle{$title}})) {
                       my $cleantitle=&HTML::Entities::encode($title,'<>&"');
                       $cleantitle=~s/'/\\'/g;
                       $cleantitle =~ s/^\s+//;
                       my ($namestr,@owners,%ownernames);
                       my $singleowner = $cloneable{$cid}{'internal.courseowner'};
                       push(@owners,$singleowner);
                       if ($cloneable{$cid}{'co-owners'} ne '') {
                           foreach my $item (split(/,/,$cloneable{$cid}{'internal.co-owners'})) {
                               push(@owners,$item);
                           }
                       }
                       foreach my $owner (@owners) {
                           my ($ownername,$ownerdom);
                           if ($owner =~ /:/) {
                               ($ownername,$ownerdom) = split(/:/,$owner);
                           } else {
                               $ownername = $owner;
                               if ($owner ne '') {
                                   $ownerdom = $dom;
                               }
                           }
                           if ($ownername ne '' && $ownerdom ne '') {
                               if (exists($allownernames{$ownername.':'.$ownerdom})) {
                                   $ownernames{$ownername.':'.$ownerdom} = $allownernames{$ownername.':'.$ownerdom}; 
                               } else {
                                   my %namehash=&Apache::loncommon::getnames($ownername,$ownerdom);
                                   $ownernames{$ownername.':'.$ownerdom} = \%namehash;
                                   $allownernames{$ownername.':'.$ownerdom} = $ownernames{$ownername.':'.$ownerdom};
                               }
                           }
                       }
                       my @lastnames;
                       foreach my $owner (keys(%ownernames)) {
                           if (ref($ownernames{$owner}) eq 'HASH') {
                               push(@lastnames,$ownernames{$owner}{'lastname'});
                           }
                       }
                       if (@lastnames) {
                           $namestr = join(', ',sort(@lastnames));
                       }
                       $r->print(&Apache::loncommon::start_data_table_row().
                                 '<td><label><input type="radio" name="owned" value="'.$cid.'" />'.
                                 '&nbsp'.$cleantitle.'</label></td>'.
                                 '<td>'.$namestr.'</td>'.
                                 &Apache::loncommon::end_data_table_row());
                   }
               }
           }
           $r->print(&Apache::loncommon::end_data_table().
                 '<p><input type="radio" name="datemode" value="delete" /> '.$lt{'ncd'}.
                 '</label><br /><label>'.
                 '<input type="radio" name="datemode" value="preserve" /> '.$lt{'prd'}.
                 '</label><br /><label>'.
                 '<input type="radio" name="datemode" value="shift" checked="checked" /> '.
                 $lt{'shd'}.'</label>'.
                 '<input type="text" size="5" name="dateshift" value="365" />'.
                 '</div>');
       }
   #
   # End of content selector
   #
       if (keys(%cloneable) || keys(%ordered)) {
           $r->print('</fieldset></div>');
       }
   
       my %accesstitles = (
                             'start' => 'Default start access',
                              'end'   => 'Default end access',
                          );
       my %help_item = (
                          start => 'Course_Request_Access_Start',
                          end   => 'Course_Request_Access_End',
                       );
       my $starttime = time;
       my $endtime = time+(6*30*24*60*60); # 6 months from now, approx
       my $startform = &Apache::lonhtmlcommon::date_setter('requestcourse','accessstart',
                                                           $starttime,'','','',1,'','','',1);
       my $endform = &Apache::lonhtmlcommon::date_setter('requestcourse','accessend',
                                                         $endtime,'','','',1,'','','',1);
   #
   # Set default start and end dates for student access
   # 
       $r->print('<div>'.
                 '<fieldset><legend>'.&mt('Student Access Dates').'</legend>'.
                 &Apache::loncommon::help_open_topic($help_item{'start'}).
                 '&nbsp;'.&mt($accesstitles{'start'}).$startform.'<br />'.
                 &Apache::loncommon::help_open_topic($help_item{'end'}).
                 '&nbsp;'.&mt($accesstitles{'end'}).$endform.'<br /></div>');
   
   #
   # Display any custom fields for this course type
   #
       my $fullname = &Apache::loncommon::plainname($env{'user.name'},
                                                    $env{'user.domain'});
       my $postprocess = &Apache::lonnet::auto_crsreq_update($dom,undef,$crstype,'review',
                                                             $env{'user.name'},
                                                             $env{'user.domain'},$fullname);
       if (ref($postprocess) eq 'HASH') {
           if ($postprocess->{'reviewweb'}) {
               $r->print($postprocess->{'reviewweb'});
           }
       }
   
   #
   # Submit button
   #
       $r->print('<input type="hidden" name="crstype" value="textbook" />'.
                 '<input type="hidden" name="action" value="process" />'.
                 '<input type="submit" value="'.&mt('Create course').'" />');
   
   #
   # End request form
   #
       $r->print('</form>');
       &endContentScreen($r).
       $r->print(&Apache::loncommon::end_page());
       return;
   }
   
   sub process_textbook_request {
       my ($r,$dom,$action,$domdefs,$domconfig,$can_request) = @_;
       my ($uniquecode,$req_notifylist);
       my $crstype = 'textbook';
       if (ref($domconfig) eq 'HASH') {
           if (ref($domconfig->{'requestcourses'}) eq 'HASH') {
               if (ref($domconfig->{'requestcourses'}{'notify'}) eq 'HASH') {
                   $req_notifylist = $domconfig->{'requestcourses'}{'notify'}{'approval'};
               }
               if (ref($domconfig->{'requestcourses'}{'uniquecode'}) eq 'HASH') {
                   $uniquecode = $domconfig->{'requestcourses'}{'uniquecode'}{$crstype};
               }
           }
       }
       my $now = time;
       my $reqtype = $env{'form.cloning'};
       my (@inststatuses,$storeresult,$creationresult);
       my $cnum = &Apache::lonnet::generate_coursenum($dom,'Course');
       my ($clonefrom,$clonedom,$clonecrs);
       if ($reqtype eq 'textbook') {
           $clonefrom = $env{'form.book'};
       } elsif ($reqtype eq 'template') {
           $clonefrom = $env{'form.template'};
       } elsif ($reqtype eq 'existing') {
           $clonefrom = $env{'form.owned'};
       }
       my ($accessstart,$accessend) = &dates_from_form('accessstart','accessend');
       if ($clonefrom) {
           ($clonedom,$clonecrs) = split(/_/,$clonefrom);
           if (&Apache::lonnet::homeserver($clonecrs,$clonedom) ne 'no_host') {
               my $canclone =
                   &Apache::loncoursequeueadmin::can_clone_course($env{'user.name'},
                               $env{'user.domain'},$clonecrs,$clonedom,$crstype,$dom);
               unless ($canclone) {
                   undef($clonecrs);
                   undef($clonedom);
               }
           } else {
               undef($clonecrs);
               undef($clonedom);
           }
       }
       my $js = &processing_javascript();
       my $loaditems = { 
                         onload => 'javascript:hideProcessing();',
                       };
       $r->print(&header('Course Creation',$js,$loaditems));
   
       if (ref($can_request) eq 'HASH') {
           unless ((scalar(keys(%{$can_request})) == 1) && ($can_request->{'textbook'})) {
               &Apache::lonhtmlcommon::add_breadcrumb(
                   { href => '/adm/requestcourse',
                     text => 'Pick action',
                   });
           }
       }
       &Apache::lonhtmlcommon::add_breadcrumb(
                                              { href => '/adm/requestcourse',
                                                text => "Create Course",
                                              }
                                             );
       &Apache::lonhtmlcommon::add_breadcrumb({text=>'Request Processed'});
       $r->print(&Apache::lonhtmlcommon::breadcrumbs('Course Requests','Course_Requests'));
       &startContentScreen($r,'textbookrequests');
   
       my $details = {
                       owner          => $env{'user.name'},
                       domain         => $env{'user.domain'},
                       cdom           => $dom,
                       cnum           => $cnum,
                       coursehome     => $env{'form.chome'},
                       cdescr         => $env{'form.cdescr'},
                       crstype        => $crstype,
                       uniquecode     => $uniquecode,
                       clonedom       => $clonedom,
                       clonecrs       => $clonecrs,
                       accessstart    => $accessstart,
                       accessend      => $accessend,
                       personnel      => {},
                     };
       if ($reqtype eq 'existing') {
           $details->{datemode} = $env{'form.datemode'};
           $details->{dateshift} = $env{'form.dateshift'};
       }
       my $lonhost = $r->dir_config('lonHostID');
       $r->rflush();
       my ($result,$output) = &process_request($r,$lonhost,$dom,$cnum,$crstype,$now,$details,'',
                                               $req_notifylist,[],$domconfig);
       $r->print($output);
       if (&Apache::loncoursequeueadmin::author_prompt()) {
           &print_author_prompt($r,$action,$cnum,$dom,$crstype,$result);
       } elsif ($result eq 'created') {
           $r->print('<p><a href="/adm/requestcourse">'.&mt('Create another course').'</a></p>');
       }
       &endContentScreen($r);
       $r->print(&Apache::loncommon::end_page());
   }
   
   sub textbook_request_javascript {
       my ($numprefab,$numcurrent) = @_;
       return unless (ref($numprefab) eq 'HASH');
       return if (!$numprefab->{'textbooks'} && !$numprefab->{'templates'} && !$numcurrent);
       my %lt = &Apache::lonlocal::texthash(
                    choose   => 'Please select a content option.',
                    textbook => 'Please select a textbook, or choose a different option.',
                    template => 'Please select a template, or choose a different option.',        
                    existing => 'Please select one of your existing courses to copy, or choose a different option.',
                    title    => 'Please enter a course title.',
                );
       return <<"ENDSCRIPT";
   function cloneChoice() {
       if (document.requestcourse.cloning) {
           var radioLength = document.requestcourse.cloning.length;
           if (radioLength == undefined) {
               var val = document.requestcourse.cloning.value;
               if ((val == 'textbook') || (val == 'template') || (val == 'existing')) {
                   var elem = document.getElementById('show'+val);
                   if (document.requestcourse.cloning.checked) {
                       elem.style.display = 'block';
                   } else {
                       uncheckRadio(val);
                       elem.style.display = 'none';
                   }
               }
           } else {
               for (var i=0; i<radioLength; i++) {
                   var val = document.requestcourse.cloning[i].value;
                   if ((val == 'textbook') || (val == 'template') || (val == 'existing')) {
                       var elem = document.getElementById('show'+val);
                       if (document.requestcourse.cloning[i].checked) {
                           elem.style.display = 'block';
                       }  else {
                           if (val == 'textbook') {
                               uncheckRadio('book');
                           }
                           if (val == 'template') {
                               uncheckRadio('template');
                           }
                           if (val == 'existing') {
                               uncheckRadio('owned');
                           }
                           elem.style.display = 'none';
                       }
                   }
               }
           }
       }
       return;
   }
   
   function uncheckRadio(radioGroupName) {
       var group = document.getElementsByName(radioGroupName);
       var radioLength = group.length;
       if (radioLength == undefined) {
           group.checked = false;
       } else {
           for (var i=0; i<radioLength; i++) {
               group[i].checked = false;
           }
       }
       return;
   }
   
   function uncheckAllRadio() {
       uncheckRadio('cloning');
       var numbook = $numprefab->{'textbooks'};
       var numtemplate = $numprefab->{'templates'};
       var numcurrent = $numcurrent;
       if (numbook > 0) {
           uncheckRadio('textbook'); 
       }
       if (nutemplate > 0) {
           uncheckRadio('template');
       }m
       if (numcurrent > 0) {
           uncheckRadio('existing');
       }
       return;
   }
   
   function validTextbookReq() {
       if (document.requestcourse.cloning) {
           var cloneChoice = 0;
           var radioLength = document.requestcourse.cloning.length;
           if (radioLength == undefined) {
               if (document.requestcourse.cloning.checked == false) {
                   alert("$lt{'choose'}");
                   return false;
               } else {
                   cloneChoice = document.requestcourse.cloning.value;
               }
           } else {
               for (var i=0; i<radioLength; i++) {
                   if (document.requestcourse.cloning[i].checked) {
                       cloneChoice = document.requestcourse.cloning[i].value;
                       break;
                   }
               }
               if (cloneChoice == 0) {
                   alert("$lt{'choose'}");
                   return false;
               }
           }
           var group;
           if ((cloneChoice == 'textbook') || (cloneChoice == 'template') || (cloneChoice == 'existing')) {
               var group;
               if (cloneChoice == 'textbook') {
                   group = document.getElementsByName('book');
               } else {
                   if (cloneChoice == 'template') {
                       group = document.getElementsByName('template');
                   } else {
                       group = document.getElementsByName('owned');
                   }
               }
               var groupLength = group.length;
               var chosen = 0;
               if (groupLength == undefined) {
                   if (group.checked) {
                       chosen = 1;
                   }
               } else {
                   for (var j=0; j<groupLength; j++) {
                       if (group[j].checked) {
                           chosen = 1;
                           break;
                       }
                   }
              }
              if (chosen == 0) {
                  if (cloneChoice == 'textbook') {
                      alert("$lt{'textbook'}");
                  } else {
                      if (cloneChoice == 'template') {
                          alert("$lt{'template'}");
                      } else {
                          alert("$lt{'existing'}");
                      }
                  }
                  return false;
               }
           }
       }
       if (document.requestcourse.cdescr.value == '') {
           alert("$lt{'title'}");
           return false;
       }
       return true;
   }
    
   ENDSCRIPT
   
   }
   
   sub textbook_request_disabled {
       my ($r,$dom,$action,$can_request) = @_;
       if (ref($can_request) eq 'HASH') {
           if ($action eq 'process') {
               unless ((scalar(keys(%{$can_request})) == 1)) {
                   &Apache::lonhtmlcommon::add_breadcrumb(
                      { href => '/adm/requestcourse',
                        text => 'Pick action',
                      });
               }
           }
       }
       $r->print(&header('Course Request'));
       &Apache::lonhtmlcommon::add_breadcrumb({text=>'Course Request'});
       $r->print(&Apache::lonhtmlcommon::breadcrumbs('Course Requests','Course_Requests').
                 '<div>'.
                 '<p class="LC_info">'.&mt('You do not have privileges to request creation of textbook courses.').'</p>');
       if (ref($can_request) eq 'HASH') {
           if (scalar(keys(%{$can_request})) > 1) {
               $r->print('<a href="/adm/requestcourse">'.&mt('Go back').'</a>');
            }
       }
       $r->print('</div>'.
                 &Apache::loncommon::end_page());
       return;
   }
   
   sub startContentScreen {
       my ($r,$mode)=@_;
       $r->print("\n".'<ul class="LC_TabContentBigger" id="textbookreq">'."\n");
       $r->print('<li'.(($mode eq 'textbookrequests')?' class="active"':'').'><a href="/adm/requestcourse"><b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'.&mt('Request a Course').'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</b></a></li>'."\n");
       $r->print('<li'.(($mode eq 'textbooklogs')?' class="active"':'').'><a href="/adm/requestcourse?action=log&amp;crstype=textbook&amp;tabs=on"><b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'.&mt('Course Request History').'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</b></a></li>'."\n");
       $r->print("\n".'</ul>'."\n");
       $r->print('<div class="LC_Box" style="clear:both;margin:0;"><div id="mainbox" style="margin:0 0;padding:0 0;"><div class="LC_ContentBox" id="maincontentbox" style="display: block;">');
   }
   
   sub endContentScreen {
      my ($r)=@_;
      $r->print('</div></div></div>');
   }
      
 1;  1;
   

Removed from v.1.69  
changed lines
  Added in v.1.87


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>
500 Internal Server Error

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.