Diff for /loncom/interface/loncreatecourse.pm between versions 1.95 and 1.109

version 1.95, 2006/07/20 22:09:36 version 1.109, 2008/09/25 17:44:11
Line 33  use strict; Line 33  use strict;
 use Apache::Constants qw(:common :http);  use Apache::Constants qw(:common :http);
 use Apache::lonnet;  use Apache::lonnet;
 use Apache::loncommon;  use Apache::loncommon;
 use Apache::lonratedt;  
 use Apache::londocs;  use Apache::londocs;
 use Apache::lonlocal;  use Apache::lonlocal;
 use Apache::londropadd;  use Apache::lonuserutils;
   use Apache::lonclonecourse;
 use LONCAPA::batchcreatecourse;  use LONCAPA::batchcreatecourse;
 use lib '/home/httpd/lib/perl';  
 use LONCAPA;  use LONCAPA;
   
 # ================================================ Get course directory listing  
   
 my @output=();  
   
 sub crsdirlist {  
     my ($courseid,$which)=@_;  
     @output=();  
     return &innercrsdirlist($courseid,$which);  
 }  
   
 sub innercrsdirlist {  
     my ($courseid,$which,$path)=@_;  
     my $dirptr=16384;  
     unless ($which) { $which=''; } else { $which.='/'; }  
     unless ($path)  { $path=''; } else { $path.='/'; }  
     my %crsdata=&Apache::lonnet::coursedescription($courseid);  
     my @listing=&Apache::lonnet::dirlist  
  ($which,$crsdata{'domain'},$crsdata{'num'},  
  &propath($crsdata{'domain'},$crsdata{'num'}));  
     foreach (@listing) {  
  unless ($_=~/^\./) {  
     my @unpackline = split (/\&/,$_);  
     if ($unpackline[3]&$dirptr) {  
 # is a directory, recurse  
  &innercrsdirlist($courseid,$which.$unpackline[0],  
             $path.$unpackline[0]);  
     } else {   
 # is a file, put into output  
  push (@output,$path.$unpackline[0]);  
     }  
  }  
     }  
     return @output;  
 }  
   
 # ============================================================= Read a userfile  
   
 sub readfile {  
     my ($courseid,$which)=@_;  
     my %crsdata=&Apache::lonnet::coursedescription($courseid);  
     return &Apache::lonnet::getfile('/uploaded/'.$crsdata{'domain'}.'/'.  
     $crsdata{'num'}.'/'.$which);  
 }  
   
 # ============================================================ Write a userfile  
   
 sub writefile {  
     (my $courseid, my $which,$env{'form.output'})=@_;  
     my %crsdata=&Apache::lonnet::coursedescription($courseid);  
     return &Apache::lonnet::finishuserfileupload(  
   $crsdata{'num'},$crsdata{'domain'},  
   'output',$which);  
 }  
   
 # ===================================================================== Rewrite  
   
 sub rewritefile {  
     my ($contents,%rewritehash)=@_;  
     foreach (keys %rewritehash) {  
  my $pattern=$_;  
  $pattern=~s/(\W)/\\$1/gs;  
  my $new=$rewritehash{$_};  
  $contents=~s/$pattern/$new/gs;  
     }  
     return $contents;  
 }  
   
 # ============================================================= Copy a userfile  
   
 sub copyfile {  
     my ($origcrsid,$newcrsid,$which)=@_;  
     unless ($which=~/\.sequence$/) {  
  return &writefile($newcrsid,$which,  
       &readfile($origcrsid,$which));  
     } else {  
  my %origcrsdata=&Apache::lonnet::coursedescription($origcrsid);  
  my %newcrsdata= &Apache::lonnet::coursedescription($newcrsid);  
  return &writefile($newcrsid,$which,  
  &rewritefile(  
                      &readfile($origcrsid,$which),  
     (  
        '/uploaded/'.$origcrsdata{'domain'}.'/'.$origcrsdata{'num'}.'/'  
     => '/uploaded/'. $newcrsdata{'domain'}.'/'. $newcrsdata{'num'}.'/',  
        '/public/'.$origcrsdata{'domain'}.'/'.$origcrsdata{'num'}.'/'  
     => '/public/'. $newcrsdata{'domain'}.'/'. $newcrsdata{'num'}.'/'  
             )));  
     }  
 }  
   
 # =============================================================== Copy a dbfile  
   
 sub copydb {  
     my ($origcrsid,$newcrsid,$which)=@_;  
     $which=~s/\.db$//;  
     my %origcrsdata=&Apache::lonnet::coursedescription($origcrsid);  
     my %newcrsdata= &Apache::lonnet::coursedescription($newcrsid);  
     my %data=&Apache::lonnet::dump  
  ($which,$origcrsdata{'domain'},$origcrsdata{'num'});  
     foreach my $key (keys(%data)) {  
  if ($key=~/^internal./) { delete($data{$key}); }  
     }  
     return &Apache::lonnet::put  
  ($which,\%data,$newcrsdata{'domain'},$newcrsdata{'num'});  
 }  
   
 # ========================================================== Copy resourcesdata  
   
 sub copyresourcedb {  
     my ($origcrsid,$newcrsid)=@_;  
     my %origcrsdata=&Apache::lonnet::coursedescription($origcrsid);  
     my %newcrsdata= &Apache::lonnet::coursedescription($newcrsid);  
     my %data=&Apache::lonnet::dump  
  ('resourcedata',$origcrsdata{'domain'},$origcrsdata{'num'});  
     $origcrsid=~s/^\///;  
     $origcrsid=~s/\//\_/;  
     $newcrsid=~s/^\///;  
     $newcrsid=~s/\//\_/;  
     my %newdata=();  
     undef %newdata;  
     my $startdate=$data{$origcrsid.'.0.opendate'};  
     if (!$startdate) {  
  # now global start date for assements try the enrollment start  
  my %start=&Apache::lonnet::get('environment',  
    ['default_enrollment_start_date'],  
    $origcrsdata{'domain'},$origcrsdata{'num'});  
   
  $startdate = $start{'default_enrollment_start_date'};  
     }  
     my $today=time;  
     my $delta=0;  
     if ($startdate) {  
  my $oneday=60*60*24;  
  $delta=$today-$startdate;  
  $delta=int($delta/$oneday)*$oneday;  
     }  
 # ugly retro fix for broken version of types  
     foreach (keys %data) {  
  if ($_=~/\wtype$/) {  
     my $newkey=$_;  
     $newkey=~s/type$/\.type/;  
     $data{$newkey}=$data{$_};  
     delete $data{$_};  
  }  
     }  
 # adjust symbs  
     my $pattern='uploaded/'.$origcrsdata{'domain'}.'/'.$origcrsdata{'num'}.'/';  
     $pattern=~s/(\W)/\\$1/gs;  
     my $new=    'uploaded/'. $newcrsdata{'domain'}.'/'. $newcrsdata{'num'}.'/';  
     foreach (keys %data) {  
  if ($_=~/$pattern/) {  
     my $newkey=$_;  
     $newkey=~s/$pattern/$new/;  
     $data{$newkey}=$data{$_};  
     delete $data{$_};  
  }  
     }  
 # adjust dates  
     foreach (keys %data) {  
  my $thiskey=$_;  
  $thiskey=~s/^$origcrsid/$newcrsid/;  
  $newdata{$thiskey}=$data{$_};  
  if ($data{$_.'.type'}=~/^date_(start|end)$/) {  
     if ($delta > 0) {  
  $newdata{$thiskey}=$newdata{$thiskey}+$delta;  
     } else {  
  # no delta, it's unlikely we want the old dates and times  
  delete($newdata{$thiskey});  
  delete($newdata{$thiskey.'.type'});  
     }  
  }  
     }  
     return &Apache::lonnet::put  
  ('resourcedata',\%newdata,$newcrsdata{'domain'},$newcrsdata{'num'});  
 }  
   
 # ========================================================== Copy all userfiles  
   
 sub copyuserfiles {  
     my ($origcrsid,$newcrsid)=@_;  
     foreach (&crsdirlist($origcrsid,'userfiles')) {  
  if ($_ !~m|^scantron_|) {  
     &copyfile($origcrsid,$newcrsid,$_);  
  }  
     }  
 }  
 # ========================================================== Copy all userfiles  
   
 sub copydbfiles {  
     my ($origcrsid,$newcrsid)=@_;  
   
     my ($origcrs_discussion) = ($origcrsid=~m|^/(.*)|);  
     $origcrs_discussion=~s|/|_|g;  
     foreach (&crsdirlist($origcrsid)) {  
  if ($_=~/\.db$/) {  
     unless   
              ($_=~/^(nohist\_|discussiontimes|classlist|versionupdate|resourcedata|\Q$origcrs_discussion\E|slots|slot_reservations|gradingqueue|reviewqueue|CODEs|groupmembership)/) {  
  &copydb($origcrsid,$newcrsid,$_);  
      }  
  }  
     }  
 }  
   
 # ======================================================= Copy all course files  
   
 sub copycoursefiles {  
     my ($origcrsid,$newcrsid)=@_;  
     &copyuserfiles($origcrsid,$newcrsid);  
     &copydbfiles($origcrsid,$newcrsid);  
     &copyresourcedb($origcrsid,$newcrsid);  
 }  
   
 # ===================================================== Phase one: fill-in form  # ===================================================== Phase one: fill-in form
   
 sub print_course_creation_page {  sub print_course_creation_page {
Line 261  sub print_course_creation_page { Line 49  sub print_course_creation_page {
         $crstype = 'Course';          $crstype = 'Course';
     }      }
     my $defdom=$env{'request.role.domain'};      my $defdom=$env{'request.role.domain'};
     my %host_servers = &Apache::loncommon::get_library_servers($defdom);      my %host_servers = &Apache::lonnet::get_servers($defdom,'library');
     my $course_home = '<select name="course_home" size="1">'."\n";      my $course_home = '<select name="course_home" size="1">'."\n";
     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"};
Line 282  sub print_course_creation_page { Line 70  sub print_course_creation_page {
     if ($crstype eq 'Course') {      if ($crstype eq 'Course') {
         my $starttime = time;          my $starttime = time;
         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
         $enroll_table = &Apache::londropadd::date_setting_table($starttime,          $enroll_table = &Apache::lonuserutils::date_setting_table($starttime,
                                                 $endtime,'create_enrolldates');                                                $endtime,'create_enrolldates');
         $access_table = &Apache::londropadd::date_setting_table($starttime,          $access_table = &Apache::lonuserutils::date_setting_table($starttime,
                                                $endtime,'create_defaultdates');                                               $endtime,'create_defaultdates');
         ($krbdef,$krbdefdom) =          ($krbdef,$krbdefdom) =
         &Apache::loncommon::get_kerberos_defaults($defdom);          &Apache::loncommon::get_kerberos_defaults($defdom);
         $javascript_validations=&Apache::londropadd::javascript_validations(          $javascript_validations=&Apache::lonuserutils::javascript_validations(
                                                     'createcourse',$krbdefdom);                                                      'createcourse',$krbdefdom);
         my %param = ( formname      => 'document.ccrs',          my %param = ( formname      => 'document.ccrs',
                       kerb_def_dom  => $krbdefdom,                        kerb_def_dom  => $krbdefdom,
Line 340  function validate(formname) { Line 128  function validate(formname) {
                     'cid'  => "Course ID",                      'cid'  => "Course ID",
                     'dmn'  => "Domain",                      'dmn'  => "Domain",
                     'asov' => "Additional settings, if specified below, will override cloned settings",                      'asov' => "Additional settings, if specified below, will override cloned settings",
                       'ncd'  => "Do not clone date parameters",
                       'prd'  => 'Clone date parameters as-is',
                       'shd'  => 'Shift date parameters by number of days',
                     'assp' => "Assessment Parameters",                      'assp' => "Assessment Parameters",
                     'oaas' => "Open all assessments",                      'oaas' => "Open all assessments",
                     'mssg' => "Messaging",                      'mssg' => "Messaging",
Line 362  function validate(formname) { Line 153  function validate(formname) {
                     'audr' => "Automated drops",                      'audr' => "Automated drops",
                     'dacu' => "Duration of automated classlist updates",                      'dacu' => "Duration of automated classlist updates",
                     'dacc' => "Default start and end dates for student access",                      'dacc' => "Default start and end dates for student access",
                     'psam' => "Please select the authentication mechanism",                      'psam' => "Please select the Authentication mechanism",
                     'pcda' => "Please choose the default authentication method to be used by new users added to this LON-CAPA domain by the automated enrollment process",                      'pcda' => "Please choose the default authentication method to be used by new users added to this LON-CAPA domain by the automated enrollment process",
                     'nech' => "Notification of enrollment changes",                      'nech' => "Notification of enrollment changes",
                     'nccl' => "Notification to course coordinator via LON-CAPA message when enrollment changes occur during the automated update?",                      'nccl' => "Notification to course coordinator via LON-CAPA message when enrollment changes occur during the automated update?",
Line 433  END Line 224  END
     'Create_Courses');      'Create_Courses');
     $r->print($start_page.$crumbs);      $r->print($start_page.$crumbs);
     if ($crstype eq 'Course') {      if ($crstype eq 'Course') {
         $r->print(<<ENDDOCUMENT);  
 <form action="/adm/createcourse" method="post" name="ccrs">          $r->print('<form action="/adm/createcourse" method="post" name="ccrs">'
 <h2>$lt{'cinf'}</h2>                   .&Apache::lonhtmlcommon::start_pick_box()
 <p>  
 <label><b>$lt{'ctit'}:</b>                   .&Apache::lonhtmlcommon::row_headline()
 <input type="text" size="50" name="title" /></label>                   .'<h3>'.$lt{'cinf'}.'</h3>'
 </p><p>                   .&Apache::lonhtmlcommon::row_closure()
 <label>  
     <b>$lt{'chsr'}:</b>$course_home                   .&Apache::lonhtmlcommon::row_title($lt{'ctit'})
 </label>                   .'<input type="text" size="50" name="title" />'
 </p><p>                   .&Apache::lonhtmlcommon::row_closure()
 <label>  
     <b>$lt{'cidn'} ($lt{'opt'})</b>                   .&Apache::lonhtmlcommon::row_title($lt{'chsr'})
     <input type="text" size="30" name="crsid" />                   .$course_home
 </label>                   .&Apache::lonhtmlcommon::row_closure()
 </p><p>  
 <h2>$lt{'iinf'}</h2>                   .&Apache::lonhtmlcommon::row_title($lt{'cidn'}.' ('.$lt{'opt'}.')')
 <p>                   .'<input type="text" size="30" name="crsid" />'
 $lt{'stat'}                   .&Apache::lonhtmlcommon::row_closure()
 </p><p>  
 <label>                   .&Apache::lonhtmlcommon::row_headline()
     <b>$lt{'ccod'}</b>                   .'<h3>'.$lt{'iinf'}.'</h3>'
     <input type="text" size="30" name="crscode" />                   .$lt{'stat'}
 </label>                   .&Apache::lonhtmlcommon::row_closure()
 <br/>  
 ($lt{'toin'})                   .&Apache::lonhtmlcommon::row_title($lt{'ccod'})
 </p><p>                   .'<input type="text" size="30" name="crscode" />'
 <label>                   .'<br />('.$lt{'toin'}.')'
     <b>$lt{'snid'}</b>                   .&Apache::lonhtmlcommon::row_closure()
     <input type="text" size="30" name="crssections" />  
 </label>                   .&Apache::lonhtmlcommon::row_title($lt{'snid'})
 <br/>                   .'<input type="text" size="30" name="crssections" />'
 ($lt{'csli'})                   .'<br />('.$lt{'csli'}.')'
 </p><p>                   .&Apache::lonhtmlcommon::row_closure()
 <label>  
     <b>$lt{'crcs'}</b>                   .&Apache::lonhtmlcommon::row_title($lt{'crcs'})
     <input type="text" size="30" name="crsxlist" />                   .'<input type="text" size="30" name="crsxlist" />'
 </label>                   .'<br />('.$lt{'cscs'}.')'
 <br/>                   .&Apache::lonhtmlcommon::row_closure()
 ($lt{'cscs'})  
 </p>                   .&Apache::lonhtmlcommon::row_headline()
 <h2>$lt{'crco'}</h2>                   .'<h3>'.$lt{'crco'}.'</h3>'
                   );
           $r->print(<<MYEND);
 <table border="2">  <table border="2">
 <tr><th>$lt{'cncr'}</th><th>$lt{'cecr'}</th></tr>  <tr><th>$lt{'cncr'}</th><th>$lt{'cecr'}</th></tr>
 <tr><td>  <tr><td>
Line 496  $lt{'stat'} Line 289  $lt{'stat'}
 </label>  </label>
 &nbsp;  &nbsp;
 <label>  <label>
     <input type="radio" name="firstres" value="syl" checked />$lt{'sllb'}      <input type="radio" name="firstres" value="syl" checked="checked" />$lt{'sllb'}
 </label>  </label>
 &nbsp;  &nbsp;
 <label>  <label>
Line 512  $lt{'stat'} Line 305  $lt{'stat'}
     $lt{'dmn'}: $cloneform      $lt{'dmn'}: $cloneform
 </label>  </label>
 <br />  <br />
    <label><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" /><br />
 &nbsp;<br />  &nbsp;<br />
 $lt{'asov'}.  $lt{'asov'}.
 </td></tr>  </td></tr>
 </table>  </table>
 <h2>$lt{'assp'}</h2>  MYEND
 <p>  
 <label>  
     <b>$lt{'oaas'}: </b>  $r->print(' '
     <input type="checkbox" name="openall" />                   .&Apache::lonhtmlcommon::row_closure()
 </label>  
 </p>                   .&Apache::lonhtmlcommon::row_headline()
 <h2>$lt{'mssg'}</h2>                   .'<h3>'.$lt{'assp'}.'</h3>'
 <p>                   .&Apache::lonhtmlcommon::row_closure()
 <label>  
     <b>$lt{'scpf'}: </b>                   .&Apache::lonhtmlcommon::row_title($lt{'oaas'})
     <input type="checkbox" name="setpolicy" checked />                   .'<input type="checkbox" name="openall" />'
 </label>                   .&Apache::lonhtmlcommon::row_closure()
 <br />  
 <label>                   .&Apache::lonhtmlcommon::row_headline()
     <b>$lt{'scfc'}: </b>                   .'<h3>'.$lt{'mssg'}.'</h3>'
     <input type="checkbox" name="setcontent" checked />                   .&Apache::lonhtmlcommon::row_closure()
 </label>  
 </p>                   .&Apache::lonhtmlcommon::row_title($lt{'scpf'})
 <h2>$lt{'cmmn'}</h2>                   .'<input type="checkbox" name="setpolicy" checked="checked" />'
 <p>                   .&Apache::lonhtmlcommon::row_closure()
 <label>  
     <b>$lt{'dsrd'}: </b>                   .&Apache::lonhtmlcommon::row_title($lt{'scfc'})
     <input type="checkbox" name="disresdis" />                   .'<input type="checkbox" name="setcontent" checked="checked" />'
 </label>                   .&Apache::lonhtmlcommon::row_closure()
 <br />  
 <label>                   .&Apache::lonhtmlcommon::row_headline()
     <b>$lt{'dsuc'}: </b>                   .'<h3>'.$lt{'cmmn'}.'</h3>'
     <input type="checkbox" name="disablechat" />                   .&Apache::lonhtmlcommon::row_closure()
 </label>  
 </p>                   .&Apache::lonhtmlcommon::row_title($lt{'dsrd'})
 <h2>$lt{'acco'}</h2>                   .'<input type="checkbox" name="disresdis" />'
 <p>                   .&Apache::lonhtmlcommon::row_closure()
 <label>  
     <b>$lt{'snak'}: </b>                   .&Apache::lonhtmlcommon::row_title($lt{'dsuc'})
     <input type="checkbox" name="setkeys" />                   .'<input type="checkbox" name="disablechat" /'
 </label>                   .&Apache::lonhtmlcommon::row_closure()
 <br />  
 <label>                   .&Apache::lonhtmlcommon::row_headline()
     <b>$lt{'kaut'}: </b>                   .'<h3>'.$lt{'acco'}.'</h3>'
     <input type="text" size="30" name="keyauth" />                   .&Apache::lonhtmlcommon::row_closure()
 </label>  
 </p>                   .&Apache::lonhtmlcommon::row_title($lt{'snak'})
 <h2>$lt{'rshm'}</h2>                   .'<input type="checkbox" name="setkeys" />'
 <p>                   .&Apache::lonhtmlcommon::row_closure()
 <label>  
     <b>$lt{'rshm'}: </b>                   .&Apache::lonhtmlcommon::row_title($lt{'kaut'})
     <input type="text" name="reshome" size="30" value="/res/$defdom/" />                   .'<input type="text" size="30" name="keyauth" />'
 </label>                   .&Apache::lonhtmlcommon::row_closure()
 </p>  
 <p>                   .&Apache::lonhtmlcommon::row_headline()
 <h2>$lt{'aens'}</h2>                   .'<h3>'.$lt{'rshm'}.'</h3>'
 $lt{'aesc'}                   .&Apache::lonhtmlcommon::row_closure()
 </p>  
 <p>                   .&Apache::lonhtmlcommon::row_title($lt{'rshm'})
 <b>$lt{'aadd'}</b>                   .'<input type="text" name="reshome" size="30" value="/res/'.$defdom.'/" />'
 <label><input type="radio" name="autoadds" value="1" />$lt{'yes'}</label>                    .&Apache::lonhtmlcommon::row_closure()
 <label><input type="radio" name="autoadds" value="0" checked="true" />$lt{'no'}  
 </label>                   .&Apache::lonhtmlcommon::row_headline()
 </p><p>                   .'<h3>'.$lt{'aens'}.'</h3>'
 <b>$lt{'audr'}</b>                   .&Apache::lonhtmlcommon::row_closure()
 <label><input type="radio" name="autodrops" value="1" />$lt{'yes'}</label>   
 <label><input type="radio" name="autodrops" value="0" checked="true" />$lt{'no'}</label>                   .&Apache::lonhtmlcommon::row_title($lt{'aadd'})
 </p><p>                   .'<label><input type="radio" name="autoadds" value="1" />'.$lt{'yes'}.'</label>'
 <b>$lt{'dacu'}</b>                   .'<label><input type="radio" name="autoadds" value="0" checked="checked" />'.$lt{'no'}.'</label>'
 $enroll_table                   .&Apache::lonhtmlcommon::row_closure()
 </p><p>  
 <b>$lt{'dacc'}</b>                   .&Apache::lonhtmlcommon::row_title($lt{'audr'})
 $access_table                   .'<label><input type="radio" name="autodrops" value="1" />'.$lt{'yes'}.'</label>'
 <p></p>                   .'<label><input type="radio" name="autodrops" value="0" checked="checked" />'.$lt{'no'}.'</label>'
 <b>$lt{'psam'}.</b><br />                   .&Apache::lonhtmlcommon::row_closure()
 $lt{'pcda'}.  
 </p><p>                   .&Apache::lonhtmlcommon::row_title($lt{'dacu'})
 $krbform                   .$enroll_table
 <br />                   .&Apache::lonhtmlcommon::row_closure()
 $intform  
 <br />                   .&Apache::lonhtmlcommon::row_title($lt{'dacc'})
 $locform                   .$access_table
 </p><p>                   .&Apache::lonhtmlcommon::row_closure()
 <b>$lt{'nech'}</b><br />  
 $lt{'nccl'}<br/>                   .&Apache::lonhtmlcommon::row_title($lt{'psam'})
 <label>                   .$lt{'pcda'}.'<br />'
     <input type="radio" name="notify_owner" value="1" />$lt{'yes'}                   .$krbform.'<br />'
 </label>                    .$intform.'<br />'
 <label>                   .$locform
     <input type="radio" name="notify_owner" value="0" checked="true" />$lt{'no'}                   .&Apache::lonhtmlcommon::row_closure()
 </label>  
 <br />                   .&Apache::lonhtmlcommon::row_title($lt{'nech'})
 $lt{'ndcl'}<br/>                   .$lt{'nccl'}.'<br/>'
 <label>                   .'<label><input type="radio" name="notify_owner" value="1" />'.$lt{'yes'}.'</label>'
     <input type="radio" name="notify_dc" value="1" />$lt{'yes'}                   .'<label><input type="radio" name="notify_owner" value="0" checked="checked" />'.$lt{'no'}.'</label>'
 </label>                   .'<br />'
 <label>                   .$lt{'ndcl'}.'<br/>'
     <input type="radio" name="notify_dc" value="0" checked="true" />$lt{'no'}                   .'<label><input type="radio" name="notify_dc" value="1" />'.$lt{'yes'}.'</label>'
 </label>                   .'<label><input type="radio" name="notify_dc" value="0" checked="checked" />'.$lt{'no'}.'</label>'
 </p><p>                   .&Apache::lonhtmlcommon::row_closure()
 <b>$lt{'irsp'}</b>  
 <label>                   .&Apache::lonhtmlcommon::row_title($lt{'irsp'})
     <input type="radio" name="showphotos" value="1" />$lt{'yes'}                   .'<label>'
 </label>                    .'<input type="radio" name="showphotos" value="1" />'.$lt{'yes'}
 <label>                   .'</label> '
     <input type="radio" name="showphotos" value="0" checked="true" />$lt{'no'}                   .'<label>'
 </label>                   .'<input type="radio" name="showphotos" value="0" checked="checked" />'.$lt{'no'}
 </p>                   .'</label> '
 <p>                   .&Apache::lonhtmlcommon::row_closure()
 <h2>$lt{'cgrs'}</h2>  
 $lt{'cgrq'}                   .&Apache::lonhtmlcommon::row_headline()
 <input type="text" name="crsquota" value="20" size="6" />Mb                    .'<h3>'.$lt{'cgrs'}.'</h3>'
 </p>                   .&Apache::lonhtmlcommon::row_closure()
 <hr />  
 <h2>$lt{'cc'}</h2>                   .&Apache::lonhtmlcommon::row_title($lt{'cgrq'})
 <p>                   .'<input type="text" name="crsquota" value="20" size="6" />Mb'
 <label>                   .&Apache::lonhtmlcommon::row_closure()
     <b>$lt{'user'}:</b> <input type="text" size="15" name="ccuname" />  
 </label>                   .&Apache::lonhtmlcommon::row_headline()
 </p><p>                   .'<h3>'.$lt{'cc'}.'</h3>'
 <label>                   .&Apache::lonhtmlcommon::row_closure()
     <b>$lt{'dmn'}:</b> $domform  
 </label>                   .&Apache::lonhtmlcommon::row_title($lt{'user'})
 </p>                   .'<input type="text" size="15" name="ccuname" />'
                    .&Apache::lonhtmlcommon::row_closure()
   
                    .&Apache::lonhtmlcommon::row_title($lt{'dmn'},"","LC_odd_row_value")
                    .$domform
                    .&Apache::lonhtmlcommon::row_closure(1)
   
                    .&Apache::lonhtmlcommon::end_pick_box()
                    );
   
           $r->print(<<ENDDOCUMENT);
 <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" />
Line 643  $lt{'cgrq'} Line 450  $lt{'cgrq'}
 </p>  </p>
 </form>  </form>
 ENDDOCUMENT  ENDDOCUMENT
   
     } elsif ($crstype eq 'Group') {      } elsif ($crstype eq 'Group') {
         $r->print(<<ENDDOCUMENT);          $r->print(<<ENDDOCUMENT);
 <form action="/adm/createcourse" method="post" name="ccrs">  <form action="/adm/createcourse" method="post" name="ccrs">
Line 682  ENDDOCUMENT Line 490  ENDDOCUMENT
 </label>  </label>
 &nbsp;  &nbsp;
 <label>  <label>
     <input type="radio" name="firstres" value="syl" checked />$lt{'sllb'}      <input type="radio" name="firstres" value="syl" checked="checked" />$lt{'sllb'}
 </label>  </label>
 &nbsp;  &nbsp;
 <label>  <label>
Line 698  ENDDOCUMENT Line 506  ENDDOCUMENT
     $lt{'dmn'}: $cloneform      $lt{'dmn'}: $cloneform
 </label>  </label>
 <br />  <br />
 &nbsp;<br />   <label><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" /><br />&nbsp;<br />
 $lt{'asov'}.  $lt{'asov'}.
 </td></tr>  </td></tr>
 </table>  </table>
Line 708  $lt{'asov'}. Line 519  $lt{'asov'}.
 <p>  <p>
 <label>  <label>
     <b>$lt{'sgpf'}: </b>      <b>$lt{'sgpf'}: </b>
     <input type="checkbox" name="setpolicy" checked />      <input type="checkbox" name="setpolicy" checked="checked" />
 </label>  </label>
 <br />  <br />
 <label>  <label>
     <b>$lt{'scfg'}: </b>      <b>$lt{'scfg'}: </b>
     <input type="checkbox" name="setcontent" checked />      <input type="checkbox" name="setcontent" checked="checked" />
 </label>  </label>
 </p>  </p>
 <h2>$lt{'cmmn'}</h2>  <h2>$lt{'cmmn'}</h2>
Line 778  ENDDOCUMENT Line 589  ENDDOCUMENT
   
 sub create_course {  sub create_course {
     my $r=shift;      my $r=shift;
     my $ccuname=$env{'form.ccuname'};      my $ccuname =&LONCAPA::clean_username($env{'form.ccuname'});
     my $ccdomain=$env{'form.ccdomain'};      my $ccdomain=&LONCAPA::clean_domain($env{'form.ccdomain'});
     $ccuname=~s/\W//g;  
     $ccdomain=~s/\W//g;  
     my $crstype = 'Group';      my $crstype = 'Group';
     my ($enrollstart,$enrollend,$startaccess,$endaccess);      my ($enrollstart,$enrollend,$startaccess,$endaccess);
   
Line 789  sub create_course { Line 598  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');
   
     }      }
     $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');
Line 831  sub create_course { Line 639  sub create_course {
                crsquota => $env{'form.crsquota'},                 crsquota => $env{'form.crsquota'},
                clonecourse => $env{'form.clonecourse'},                 clonecourse => $env{'form.clonecourse'},
                clonedomain => $env{'form.clonedomain'},                 clonedomain => $env{'form.clonedomain'},
                  datemode => $env{'form.datemode'},
                  dateshift => $env{'form.dateshift'},
                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 864  sub create_course { Line 674  sub create_course {
     # Check the veracity of the course coordinator      # Check the veracity of the course coordinator
     if (&Apache::lonnet::homeserver($ccuname,$ccdomain) eq 'no_host') {      if (&Apache::lonnet::homeserver($ccuname,$ccdomain) eq 'no_host') {
  $r->print('<form action="/adm/createuser" method="post" name="crtuser">');   $r->print('<form action="/adm/createuser" method="post" name="crtuser">');
         $r->print(&mt('No such user').' '.$ccuname.' '.&mt('at').' '.$ccdomain.'.<br />');          $r->print('<div class="LC_warning">'
  $r->print(&mt("Please click Back on your browser and select another user, or "));                    .&mt('No such user [_1] at domain [_2].','<tt>'.$ccuname.'</tt>','<tt>'.$ccdomain.'</tt>')
  $r->print('                   .'</div>');
     <input type="hidden" name="phase" value="get_user_info" />   $r->print(&mt('Please click Back on your browser and select another user, or [_1]Create User[_2]'
             <input type="hidden" name="ccuname" value="'.$ccuname.'" />               , '<input type="hidden" name="phase" value="get_user_info" />'
             <input type="hidden" name="ccdomain" value="'.$ccdomain.'" />                        .'<input type="hidden" name="ccuname" value="'.$ccuname.'" />'
             <input name="userrole" type="submit" value="'.                        .'<input type="hidden" name="ccdomain" value="'.$ccdomain.'" />'
   &mt('Create User').'" />                        .'<input name="userrole" type="submit" value="'
  </form>'.&Apache::loncommon::end_page());                       , '" />'
                        )
                    .'</form>'.&Apache::loncommon::end_page()
                    );
  return;   return;
     }      }
     # Check the proposed home server for the course      # Check the proposed home server for the course
     my %host_servers = &Apache::loncommon::get_library_servers      my %host_servers = 
         ($env{'request.role.domain'});   &Apache::lonnet::get_servers($env{'request.role.domain'},'library');
     if (! exists($host_servers{$env{'form.course_home'}})) {      if (! exists($host_servers{$env{'form.course_home'}})) {
         $r->print(&mt('Invalid home server for course').': '.          $r->print(&mt('Invalid home server for course: [_1]'
                   $env{'form.course_home'}.&Apache::loncommon::end_page());                       ,$env{'form.course_home'}.&Apache::loncommon::end_page()));
         return;          return;
     }      }
     my ($courseid,$crsudom,$crsunum);      my ($courseid,$crsudom,$crsunum);
     $r->print(&construct_course($args,\$logmsg,\$courseid,\$crsudom,\$crsunum,$env{'user.domain'},$env{'user.name'}));      my ($success,$output) = 
    &Apache::loncommon::construct_course($args,\$logmsg,\$courseid,
 #       \$crsudom,\$crsunum,
 # Make the requested user a course coordinator or group coordinator       $env{'user.domain'},
 #       $env{'user.name'});
     if (($ccdomain) && ($ccuname)) {      $r->print($output);
         $r->print(&mt('Assigning role of [_1] Coordinator to [_2] at [_3]:',      if ($success) {
                      $crstype,$ccuname,$ccdomain).          #
                   &Apache::lonnet::assignrole($ccdomain,$ccuname,$courseid,   # Make the requested user a course coordinator or group coordinator
                                               'cc').'<p>');          #
     }   if (($ccdomain) && ($ccuname)) {
     if ($env{'form.setkeys'}) {      $r->print(&mt('Assigning role of [_1] Coordinator to [_2] at [_3]: ',
         $r->print(    $crstype,$ccuname,$ccdomain).
  '<p><a href="/adm/managekeys?cid='.$crsudom.'_'.$crsunum.'">'.&mt('Manage Access Keys').'</a></p>');        &Apache::lonnet::assignrole($ccdomain,$ccuname,$courseid,
     }    'cc','','','','','createcourse').'<p>');
 # Flush the course logs so reverse user roles immediately updated  
     &Apache::lonnet::flushcourselogs();  
     $r->print('<p>'.&mt('Roles will be active at next login').'.</p>'.  
       '<p><a href="/adm/createcourse">'.  
       &mt('Create Another [_1]',$crstype).'</a></p>'.  
       &Apache::loncommon::end_page());  
 }  
   
 sub construct_course {  
     my ($args,$logmsg,$courseid,$crsudom,$crsunum,$udom,$uname) = @_;  
     my $outcome;  
   
 #  
 # Open course  
 #  
     my $crstype = lc($args->{'crstype'});  
     my %cenv=();  
     $$courseid=&Apache::lonnet::createcourse($args->{'course_domain'},  
                                              $args->{'cdescr'},  
                                              $args->{'curl'},  
                                              $args->{'course_home'},  
                                              $args->{'nonstandard'},  
                                              $args->{'crscode'},  
                                              $args->{'ccuname'}.':'.  
                                              $args->{'ccdomain'},  
                                              $args->{'crstype'});  
   
     # Note: The testing routines depend on this being output; see   
     # Utils::Course. This needs to at least be output as a comment  
     # if anyone ever decides to not show this, and Utils::Course::new  
     # will need to be suitably modified.  
     $outcome .= &mt('New LON-CAPA [_1] ID: [_2]<br />',$crstype,$$courseid);  
 #  
 # Check if created correctly  
 #  
     ($$crsudom,$$crsunum)=($$courseid=~/^\/(\w+)\/(\w+)$/);  
     my $crsuhome=&Apache::lonnet::homeserver($$crsunum,$$crsudom);  
     $outcome .= &mt('Created on').': '.$crsuhome.'<br>';  
 #  
 # Are we cloning?  
 #  
     my $cloneid='';  
     if (($args->{'clonecourse'}) && ($args->{'clonedomain'})) {  
  $cloneid='/'.$args->{'clonedomain'}.'/'.$args->{'clonecourse'};  
         my ($clonecrsudom,$clonecrsunum)=($cloneid=~/^\/(\w+)\/(\w+)$/);  
  my $clonehome=&Apache::lonnet::homeserver($clonecrsunum,$clonecrsudom);  
  if ($clonehome eq 'no_host') {  
     $outcome .=  
     '<br /><font color="red">'.&mt('Attempting to clone non-existing [_1]',$crstype).' '.$cloneid.'</font>';  
  } else {  
     $outcome .=   
     '<br /><font color="green">'.&mt('Cloning [_1] from [_2]',$crstype,$clonehome).'</font>';  
     my %oldcenv=&Apache::lonnet::dump('environment',$$crsudom,$$crsunum);  
 # Copy all files  
     &copycoursefiles($cloneid,$$courseid);  
 # Restore URL  
     $cenv{'url'}=$oldcenv{'url'};  
 # Restore title  
     $cenv{'description'}=$oldcenv{'description'};  
 # restore grading mode  
     if (defined($oldcenv{'grading'})) {  
  $cenv{'grading'}=$oldcenv{'grading'};  
     }  
 # Mark as cloned  
     $cenv{'clonedfrom'}=$cloneid;  
     delete($cenv{'default_enrollment_start_date'});  
     delete($cenv{'default_enrollment_end_date'});  
  }   }
     }   if ($env{'form.setkeys'}) {
 #      $r->print(
 # Set environment (will override cloned, if existing)        '<p><a href="/adm/managekeys?cid='.$crsudom.'_'.$crsunum.'">'.&mt('Manage Access Keys').'</a></p>');
 #  
     my @sections = ();  
     my @xlists = ();  
     if ($args->{'crstype'}) {  
         $cenv{'type'}=$args->{'crstype'};  
     }  
     if ($args->{'crsid'}) {  
         $cenv{'courseid'}=$args->{'crsid'};  
     }  
     if ($args->{'crscode'}) {  
         $cenv{'internal.coursecode'}=$args->{'crscode'};  
     }  
     if ($args->{'crsquota'} ne '') {  
         $cenv{'internal.coursequota'}=$args->{'crsquota'};  
     } else {  
         $cenv{'internal.coursequota'}=$args->{'crsquota'} = 20;  
     }  
     if ($args->{'ccuname'}) {  
         $cenv{'internal.courseowner'} = $args->{'ccuname'}.  
                                         ':'.$args->{'ccdomain'};  
     } else {  
         $cenv{'internal.courseowner'} = $args->{'curruser'};  
     }  
   
     my @badclasses = (); # Used to accumulate sections/crosslistings that did not pass classlist access check for course owner.  
     if ($args->{'crssections'}) {  
         $cenv{'internal.sectionnums'} = '';  
         if ($args->{'crssections'} =~ m/,/) {  
             @sections = split/,/,$args->{'crssections'};  
         } else {  
             $sections[0] = $args->{'crssections'};  
         }  
         if (@sections > 0) {  
             foreach my $item (@sections) {  
                 my ($sec,$gp) = split/:/,$item;  
                 my $class = $args->{'crscode'}.$sec;  
                 my $addcheck = &Apache::lonnet::auto_new_course($$crsunum,$$crsudom,$class,$cenv{'internal.courseowner'});  
                 $cenv{'internal.sectionnums'} .= $item.',';  
                 unless ($addcheck eq 'ok') {  
                     push @badclasses, $class;  
                 }  
             }  
             $cenv{'internal.sectionnums'} =~ s/,$//;  
         }  
     }  
 # do not hide course coordinator from staff listing,   
 # even if privileged  
     $cenv{'nothideprivileged'}=$args->{'ccuname'}.':'.$args->{'ccdomain'};  
 # add crosslistings  
     if ($args->{'crsxlist'}) {  
         $cenv{'internal.crosslistings'}='';  
         if ($args->{'crsxlist'} =~ m/,/) {  
             @xlists = split/,/,$args->{'crsxlist'};  
         } else {  
             $xlists[0] = $args->{'crsxlist'};  
         }  
         if (@xlists > 0) {  
             foreach my $item (@xlists) {  
                 my ($xl,$gp) = split/:/,$item;  
                 my $addcheck =  &Apache::lonnet::auto_new_course($$crsunum,$$crsudom,$xl,$cenv{'internal.courseowner'});  
                 $cenv{'internal.crosslistings'} .= $item.',';  
                 unless ($addcheck eq 'ok') {  
                     push @badclasses, $xl;  
                 }  
             }  
             $cenv{'internal.crosslistings'} =~ s/,$//;  
         }  
     }  
     if ($args->{'autoadds'}) {  
         $cenv{'internal.autoadds'}=$args->{'autoadds'};  
     }  
     if ($args->{'autodrops'}) {  
         $cenv{'internal.autodrops'}=$args->{'autodrops'};  
     }  
 # check for notification of enrollment changes  
     my @notified = ();  
     if ($args->{'notify_owner'}) {  
         if ($args->{'ccuname'} ne '') {  
             push(@notified,$args->{'ccuname'}.':'.$args->{'ccdomain'});  
         }  
     }  
     if ($args->{'notify_dc'}) {  
         if ($uname ne '') {   
             push(@notified,$uname.'@'.$udom);  
         }  
     }  
     if (@notified > 0) {  
         my $notifylist;  
         if (@notified > 1) {  
             $notifylist = join(',',@notified);  
         } else {  
             $notifylist = $notified[0];  
         }  
         $cenv{'internal.notifylist'} = $notifylist;  
     }  
     if (@badclasses > 0) {  
         my %lt=&Apache::lonlocal::texthash(  
                 'tclb' => 'The courses listed below were included as sections or crosslistings affiliated with your new LON-CAPA course.  However, if automated course roster updates are enabled for this class, these particular sections/crosslistings will not contribute towards enrollment, because the user identified as the course owner for this LON-CAPA course',  
                 'dnhr' => 'does not have rights to access enrollment in these classes',  
                 'adby' => 'as determined by the policies of your institution on access to official classlists'  
         );  
         $outcome .= '<font color="red">'.$lt{'tclb'}.' ('.$cenv{'internal.courseowner'}.') - '.$lt{'dnhr'}.' ('.$lt{'adby'}.').<br /><ul>'."\n";  
         foreach (@badclasses) {  
             $outcome .= "<li>$_</li>\n";  
         }  
         $outcome .= "</ul><br /><br /></font>\n";  
     }  
     if ($args->{'no_end_date'}) {  
         $args->{'endaccess'} = 0;  
     }  
     $cenv{'internal.autostart'}=$args->{'enrollstart'};  
     $cenv{'internal.autoend'}=$args->{'enrollend'};  
     $cenv{'default_enrollment_start_date'}=$args->{'startaccess'};  
     $cenv{'default_enrollment_end_date'}=$args->{'endaccess'};  
     if ($args->{'showphotos'}) {  
       $cenv{'internal.showphotos'}=$args->{'showphotos'};  
     }  
     $cenv{'internal.authtype'} = $args->{'authtype'};  
     $cenv{'internal.autharg'} = $args->{'autharg'};   
     if ( ($cenv{'internal.authtype'} =~ /^krb/) && ($cenv{'internal.autoadds'} == 1)) {  
         if (! defined($cenv{'internal.autharg'}) || $cenv{'internal.autharg'}  eq '') {  
             $outcome .= '<font color="red" size="+1">'.  
                       &mt('As you did not include the default Kerberos domain to be used for authentication in this class, the institutional data used by the automated enrollment process must include the Kerberos domain for each new student').'</font></p>';  
         }  
     }  
     if (($args->{'ccdomain'}) && ($args->{'ccuname'})) {  
        if ($args->{'setpolicy'}) {  
            $cenv{'policy.email'}=$args->{'ccuname'}.':'.$args->{'ccdomain'};  
        }  
        if ($args->{'setcontent'}) {  
            $cenv{'question.email'}=$args->{'ccuname'}.':'.$args->{'ccdomain'};  
        }  
     }  
     if ($args->{'reshome'}) {  
  $cenv{'reshome'}=$args->{'reshome'}.'/';  
  $cenv{'reshome'}=~s/\/+$/\//;  
     }  
 #  
 # course has keyed access  
 #  
     if ($args->{'setkeys'}) {  
        $cenv{'keyaccess'}='yes';  
     }  
 # if specified, key authority is not course, but user  
 # only active if keyaccess is yes  
     if ($args->{'keyauth'}) {  
  $args->{'keyauth'}=~s/[^\w\@]//g;  
  if ($args->{'keyauth'}) {  
     $cenv{'keyauth'}=$args->{'keyauth'};  
  }   }
           # Flush the course logs so reverse user roles immediately updated
    &Apache::lonnet::flushcourselogs();
    $r->print('<p>'.&mt('Roles will be active at next login').'.</p>');
     }      }
       $r->print('<p><a href="/adm/createcourse?phase='.lc($crstype).'one">'.
     if ($args->{'disresdis'}) {        &mt('Create Another [_1]',$crstype).'</a></p>'.
         $cenv{'pch.roles.denied'}='st';        &Apache::loncommon::end_page());
     }  
     if ($args->{'disablechat'}) {  
         $cenv{'plc.roles.denied'}='st';  
     }  
   
     # Record we've not yet viewed the Course Initialization Helper for this   
     # course  
     $cenv{'course.helper.not.run'} = 1;  
     #  
     # Use new Randomseed  
     #  
     $cenv{'rndseed'}=&Apache::lonnet::latest_rnd_algorithm_id();;  
     $cenv{'receiptalg'}=&Apache::lonnet::latest_receipt_algorithm_id();;  
     #  
     # The encryption code and receipt prefix for this course  
     #  
     $cenv{'internal.encseed'}=$Apache::lonnet::perlvar{'lonReceipt'}.$$.time.int(rand(9999));  
     $cenv{'internal.encpref'}=100+int(9*rand(99));  
     #  
     # By default, use standard grading  
     if (!defined($cenv{'grading'})) { $cenv{'grading'} = 'standard'; }  
   
     $outcome .= ('<br />'.&mt('Setting environment').': '.                   
           &Apache::lonnet::put('environment',\%cenv,$$crsudom,$$crsunum).'<br>');  
 #  
 # Open all assignments  
 #  
     if ($args->{'openall'}) {  
        my $storeunder=$$crsudom.'_'.$$crsunum.'.0.opendate';  
        my %storecontent = ($storeunder         => time,  
                            $storeunder.'.type' => 'date_start');  
          
        $outcome .= &mt('Opening all assignments').': '.&Apache::lonnet::cput  
                  ('resourcedata',\%storecontent,$$crsudom,$$crsunum).'<br>';  
    }  
 #  
 # Set first page  
 #  
     unless (($args->{'nonstandard'}) || ($args->{'firstres'} eq 'blank')  
     || ($cloneid)) {  
  $outcome .= &mt('Setting first resource').': ';  
         my ($errtext,$fatal)=  
            &Apache::londocs::mapread($$crsunum,$$crsudom,'default.sequence');  
         $outcome .= ($fatal?$errtext:'read ok').' - ';  
         my $title; my $url;  
         if ($args->{'firstres'} eq 'syl') {  
     $title='Syllabus';  
             $url='/public/'.$$crsudom.'/'.$$crsunum.'/syllabus';  
         } else {  
             $title='Navigate Contents';  
             $url='/adm/navmaps';  
         }  
         $Apache::lonratedt::resources[1]=$title.':'.$url.':false:start:res';  
         ($errtext,$fatal)=  
            &Apache::londocs::storemap($$crsunum,$$crsudom,'default.sequence');  
         $outcome .= ($fatal?$errtext:'write ok').'<br>';  
     }  
     return $outcome;  
 }  }
   
 sub print_intro_page {  sub print_intro_page {
Line 1199  sub print_intro_page { Line 741  sub print_intro_page {
     &mt('Create a new course by completing an online form.'),      &mt('Create a new course by completing an online form.'),
                  },                   },
                    { internal_name => 'groupone',                     { internal_name => 'groupone',
                      name => &mt('Create a single collaborative group space '),                       name => &mt('Create a single collaborative group space'),
                      short_description =>                       short_description =>
     &mt('Create a new group space for non-course use by completing an online form .'),      &mt('Create a new group space for non-course use by completing an online form.'),
                  },                   },
                    { internal_name => 'batchone',                     { internal_name => 'batchone',
                      name => &mt('Create courses/groups by uploading an attributes file'),                       name => &mt('Create courses/groups by uploading an attributes file'),
                      short_description =>                       short_description =>
     &mt('Upload an attributes file containing specifications for one or more courses or groups in XML format'),      &mt('Upload an attributes file containing specifications for one or more courses or groups in XML format.'),
                        help => 'Batch_Creation',
                  },                   },
     );      );
     my $options;      my $options;
     foreach my $choice (@choices) {      foreach my $choice (@choices) {
         $options .='    <h3><a href="/adm/createcourse?phase='.          $options .='    <h3><a href="/adm/createcourse?phase='.
             $choice->{'internal_name'}.'" >'.              $choice->{'internal_name'}.'" >'.
             $choice->{'name'}."</a></h3>\n";              $choice->{'name'}.'</a>';
         $options .= '    '.('&nbsp;'x8).$choice->{'short_description'}.          if (exists($choice->{'help'})) {
               $options .= &Apache::loncommon::help_open_topic($choice->{'help'});
           }
           $options .= "</h3>\n".'    '.('&nbsp;'x8).$choice->{'short_description'}.
             "\n";              "\n";
     }      }
   
Line 1281  sub process_batchfile { Line 827  sub process_batchfile {
             }              }
         }          }
     }      }
     $r->print($start_page.$crumbs.$result.$end_page);      $r->print($start_page.$crumbs.$logmsg.$result.'<br /><a href="/adm/createcourse">'.
                 &mt('Creation options menu').'</a>'.$end_page);
     
 }  }
   

Removed from v.1.95  
changed lines
  Added in v.1.109


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