Diff for /loncom/interface/loncreatecourse.pm between versions 1.158.2.8.2.1 and 1.159

version 1.158.2.8.2.1, 2021/12/31 01:31:35 version 1.159, 2016/04/04 01:09:48
Line 80  use Apache::loncommon; Line 80  use Apache::loncommon;
 use Apache::londocs;  use Apache::londocs;
 use Apache::lonlocal;  use Apache::lonlocal;
 use Apache::lonuserutils;  use Apache::lonuserutils;
   use Apache::lonclonecourse;
 use LONCAPA::batchcreatecourse;  use LONCAPA::batchcreatecourse;
 use LONCAPA qw(:DEFAULT :match);  use LONCAPA;
   
 my $registered_flush;  
 my $registered_instcats;  
 my $modified_dom;  
   
 # ===================================================== Phase one: fill-in form  # ===================================================== Phase one: fill-in form
   
Line 94  sub print_course_creation_page { Line 91  sub print_course_creation_page {
     my $crstype = 'Community';      my $crstype = 'Community';
     if ($env{'form.phase'} eq 'courseone') {      if ($env{'form.phase'} eq 'courseone') {
         $crstype = 'Course';          $crstype = 'Course';
       } elsif ($env{'form.phase'} eq 'placementone') {
           $crstype = 'Placement';
     }      }
     my $defdom=$env{'request.role.domain'};      my $defdom=$env{'request.role.domain'};
     my %domdefaults = &Apache::lonnet::get_domain_defaults($defdom);      my %domdefaults = &Apache::lonnet::get_domain_defaults($defdom);
Line 102  sub print_course_creation_page { Line 101  sub print_course_creation_page {
     foreach my $server (sort(keys(%host_servers))) {      foreach my $server (sort(keys(%host_servers))) {
         $course_home .= qq{<option value="$server"};          $course_home .= qq{<option value="$server"};
         if ($server eq $Apache::lonnet::perlvar{'lonHostID'}) {          if ($server eq $Apache::lonnet::perlvar{'lonHostID'}) {
             $course_home .= ' selected="selected"';              $course_home .= " selected ";
         }          }
         $course_home .= qq{>$server $host_servers{$server}</option>};          $course_home .= qq{>$server $host_servers{$server}</option>};
     }      }
Line 119  sub print_course_creation_page { Line 118  sub print_course_creation_page {
     my $endtime = time+(6*30*24*60*60); # 6 months from now, approx      my $endtime = time+(6*30*24*60*60); # 6 months from now, approx
     my $access_table = &Apache::lonuserutils::date_setting_table($starttime,      my $access_table = &Apache::lonuserutils::date_setting_table($starttime,
                                              $endtime,'create_defaultdates');                                               $endtime,'create_defaultdates');
     my $openallfrom =  
         &Apache::lonhtmlcommon::date_setter('ccrs','openallfrom',$starttime);  
     if ($crstype eq 'Course') {      if ($crstype eq 'Course') {
         $enroll_table = &Apache::lonuserutils::date_setting_table($starttime,          $enroll_table = &Apache::lonuserutils::date_setting_table($starttime,
                                               $endtime,'create_enrolldates');                                                $endtime,'create_enrolldates');
Line 135  sub print_course_creation_page { Line 132  sub print_course_creation_page {
         $krbform = &Apache::loncommon::authform_kerberos(%param);          $krbform = &Apache::loncommon::authform_kerberos(%param);
         $intform = &Apache::loncommon::authform_internal(%param);          $intform = &Apache::loncommon::authform_internal(%param);
         $locform = &Apache::loncommon::authform_local(%param);          $locform = &Apache::loncommon::authform_local(%param);
     } else {      } elsif ($crstype eq 'Community') {
         my $title_alert = &mt('A Community title is required');          my $title_alert = &mt('A Community title is required');
         my $coord_alert = &mt('The username of the Coordinator is required');          my $coord_alert = &mt('The username of the Coordinator is required');
         &js_escape(\$title_alert);          &js_escape(\$title_alert);
Line 152  function validate(formname) { Line 149  function validate(formname) {
     formname.submit();      formname.submit();
 }  }
         |;          |;
       } else {
           my $title_alert = &mt('A Placement Test title is required');
           my $coord_alert = &mt('The username of the Course Coordinator is required');
           &js_escape(\$title_alert);
           &js_escape(\$coord_alert);
           $javascript_validations = qq|
   function validate(formname) {
       if (formname.title == '') {
           alert("$title_alert");
           return;
       }
       if (formname.ccuname == '') {
           alert("$coord_alert");
       }
       formname.submit();
   }
           |;
           
     }      }
     my %lt=&Apache::lonlocal::texthash(      my %lt=&Apache::lonlocal::texthash(
     'cinf' => "Course Information",      'cinf' => "Course Information",
Line 188  function validate(formname) { Line 203  function validate(formname) {
                     'ncd'  => "Do not clone date parameters",                      'ncd'  => "Do not clone date parameters",
                     'prd'  => 'Clone date parameters as-is',                      'prd'  => 'Clone date parameters as-is',
                     'shd'  => 'Shift date parameters by number of days',                      'shd'  => 'Shift date parameters by number of days',
                     'dpl'  => 'URL shortcuts (for deep linking)',  
                     'nsl'  => 'Do not clone URL shortcuts',  
                     'tsl'  => 'Transfer URL shortcuts from existing course to new course',  
                     'csl'  => 'Create new URL shortcuts in new course',  
                     'assp' => "Assessment Parameters",                      'assp' => "Assessment Parameters",
                     'oaas' => "Open all assessments",                      'oaas' => "Open all assessments",
                     'sta'  => "starting from:",  
                     'mssg' => "Messaging",                      'mssg' => "Messaging",
                     'scpf' => "Set course policy feedback to Course Coordinator",                      'scpf' => "Set course policy feedback to Course Coordinator",
                     'scfc' => "Set resource content feedback to Course Coordinator",                      'scfc' => "Set content feedback to Course Coordinator",
                     'scof' => "Set course content feedback to Course Coordinator",  
                     'cmmn' => "Communication",                      'cmmn' => "Communication",
                     'dsrd' => "Disable student resource discussion",                      'dsrd' => "Disable student resource discussion",
                     'dsuc' => "Disable student use of chat rooms",                      'dsuc' => "Disable student use of chat rooms",
Line 244  function validate(formname) { Line 253  function validate(formname) {
         $lt{'navi'} = &mt('Community Contents');          $lt{'navi'} = &mt('Community Contents');
         $lt{'cid'}  = &mt('Community ID');          $lt{'cid'}  = &mt('Community ID');
         $lt{'scpf'} = &mt('Set community policy feedback to Coordinator');          $lt{'scpf'} = &mt('Set community policy feedback to Coordinator');
         $lt{'scfc'} = &mt('Set resource content feedback to Coordinator');          $lt{'scfc'} = &mt('Set content feedback to Coordinator');
         $lt{'scof'} = &mt('Set community content feedback to Coordinator');  
         $lt{'dsrd'} = &mt('Disable member resource discussion');          $lt{'dsrd'} = &mt('Disable member resource discussion');
         $lt{'dsuc'} = &mt('Disable member use of chat rooms');          $lt{'dsuc'} = &mt('Disable member use of chat rooms');
         $lt{'dads'} = &mt('Default Access Dates for Members');          $lt{'dads'} = &mt('Default Access Dates for Members');
Line 256  function validate(formname) { Line 264  function validate(formname) {
         $lt{'cc'}  = &mt('(will be assigned Coordinator role)');          $lt{'cc'}  = &mt('(will be assigned Coordinator role)');
         $lt{'cgrs'} = &mt('Community Group Settings');          $lt{'cgrs'} = &mt('Community Group Settings');
         $lt{'cgrq'} = &mt('Set a quota for the total disk space available for storage of community group portfolio files');          $lt{'cgrq'} = &mt('Set a quota for the total disk space available for storage of community group portfolio files');
         $lt{'tsl'} = &mt('Transfer URL shortcuts from existing community to new community');      } elsif ($crstype eq 'Placement') {
         $lt{'csl'} = &mt('Create new URL shortcuts in new community');          $lt{'cinf'} = &mt('Placement Test Information');
           $lt{'ctit'} = &mt('Placement Test Title');
           $lt{'chsr'} = &mt('Placement Test Home Server');
           $lt{'cidn'} = &mt('Placement Test ID/Number');
           $lt{'crco'} = &mt('Placement Test Content');
           $lt{'cncr'} = &mt('Completely new placement test');
           $lt{'cecr'} = &mt('Clone an existing placement test');
           $lt{'sacr'} = &mt('Do NOT generate as standard placement test');
           $lt{'stco'} = &mt('standard placement tests only');
           $lt{'navi'} = &mt('Placement Test Contents');
           $lt{'cid'}  = &mt('Placement Test ID');
     }      }
     my $js = <<END;      my $js = <<END;
 <script type="text/javascript">  <script type="text/javascript">
 // <![CDATA[  
   
 var editbrowser = null;  var editbrowser = null;
 function openbrowser(formname,elementname) {  function openbrowser(formname,elementname) {
     var url = '/res/?';      var url = '/res/?';
Line 281  function openbrowser(formname,elementnam Line 297  function openbrowser(formname,elementnam
     editbrowser.focus();      editbrowser.focus();
 }  }
 $javascript_validations  $javascript_validations
   
 // ]]>  
 </script>  </script>
 $coursebrowserjs  $coursebrowserjs
 END  END
Line 290  END Line 304  END
     my %titles = &Apache::lonlocal::texthash(      my %titles = &Apache::lonlocal::texthash(
                   courseone => 'Create a New Course',                    courseone => 'Create a New Course',
                   groupone => 'Create a New Community',                    groupone => 'Create a New Community',
                     placementone=> 'Create a New Placement Test',
     );        );  
     my $start_page =       my $start_page = 
         &Apache::loncommon::start_page($titles{$env{'form.phase'}},$js);          &Apache::loncommon::start_page($titles{$env{'form.phase'}},$js);
Line 301  END Line 316  END
     'Create_Courses');      'Create_Courses');
     $r->print($start_page.$crumbs);      $r->print($start_page.$crumbs);
   
     $r->print('<form action="/adm/createcourse" method="post" name="ccrs"><div class="LC_createcourse">'      $r->print('<form action="/adm/createcourse" method="post" name="ccrs" action=""><div class="LC_createcourse">'
              .&Apache::lonhtmlcommon::start_pick_box()               .&Apache::lonhtmlcommon::start_pick_box()
   
              .&Apache::lonhtmlcommon::row_headline()               .&Apache::lonhtmlcommon::row_headline()
Line 368  END Line 383  END
                      .'<span class="LC_nobreak">'                       .'<span class="LC_nobreak">'
                      .'<input type="radio" name="uniquecode" value="1" />'.&mt('Yes').('&nbsp;'x2)                       .'<input type="radio" name="uniquecode" value="1" />'.&mt('Yes').('&nbsp;'x2)
                      .'<input type="radio" name="uniquecode" value="0" checked="checked" />'.&mt('No')                       .'<input type="radio" name="uniquecode" value="0" checked="checked" />'.&mt('No')
                      .'</span>'  
                      .&Apache::lonhtmlcommon::row_closure()                       .&Apache::lonhtmlcommon::row_closure()
             );                   );
       }
       my $blankchk;
       if ($crstype eq 'Placement') {
           $blankchk = ' checked="checked"';
     }      }
     # Table: New Course / Clone Course      # Table: New Course / Clone Course
     $r->print(&Apache::lonhtmlcommon::row_headline()      $r->print(&Apache::lonhtmlcommon::row_headline()
Line 396  END Line 414  END
                  .&Apache::lonhtmlcommon::row_closure()                   .&Apache::lonhtmlcommon::row_closure()
                  .&Apache::lonhtmlcommon::row_title($lt{'fres'})                   .&Apache::lonhtmlcommon::row_title($lt{'fres'})
                  .'<label>'                   .'<label>'
                  .'<input type="radio" name="firstres" value="blank" />'.$lt{'blnk'}                   .'<input type="radio" name="firstres" value="blank"'.$blankchk.' />'.$lt{'blnk'}
                  .'</label>'                   .'</label>');
                  .'&nbsp;');  
     if ($crstype eq 'Community') {      if ($crstype eq 'Community') {
         $r->print('<label>'          $r->print('&nbsp;<label>'
                  .'<input type="radio" name="firstres" value="nav" checked="checked" />'.$lt{'navi'}                   .'<input type="radio" name="firstres" value="nav" checked="checked" />'.$lt{'navi'}
                  .'</label>');                   .'</label>');
     } else {      } elsif ($crstype eq 'Course') {
         $r->print('<label>'          $r->print('&nbsp;<label>'
                  .'<input type="radio" name="firstres" value="syl" checked="checked" />'.$lt{'sllb'}                   .'<input type="radio" name="firstres" value="syl" checked="checked" />'.$lt{'sllb'}
                  .'</label>'                   .'</label>'
                  .'&nbsp;'                   .'&nbsp;'
Line 412  END Line 429  END
                  .'<input type="radio" name="firstres" value="nav" />'.$lt{'navi'}                   .'<input type="radio" name="firstres" value="nav" />'.$lt{'navi'}
                  .'</label>');                   .'</label>');
     }      }
     my $tinyurlhelp=&Apache::loncommon::help_open_topic('Clone_Tiny_URLs');  
     $r->print('<br />('.$lt{'stco'}.')'      $r->print('<br />('.$lt{'stco'}.')'
                  .&Apache::lonhtmlcommon::row_closure(1)                   .&Apache::lonhtmlcommon::row_closure(1)
                  .&Apache::lonhtmlcommon::end_pick_box()                   .&Apache::lonhtmlcommon::end_pick_box()
   
                  .'</td><td>&nbsp;</td>'                   .'<td>&nbsp;</td>'
   
                  # Clone Course:                   # Clone Course:
                  .'<td>'                   .'<td>'
Line 442  END Line 458  END
                  .'<label>'                   .'<label>'
                  .'<input type="radio" name="datemode" value="shift" checked="checked" /> '.$lt{'shd'}                   .'<input type="radio" name="datemode" value="shift" checked="checked" /> '.$lt{'shd'}
                  .'</label>'                   .'</label>'
                  .' <input type="text" size="5" name="dateshift" value="364" />'                   .' <input type="text" size="5" name="dateshift" value="365" />'
                  .&Apache::lonhtmlcommon::row_closure()  
                  .&Apache::lonhtmlcommon::row_title($tinyurlhelp.$lt{'dpl'})  
                  .'<label>'  
                  .'<input type="radio" name="tinyurls" value="delete" /> '.$lt{'nsl'}  
                  .'</label><br />'  
                  .'<label>'  
                  .'<input type="radio" name="tinyurls" value="transfer" /> '.$lt{'tsl'}  
                  .'</label><br />'  
                  .'<label>'  
                  .'<input type="radio" name="tinyurls" value="create" checked="checked" /> '.$lt{'csl'}  
                  .'</label>'  
                  .&Apache::lonhtmlcommon::row_closure()                   .&Apache::lonhtmlcommon::row_closure()
                  .&Apache::lonhtmlcommon::row_headline()                   .&Apache::lonhtmlcommon::row_headline()
                  .'<span class="LC_info">'.$lt{'asov'}.'</span>'                   .'<span class="LC_info">'.$lt{'asov'}.'</span>'
Line 478  END Line 483  END
                  .&Apache::lonhtmlcommon::row_closure()                   .&Apache::lonhtmlcommon::row_closure()
   
                  .&Apache::lonhtmlcommon::row_title($lt{'oaas'})                   .&Apache::lonhtmlcommon::row_title($lt{'oaas'})
                  .'<span class="LC_nobreak">'                   .'<input type="checkbox" name="openall" />'
                  .'<label><input type="radio" name="openall" value="0" checked="checked" />'.$lt{'no'}.'</label>'.('&nbsp;'x2)  
                  .'<label><input type="radio" name="openall" value="1" />'.$lt{'yes'}.'</label>'.',&nbsp;'  
                  .$lt{'sta'}.'&nbsp;'.$openallfrom.'</span>'  
                  .&Apache::lonhtmlcommon::row_closure()                   .&Apache::lonhtmlcommon::row_closure()
   
                  .&Apache::lonhtmlcommon::row_headline()                   .&Apache::lonhtmlcommon::row_headline()
Line 496  END Line 498  END
                  .'<input type="checkbox" name="setcontent" checked="checked" />'                   .'<input type="checkbox" name="setcontent" checked="checked" />'
                  .&Apache::lonhtmlcommon::row_closure()                   .&Apache::lonhtmlcommon::row_closure()
   
                  .&Apache::lonhtmlcommon::row_title($lt{'scof'})  
                  .'<input type="checkbox" name="setcomment" checked="checked" />'  
                  .&Apache::lonhtmlcommon::row_closure()  
   
                  .&Apache::lonhtmlcommon::row_headline()                   .&Apache::lonhtmlcommon::row_headline()
                  .'<h3>'.$lt{'cmmn'}.'</h3>'                   .'<h3>'.$lt{'cmmn'}.'</h3>'
                  .&Apache::lonhtmlcommon::row_closure()                   .&Apache::lonhtmlcommon::row_closure()
Line 595  END Line 593  END
 <p>  <p>
 <input type="hidden" name="prevphase" value="courseone" />  <input type="hidden" name="prevphase" value="courseone" />
 <input type="hidden" name="phase" value="coursetwo" />  <input type="hidden" name="phase" value="coursetwo" />
 <input type="button" onclick="verify_message(this.form)" value="'.$lt{'opco'}.'" />  <input type="button" onclick="verify_message(this.form)" value="'.$lt{'opco'}.'" />'
 </p>'  
         );          );
     } elsif ($crstype eq 'Community') {      } elsif ($crstype eq 'Community') {
         $r->print('          $r->print('
Line 606  END Line 603  END
 <input type="submit" value="'.$lt{'opcm'}.'" />  <input type="submit" value="'.$lt{'opcm'}.'" />
 </p>'  </p>'
         );          );
       } elsif ($crstype eq 'Placement') {
           $r->print('
   <p>
   <input type="hidden" name="prevphase" value="placementone" />
   <input type="hidden" name="phase" value="placementtwo" />
   <input type="submit" value="'.$lt{'opcm'}.'" />
   </p>'
           );
     }      }
     $r->print('</form>'.      $r->print('</form>'.
               $end_page);                $end_page);
Line 618  sub create_course { Line 623  sub create_course {
     my $ccuname =&LONCAPA::clean_username($env{'form.ccuname'});      my $ccuname =&LONCAPA::clean_username($env{'form.ccuname'});
     my $ccdomain=&LONCAPA::clean_domain($env{'form.ccdomain'});      my $ccdomain=&LONCAPA::clean_domain($env{'form.ccdomain'});
     my $crstype = 'Community';      my $crstype = 'Community';
     my ($enrollstart,$enrollend,$startaccess,$endaccess,$openallfrom);      my ($enrollstart,$enrollend,$startaccess,$endaccess);
     my %domdefaults =       my %domdefaults = 
         &Apache::lonnet::get_domain_defaults($env{'request.role.domain'});          &Apache::lonnet::get_domain_defaults($env{'request.role.domain'});
   
Line 626  sub create_course { Line 631  sub create_course {
         $crstype='Course';          $crstype='Course';
         $enrollstart=&Apache::lonhtmlcommon::get_date_from_form('startenroll');          $enrollstart=&Apache::lonhtmlcommon::get_date_from_form('startenroll');
         $enrollend=&Apache::lonhtmlcommon::get_date_from_form('endenroll');          $enrollend=&Apache::lonhtmlcommon::get_date_from_form('endenroll');
       } elsif ($env{'form.phase'} eq 'placementtwo') {
           $crstype='Placement';
     }      }
     $startaccess = &Apache::lonhtmlcommon::get_date_from_form('startaccess');      $startaccess = &Apache::lonhtmlcommon::get_date_from_form('startaccess');
     $endaccess   = &Apache::lonhtmlcommon::get_date_from_form('endaccess');      $endaccess   = &Apache::lonhtmlcommon::get_date_from_form('endaccess');
     $openallfrom = &Apache::lonhtmlcommon::get_date_from_form('openallfrom');  
   
     my $autharg;      my $autharg;
     my $authtype;      my $authtype;
Line 670  sub create_course { Line 676  sub create_course {
                clonedomain => $env{'form.clonedomain'},                 clonedomain => $env{'form.clonedomain'},
                datemode => $env{'form.datemode'},                 datemode => $env{'form.datemode'},
                dateshift => $env{'form.dateshift'},                 dateshift => $env{'form.dateshift'},
                tinyurls  => $env{'form.tinyurls'},  
                crsid => $env{'form.crsid'},                 crsid => $env{'form.crsid'},
                curruser => $env{'user.name'}.':'.$env{'user.domain'},                 curruser => $env{'user.name'}.':'.$env{'user.domain'},
                crssections => $env{'form.crssections'},                 crssections => $env{'form.crssections'},
Line 689  sub create_course { Line 694  sub create_course {
                endaccess => $endaccess,                 endaccess => $endaccess,
                setpolicy => $env{'form.setpolicy'},                 setpolicy => $env{'form.setpolicy'},
                setcontent => $env{'form.setcontent'},                 setcontent => $env{'form.setcontent'},
                setcomment => $env{'form.setcomment'},  
                reshome => $env{'form.reshome'},                 reshome => $env{'form.reshome'},
                setkeys => $env{'form.setkeys'},                 setkeys => $env{'form.setkeys'},
                keyauth => $env{'form.keyauth'},                 keyauth => $env{'form.keyauth'},
                disresdis => $env{'form.disresdis'},                 disresdis => $env{'form.disresdis'},
                disablechat => $env{'form.disablechat'},                 disablechat => $env{'form.disablechat'},
                openall => $env{'form.openall'},                 openall => $env{'form.openall'},
                openallfrom => $openallfrom,  
                firstres => $env{'form.firstres'}                 firstres => $env{'form.firstres'}
                };                 };
   
Line 738  sub create_course { Line 741  sub create_course {
         return;          return;
     }      }
     my ($courseid,$crsudom,$crsunum,$code);      my ($courseid,$crsudom,$crsunum,$code);
     my ($success,$output,$clonemsgref) =       my ($success,$output) = 
  &Apache::loncommon::construct_course($args,\$logmsg,\$courseid,   &Apache::loncommon::construct_course($args,\$logmsg,\$courseid,
      \$crsudom,\$crsunum,       \$crsudom,\$crsunum,
      $env{'user.domain'},       $env{'user.domain'},
      $env{'user.name'},'dc_create',undef,undef,\$code);       $env{'user.name'},'dc_create',undef,undef,\$code);
     $r->print($output);      $r->print($output);
     if (ref($clonemsgref) eq 'ARRAY') {  
         my $user_lh = &Apache::loncommon::user_lang($env{'user.name'},$env{'user.domain'});  
         foreach my $item (@{$clonemsgref}) {  
             if (ref($item) eq 'HASH') {  
                 $r->print(&mt($item->{mt},@{$item->{args}}).'<br />'."\n");  
             }  
         }  
     }  
     if ($success) {      if ($success) {
         #          #
  # Make the requested user a course coordinator or group coordinator   # Make the requested user a course coordinator or group coordinator
Line 775  sub create_course { Line 770  sub create_course {
                       '<p>'.&mt('Course identifier to share with students: [_1]',$code).'</p>'                        '<p>'.&mt('Course identifier to share with students: [_1]',$code).'</p>'
                      );                       );
         }          }
         if ($env{'form.crscode'} ne '') {          # Flush the course logs so reverse user roles immediately updated
             &Apache::lonnet::devalidate_cache_new('instcats',$crsudom);   $r->register_cleanup(\&Apache::lonnet::flushcourselogs);
         }  
         &register_cleanups($r,$crsudom,$env{'form.crscode'});  
  $r->print('<p>'.&mt('Roles will be active at next login').'.</p>');   $r->print('<p>'.&mt('Roles will be active at next login').'.</p>');
     }      }
     $r->print('<p><a href="/adm/createcourse?phase='.lc($crstype).'one">'.      $r->print('<p><a href="/adm/createcourse?phase='.lc($crstype).'one">'.
Line 787  sub create_course { Line 780  sub create_course {
 }  }
   
 sub print_intro_page {  sub print_intro_page {
     my ($r,$show_all_choices,$cancreate,$permission) = @_;      my ($r,$show_all_choices,$cancreate) = @_;
     my $start_page =      my $start_page =
         &Apache::loncommon::start_page('Create a New Course or Community');          &Apache::loncommon::start_page('Create a New Course, Community or Placement Test');
     my $crumbs = &Apache::lonhtmlcommon::breadcrumbs('Creation Options','Create_Course',undef,'Create_Courses');      my $crumbs = &Apache::lonhtmlcommon::breadcrumbs('Creation Options','Create_Course',undef,'Create_Courses');
     my $end_page =      my $end_page =
         &Apache::loncommon::end_page();          &Apache::loncommon::end_page();
     my $helplink=&Apache::loncommon::help_open_topic('Create_Course_Community',&mt('Help on Creating Courses and Communities'));      my $helplink=&Apache::loncommon::help_open_topic('Create_Course_Community',&mt('Help on Creating Courses and Communities'));
   
     # Create menu      # Create menu
     my $approve = 'Display requests awaiting approval';  
     if ($permission->{'create'}) {  
         $approve = 'Approve or reject requests';  
     }  
     my @menu;      my @menu;
     @menu =      @menu =
        ({ categorytitle => 'Course/Community Creation',         ({ categorytitle => 'Course/Community Creation',
Line 807  sub print_intro_page { Line 796  sub print_intro_page {
           {            {
                linktext => 'Create a single course',                 linktext => 'Create a single course',
                url => '/adm/createcourse?phase=courseone',                 url => '/adm/createcourse?phase=courseone',
                permission => $permission->{'create'},                 permission => 1,
                #help => '',                 #help => '',
                icon => 'crsnew.png',                 icon => 'crsnew.png',
                linktitle => 'Create a new course by completing an online form.'                 linktitle => 'Create a new course by completing an online form.'
Line 815  sub print_intro_page { Line 804  sub print_intro_page {
           {            {
                linktext => 'Create a single community',                 linktext => 'Create a single community',
                url => '/adm/createcourse?phase=groupone',                 url => '/adm/createcourse?phase=groupone',
                permission => $permission->{'create'} && $cancreate->{'Community'},                 permission => $cancreate->{'Community'},
                #help => '',                 #help => '',
                icon => 'crsnew.png',                 icon => 'crsnew.png',
                linktitle => 'Create a new collaborative community by completing an online form.'                 linktitle => 'Create a new collaborative community by completing an online form.'
           },            },
           {            {
                linktext => 'Create courses/communities by uploading an attributes file',                 linktext => 'Create a single placement test',
                  url => '/adm/createcourse?phase=placementone',
                  permission => $cancreate->{'Placement'},
                  #help => '',
                  icon => 'crsnew.png',
                  linktitle => 'Create a new placement test by completing an online form.'
             },
             {
                  linktext => 'Create courses/communities/placement tests by uploading an attributes file',
                url => '/adm/createcourse?phase=batchone',                 url => '/adm/createcourse?phase=batchone',
                permission => $permission->{'create'},                 permission => 1,
                help => 'Batch_Creation',                 help => 'Batch_Creation',
                icon => 'uplcrs.png',                 icon => 'uplcrs.png',
                linktitle => 'Upload an attributes file containing specifications for one or more courses or communities in XML format.'                 linktitle => 'Upload an attributes file containing specifications for one or more courses, communities or placement tests in XML format.'
           },            },
        ]         ]
        },         },
        { categorytitle => 'Course/Community Requests',         { categorytitle => 'Course/Community Requests',
        items => [         items => [
            {             {
                linktext => $approve,                 linktext => 'Approve or reject requests',
                url => '/adm/createcourse?phase=requestdisplay',                 url => '/adm/createcourse?phase=requestdisplay',
                permission => $show_all_choices,                 permission => $show_all_choices,
                #help => '',                 #help => '',
                icon => 'rcrs.png',                 icon => 'rcrs.png',
                linktitle => 'Display course and community creation requests submitted by authorized users, held pending approval by a Domain Coordinator.'                 linktitle => 'Display course, community creation and placement test requests submitted by authorized users, held pending approval by a Domain Coordinator.'
            },             },
            {             {
                linktext => 'View pending official course requests',                 linktext => 'View pending official course requests',
Line 859  sub print_intro_page { Line 856  sub print_intro_page {
                permission => $show_all_choices,                 permission => $show_all_choices,
                #help => '',                 #help => '',
                icon => 'document-properties.png',                 icon => 'document-properties.png',
                linktitle => 'Display information about when, how and by whom courses and communities were created in this domain.'                 linktitle => 'Display information about when, how and by whom courses, communities and placement tests were created in this domain.'
            },             },
        ]         ]
        },         },
Line 876  sub print_intro_page { Line 873  sub print_intro_page {
 sub upload_batchfile {  sub upload_batchfile {
     my $r = shift;      my $r = shift;
     my $start_page =      my $start_page =
         &Apache::loncommon::start_page('Create a New Course or Community');          &Apache::loncommon::start_page('Create a New Course, Community, or Placement Test');
     my $crumbs = &Apache::lonhtmlcommon::breadcrumbs('Upload Course/Community Attributes File','Create_Course',undef,'Create_Courses');      my $crumbs = &Apache::lonhtmlcommon::breadcrumbs('Upload Course/Community/Placement Test Attributes File','Create_Course',undef,'Create_Courses');
     my $end_page =      my $end_page =
         &Apache::loncommon::end_page();          &Apache::loncommon::end_page();
     $r->print($start_page.$crumbs);      $r->print($start_page.$crumbs);
     $r->print('<h3>'.&mt('Upload a courses or communities attributes file').'</h3>');      $r->print('<h3>'.&mt('Upload a courses, communities or placement tests attributes file').'</h3>');
     $r->print('<form name="batchcreate" method="post" '.      $r->print('<form name="batchcreate" method="post" '.
                 'enctype="multipart/form-data" action="/adm/createcourse">'.                  'enctype="multipart/form-data" action="/adm/createcourse">'.
               '<input type="file" name="coursecreatorxml" />'.                '<input type="file" name="coursecreatorxml" />'.
               '<input type="hidden" name="phase" value="batchtwo" /><br /><br />'.                '<input type="hidden" name="phase" value="batchtwo" /><br /><br />'.
               '<input type="submit" name="batchsubmit" '.                '<input type="submit" name="batchsubmit" '.
               'value="'.&mt('Create Courses/Communities').'" /></form>');                'value="'.&mt('Create Courses/Communities/Placement Tests').'" /></form>');
     $r->print($end_page);      $r->print($end_page);
     return;      return;
 }  }
   
 sub process_batchfile {  sub process_batchfile {
     my $r = shift;      my $r = shift;
       my $start_page =
           &Apache::loncommon::start_page('Create a New Course, Community or Placement Test');
       my $crumbs = &Apache::lonhtmlcommon::breadcrumbs('Creation Outcome','Create_Course',undef,'Create_Courses');
       my $end_page =
           &Apache::loncommon::end_page();
     my $defdom=$env{'request.role.domain'};      my $defdom=$env{'request.role.domain'};
     my $uname = $env{'user.name'};      my $batchfilepath=&Apache::lonnet::userfileupload('coursecreatorxml',undef,
     my $udom = $env{'user.domain'};                                                        'batchupload',undef,undef,
     my $dir = &LONCAPA::tempdir().'addcourse';                                                         undef,undef,$defdom);
     my ($result,$logmsg,$clonemsg,$keysmsg,$codesref,$instcodesref);      my ($batchdir,$filename) = ($batchfilepath =~ m-^(.+)/pending/([^/]+)$-);
     if (($defdom =~ /^$match_domain$/) && ($uname =~ /^$match_username$/) && ($udom =~/^$match_domain$/)) {      my ($result,$logmsg);
         my $batchfilepath=&Apache::lonnet::userfileupload('coursecreatorxml',undef,      if (-e "$batchfilepath") {
                                                           'batchupload',undef,undef,          open(FILE,"<$batchfilepath");
                                                           undef,undef,$defdom);          my @buffer = <FILE>;
         if ($batchfilepath =~ m{^(\Q$dir/$defdom/web/$uname\E_\Q$udom\E)/pending/([^/]+)$}) {          close(FILE);
             my ($batchdir,$filename) = ($1,$2);          if ((defined($filename)) && (defined($batchdir))) {
             if (-e "$batchfilepath") {              my @requests = ($filename);
                 if (open(FILE,"<",$batchfilepath)) {              my %courseids = ();
                     my @buffer = <FILE>;              ($result,$logmsg) = &LONCAPA::batchcreatecourse::create_courses(
                                           \@requests,\%courseids,'web',$defdom,
                                           $env{'user.name'},$env{'user.domain'});
               if ($result) {
                   if (!-e "$batchdir/processed") {
                       mkdir("$batchdir/processed", 0755);
                       open(FILE,">$batchdir/processed/$filename");
                       print FILE @buffer;
                     close(FILE);                      close(FILE);
                     if ((defined($filename)) && (defined($batchdir))) {                      if (-e "$batchdir/processed/$filename") {
                         my @requests = ($filename);                          unlink("$batchdir/pending/$filename");
                         my %courseids = ();  
                         ($result,$logmsg,$clonemsg,$keysmsg,$codesref,$instcodesref) =  
                             &LONCAPA::batchcreatecourse::create_courses(  
                                        \@requests,\%courseids,'web',$defdom,  
                                        $uname,$udom);  
                         if (keys(%courseids) > 0) {  
                             if (!-e "$batchdir/processed") {  
                                 mkdir("$batchdir/processed", 0755);  
                             }  
                             if (-d "$batchdir/processed") {  
                                 if (open(FILE,">","$batchdir/processed/$filename")) {  
                                     print FILE @buffer;  
                                     close(FILE);  
                                 }  
                             }  
                             if (-e "$batchdir/processed/$filename") {  
                                 unlink("$batchdir/pending/$filename");  
                             }  
                             my $updatecats;  
                             if ((ref($instcodesref) eq 'HASH') && (keys(%{$instcodesref}) > 0)) {  
                                 &Apache::lonnet::devalidate_cache_new('instcats',$defdom);  
                                 $updatecats = 1;  
                             }  
                             &register_cleanups($r,$defdom,$updatecats);  
                         }  
                         if ($clonemsg) {  
                             $clonemsg = '<p class="LC_info">'.$clonemsg.'</p>'."\n";  
                         }  
                     }                      }
                 } else {  
                     $result = '<p class="LC_error">'.&mt('Could not open attributes file.').'<br />'.&mt('No courses created.').'</p>';  
                 }                  }
             } else {  
                 $result = '<p class="LC_error">'.&mt('No uploaded attributes file found.').'<br />'.&mt('No courses created.').'</p>';  
             }              }
         } else {  
             $result = '<p class="LC_error">'.&mt('Invalid path to attributes file.').'<br />'.&mt('No courses created.').'</p>';  
         }          }
     } else {  
         $result = '<p class="LC_error">'.&mt("Your username, domain, and/or your current role's domain are missing or contain invalid characters.").  
                   '<br />'.&mt('No courses created.').'</p>';  
     }      }
     $r->print(&Apache::loncommon::start_page('Create a New Course, Community or Placement Test').      $r->print($start_page.$crumbs.$logmsg.$result.'<br /><a href="/adm/createcourse">'.
               &Apache::lonhtmlcommon::breadcrumbs('Creation Outcome','Create_Course',undef,'Create_Courses').                &mt('Creation options menu').'</a>'.$end_page);
               $logmsg.$clonemsg.$result.'<br /><a href="/adm/createcourse">'.   
               &mt('Creation options menu').'</a>'.  
               &Apache::loncommon::end_page());  
 }  }
   
 sub courserequestbrowser_javascript {  sub courserequestbrowser_javascript {
Line 1041  sub print_creation_logs { Line 1011  sub print_creation_logs {
         $crstype = '.';          $crstype = '.';
     } elsif ($curr{'type'} eq 'community') {      } elsif ($curr{'type'} eq 'community') {
         $crstype = 'Community';          $crstype = 'Community';
       } elsif ($curr{'type'} eq 'placement') {
           $crstype = 'Placement';
     }      }
   
     my ($instcodefilter,$regexpok);      my ($instcodefilter,$regexpok);
Line 1131  sub print_creation_logs { Line 1103  sub print_creation_logs {
         my $showtype;          my $showtype;
         if ($courses{$cid}{type} eq 'Community') {          if ($courses{$cid}{type} eq 'Community') {
             $showtype = &mt('community');              $showtype = &mt('community');
           } elsif ($courses{$cid}{type} eq 'Placement') {
               $showtype = &mt('placement test');
         } else {          } else {
             my $instcode = $courses{$cid}{inst_code};              my $instcode = $courses{$cid}{inst_code};
             if ($instcode ne '')  {              if ($instcode ne '')  {
Line 1331  ENDJS Line 1305  ENDJS
   
 }  }
   
 sub get_permission {  
     my ($dom) = @_;  
     my ($allowed,%permission);  
     if (&Apache::lonnet::allowed('ccc',$dom)) {  
         $allowed = 1;  
         %permission = (  
             create => 1,  
         );  
     } elsif (&Apache::lonnet::allowed('dcc',$dom)) {  
         $allowed = 1;  
     }  
     return ($allowed,\%permission);  
 }  
   
 sub register_cleanups {  
     my ($r,$cdom,$updatecats) = @_;  
     # Flush the course logs so reverse user roles immediately updated  
     unless ($registered_flush) {  
         my $handlers = $r->get_handlers('PerlCleanupHandler');  
         $r->set_handlers('PerlCleanupHandler' => [\&Apache::lonnet::flushcourselogs,@{$handlers}]);  
         $registered_flush=1;  
     }  
     # Update cache of self-cataloging courses on institution's server(s).  
     if ($updatecats) {  
         if (&Apache::lonnet::shared_institution($cdom)) {  
             unless ($registered_instcats) {  
                 my $handlers = $r->get_handlers('PerlCleanupHandler');  
                 $r->set_handlers('PerlCleanupHandler' => [\&devalidate_remote_instcats,@{$handlers}]);  
                 $registered_instcats=1;  
                 $modified_dom = $cdom;  
             }  
         }  
     }  
     return;  
 }  
   
 sub devalidate_remote_instcats {  
     if ($modified_dom ne '') {  
         my %servers = &Apache::lonnet::internet_dom_servers($modified_dom);  
         my %thismachine;  
         map { $thismachine{$_} = 1; } &Apache::lonnet::current_machine_ids();  
         if (keys(%servers)) {  
             foreach my $server (keys(%servers)) {  
                 next if ($thismachine{$server});  
                 &Apache::lonnet::remote_devalidate_cache($server,['instcats:'.$modified_dom]);  
             }  
         }  
         $modified_dom = '';  
     }  
     return;  
 }  
   
 # ===================================================================== Handler  # ===================================================================== Handler
 sub handler {  sub handler {
     my $r = shift;      my $r = shift;
Line 1393  sub handler { Line 1315  sub handler {
        return OK;         return OK;
     }      }
   
     $registered_flush = 0;      my $show_all_choices = 0;
     $registered_instcats = 0;      my $primary_rev = &Apache::lonnet::get_server_loncaparev($env{'request.role.domain'});
     $modified_dom = '';      my %cancreate = (
                            Community => 0,
     my ($allowed,$permission) = &get_permission($env{'request.role.domain'});                           Placement => 0,
     if ($allowed) {                      );
         my $show_all_choices = 0;  
         my $primary_rev = &Apache::lonnet::get_server_loncaparev($env{'request.role.domain'});      if (($primary_rev ne 'refused') && ($primary_rev ne 'error') &&
         my %cancreate = (          ($primary_rev ne 'unknown_cmd') && ($primary_rev ne 'no_such_host')) {
                            Community => 0,          $show_all_choices = 1;
                         );          my ($primary_major,$primary_minor) = split(/\./,$primary_rev);
         if (($primary_rev ne 'refused') && ($primary_rev ne 'error') &&          foreach my $key (keys(%cancreate)) {
             ($primary_rev ne 'unknown_cmd') && ($primary_rev ne 'no_such_host')) {              my ($needsmajor,$needsminor) = 
             $show_all_choices = 1;                  split(/\./,$Apache::lonnet::needsrelease{'course:crstype:'.$key});
             my ($primary_major,$primary_minor) = split(/\./,$primary_rev);              unless (($needsmajor > $primary_major) ||
             foreach my $key (keys(%cancreate)) {                      (($needsmajor == $primary_major) && ($needsminor > $primary_minor))) {
                 my ($needsmajor,$needsminor) =                  $cancreate{$key} = 1;
                     split(/\./,$Apache::lonnet::needsrelease{'course:crstype:'.$key});  
                 unless (($needsmajor > $primary_major) ||  
                         (($needsmajor == $primary_major) && ($needsminor > $primary_minor))) {  
                     $cancreate{$key} = 1;  
                 }  
             }              }
         }          }
       }
   print STDERR "cacreate Community $cancreate{'Community'} cancreate Placement $cancreate{'Placement'}\n";
   
       if (&Apache::lonnet::allowed('ccc',$env{'request.role.domain'})) {
        &Apache::loncommon::content_type($r,'text/html');         &Apache::loncommon::content_type($r,'text/html');
        $r->send_http_header;         $r->send_http_header;
   
Line 1428  sub handler { Line 1348  sub handler {
           ({href=>"/adm/createcourse",            ({href=>"/adm/createcourse",
             text=>"Creation Options",              text=>"Creation Options",
             faq=>79,bug=>'Dom Coord Interface',});              faq=>79,bug=>'Dom Coord Interface',});
        if (($permission->{'create'}) &&         if (($env{'form.phase'} eq 'coursetwo') ||
            (($env{'form.phase'} eq 'coursetwo') ||             (($env{'form.phase'} eq 'grouptwo') && 
             (($env{'form.phase'} eq 'grouptwo') &&              ($cancreate{'Community'})) ||
             ($cancreate{'Community'})))) {             (($env{'form.phase'} eq 'placementtwo') &&
               ($cancreate{'Placement'}))) { 
            &Apache::lonhtmlcommon::add_breadcrumb             &Apache::lonhtmlcommon::add_breadcrumb
                  ({href=>"/adm/createcourse?phase=$env{'form.prevphase'}",                   ({href=>"/adm/createcourse?phase=$env{'form.prevphase'}",
                    text=>&mt('[_1] Creation Settings',),                     text=>&mt('[_1] Creation Settings',),
Line 1441  sub handler { Line 1362  sub handler {
                    text=>"Creation Outcome",                     text=>"Creation Outcome",
                    faq=>9,bug=>'Dom Coord Interface',});                     faq=>9,bug=>'Dom Coord Interface',});
            &create_course($r);             &create_course($r);
        } elsif (($permission->{'create'}) &&         } elsif (($env{'form.phase'} eq 'courseone') || 
                 (($env{'form.phase'} eq 'courseone') ||                  (($env{'form.phase'} eq 'groupone') && 
                  (($env{'form.phase'} eq 'groupone') &&                  ($cancreate{'Community'})) ||
                  ($cancreate{'Community'})))) {                  (($env{'form.phase'} eq 'placementone') &&
                    ($cancreate{'Placement'}))) {
            &Apache::lonhtmlcommon::add_breadcrumb             &Apache::lonhtmlcommon::add_breadcrumb
                  ({href=>"/adm/createcourse?phase=$env{'form.phase'}",                   ({href=>"/adm/createcourse?phase=$env{'form.phase'}",
                    text=>&mt('[_1] Creation Settings',),                     text=>&mt('[_1] Creation Settings',),
                    faq=>9,bug=>'Dom Coord Interface',});                     faq=>9,bug=>'Dom Coord Interface',});
    &print_course_creation_page($r);     &print_course_creation_page($r);
        } elsif (($permission->{'create'}) &&         } elsif ($env{'form.phase'} eq 'batchone') {
                 ($env{'form.phase'} eq 'batchone')) {  
            &Apache::lonhtmlcommon::add_breadcrumb             &Apache::lonhtmlcommon::add_breadcrumb
                  ({href=>"/adm/createcourse?phase=$env{'form.phase'}",                   ({href=>"/adm/createcourse?phase=$env{'form.phase'}",
                    text=>"Upload Description File",                     text=>"Upload Description File",
                    faq=>9,bug=>'Dom Coord Interface',});                     faq=>9,bug=>'Dom Coord Interface',});
            &upload_batchfile($r);             &upload_batchfile($r);
        } elsif (($permission->{'create'}) &&         } elsif ($env{'form.phase'} eq 'batchtwo') {
                 ($env{'form.phase'} eq 'batchtwo')) {  
            &Apache::lonhtmlcommon::add_breadcrumb             &Apache::lonhtmlcommon::add_breadcrumb
                  ({href=>"/adm/createcourse?phase=$env{'form.prevphase'}",                   ({href=>"/adm/createcourse?phase=$env{'form.prevphase'}",
                    text=>"Upload Description File",                     text=>"Upload Description File",
Line 1476  sub handler { Line 1396  sub handler {
            my $js = &courserequestbrowser_javascript();             my $js = &courserequestbrowser_javascript();
            my $start_page=&Apache::loncommon::start_page('Display Requests',$js);             my $start_page=&Apache::loncommon::start_page('Display Requests',$js);
            my $crumbs = &Apache::lonhtmlcommon::breadcrumbs('Display Requests','Course_Requests',undef,'Course_Requests');             my $crumbs = &Apache::lonhtmlcommon::breadcrumbs('Display Requests','Course_Requests',undef,'Course_Requests');
            my $context = 'domain';  
            unless ($permission->{'create'}) {  
                $context = 'helpdesk';  
            }  
            $r->print($start_page.$crumbs."\n".'<div>'.             $r->print($start_page.$crumbs."\n".'<div>'.
                      &Apache::loncoursequeueadmin::display_queued_requests(                       &Apache::loncoursequeueadmin::display_queued_requests(
                          $context,$env{'request.role.domain'}).'</div>'.                           'domain',$env{'request.role.domain'}).'</div>'.
                      &Apache::loncommon::end_page());                       &Apache::loncommon::end_page());
        } elsif (($permission->{'create'}) &&         } elsif (($env{'form.phase'} eq 'requestchange') && ($show_all_choices)) {
                 ($env{'form.phase'} eq 'requestchange') && ($show_all_choices)) {   
            if ($env{'form.queue'} eq 'pending') {             if ($env{'form.queue'} eq 'pending') {
                &Apache::lonhtmlcommon::add_breadcrumb                 &Apache::lonhtmlcommon::add_breadcrumb
                    ({href=>"/adm/createcourse?phase=pendingdisplay",                     ({href=>"/adm/createcourse?phase=pendingdisplay",
Line 1515  sub handler { Line 1430  sub handler {
            my $js = &courserequestbrowser_javascript();             my $js = &courserequestbrowser_javascript();
            my $start_page=&Apache::loncommon::start_page('Display Pending Queue',$js);             my $start_page=&Apache::loncommon::start_page('Display Pending Queue',$js);
            my $crumbs = &Apache::lonhtmlcommon::breadcrumbs('Display Pending Queue','Course_Requests',undef,'Course_Requests');             my $crumbs = &Apache::lonhtmlcommon::breadcrumbs('Display Pending Queue','Course_Requests',undef,'Course_Requests');
            my $context = 'pending';  
            unless ($permission->{'create'}) {  
                $context = 'displaypending';  
            }  
            $r->print($start_page.$crumbs."\n".'<div>'.             $r->print($start_page.$crumbs."\n".'<div>'.
                      &Apache::loncoursequeueadmin::display_queued_requests(                       &Apache::loncoursequeueadmin::display_queued_requests(
                          $context,$env{'request.role.domain'}).'</div>'.                           'pending',$env{'request.role.domain'}).'</div>'.
                      &Apache::loncommon::end_page());                       &Apache::loncommon::end_page());
        } elsif (($permission->{'create'}) &&         } elsif (($env{'form.phase'} eq 'requestvalidation') && ($show_all_choices)) {
                 ($env{'form.phase'} eq 'requestvalidation') && ($show_all_choices)) {   
            my $js = &courserequestbrowser_javascript();             my $js = &courserequestbrowser_javascript();
            &Apache::lonhtmlcommon::add_breadcrumb             &Apache::lonhtmlcommon::add_breadcrumb
                  ({href=>"/adm/createcourse?phase=pendingdisplay",                   ({href=>"/adm/createcourse?phase=pendingdisplay",
Line 1534  sub handler { Line 1444  sub handler {
            my $start_page=&Apache::loncommon::start_page('Requests Validation Result',$js);             my $start_page=&Apache::loncommon::start_page('Requests Validation Result',$js);
            my $crumbs = &Apache::lonhtmlcommon::breadcrumbs('Validation Attempted','Course_Requests',undef,'Course_Requests');             my $crumbs = &Apache::lonhtmlcommon::breadcrumbs('Validation Attempted','Course_Requests',undef,'Course_Requests');
            $r->print($start_page.$crumbs."\n".'<div>'.             $r->print($start_page.$crumbs."\n".'<div>'.
                      &Apache::loncoursequeueadmin::process_official_reqs('domain',$env{'request.role.domain'},                       &Apache::loncoursequeueadmin::process_official_reqs('domain',$env{'request.role.domain'}).'</div>'.
                                                                          $env{'user.name'},$env{'user.domain'}).  
                      '</div>'.  
                      &Apache::loncommon::end_page());                       &Apache::loncommon::end_page());
        } elsif (($env{'form.phase'} eq 'creationlog') && ($show_all_choices)) {         } elsif (($env{'form.phase'} eq 'creationlog') && ($show_all_choices)) {
            &Apache::lonhtmlcommon::add_breadcrumb             &Apache::lonhtmlcommon::add_breadcrumb
Line 1553  sub handler { Line 1461  sub handler {
            &print_creation_logs($r);             &print_creation_logs($r);
            $r->print('</div>'.&Apache::loncommon::end_page());             $r->print('</div>'.&Apache::loncommon::end_page());
        } else {         } else {
            &print_intro_page($r,$show_all_choices,\%cancreate,$permission);             &print_intro_page($r,$show_all_choices,\%cancreate);
        }         }
    } else {     } else {
       $env{'user.error.msg'}=        $env{'user.error.msg'}=

Removed from v.1.158.2.8.2.1  
changed lines
  Added in v.1.159


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