Diff for /loncom/interface/loncreatecourse.pm between versions 1.93.2.2 and 1.111

version 1.93.2.2, 2006/06/29 17:47:19 version 1.111, 2008/11/11 16:40:43
Line 27 Line 27
 #  #
 ###  ###
   
 package Apache::loncreatecourse;  =head1 NAME
   
 use strict;  Apache::loncreatecourse.pm
 use Apache::Constants qw(:common :http);  
 use Apache::lonnet;  
 use Apache::loncommon;  
 use Apache::lonratedt;  
 use Apache::londocs;  
 use Apache::lonlocal;  
 use Apache::londropadd;  
 use LONCAPA::batchcreatecourse;  
 use lib '/home/httpd/lib/perl';  
 use LONCAPA;  
   
 # ================================================ Get course directory listing  =head1 SYNOPSIS
   
 my @output=();  Allows domain coordinators to create new
   courses and assign course coordinators.
   
 sub crsdirlist {  This is part of the LearningOnline Network with CAPA project
     my ($courseid,$which)=@_;  described at http://www.lon-capa.org.
     @output=();  
     return &innercrsdirlist($courseid,$which);  
 }  
   
 sub innercrsdirlist {  =head1 HANDLER SUBROUTINE
     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  handler()
   
 sub readfile {  =head1 OTHER SUBROUTINES
     my ($courseid,$which)=@_;  
     my %crsdata=&Apache::lonnet::coursedescription($courseid);  
     return &Apache::lonnet::getfile('/uploaded/'.$crsdata{'domain'}.'/'.  
     $crsdata{'num'}.'/'.$which);  
 }  
   
 # ============================================================ Write a userfile  =over
   
 sub writefile {  =item *
     (my $courseid, my $which,$env{'form.output'})=@_;  
     my %crsdata=&Apache::lonnet::coursedescription($courseid);  
     return &Apache::lonnet::finishuserfileupload(  
   $crsdata{'num'},$crsdata{'domain'},  
   'output',$which);  
 }  
   
 # ===================================================================== Rewrite  print_course_creation_page()
   
 sub rewritefile {  =item *
     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  create_course()
   
 sub copyfile {  =item *
     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  print_intro_page()
   
 sub copydb {  =item *
     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  upload_batchfile()
   
 sub copyresourcedb {  =item *
     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'};  process_batchfile()
     }  
     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  =back
   
 sub copyuserfiles {  
     my ($origcrsid,$newcrsid)=@_;  
     foreach (&crsdirlist($origcrsid,'userfiles')) {  
  if ($_ !~m|^scantron_|) {  
     &copyfile($origcrsid,$newcrsid,$_);  
  }  
     }  
 }  
 # ========================================================== Copy all userfiles  
   
 sub copydbfiles {  =cut
     my ($origcrsid,$newcrsid)=@_;  
   
     my ($origcrs_discussion) = ($origcrsid=~m|^/(.*)|);  package Apache::loncreatecourse;
     $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)/) {  
  &copydb($origcrsid,$newcrsid,$_);  
      }  
  }  
     }  
 }  
   
 # ======================================================= Copy all course files  
   
 sub copycoursefiles {  use strict;
     my ($origcrsid,$newcrsid)=@_;  use Apache::Constants qw(:common :http);
     &copyuserfiles($origcrsid,$newcrsid);  use Apache::lonnet;
     &copydbfiles($origcrsid,$newcrsid);  use Apache::loncommon;
     &copyresourcedb($origcrsid,$newcrsid);  use Apache::londocs;
 }  use Apache::lonlocal;
   use Apache::lonuserutils;
   use Apache::lonclonecourse;
   use LONCAPA::batchcreatecourse;
   use LONCAPA;
   
 # ===================================================== Phase one: fill-in form  # ===================================================== Phase one: fill-in form
   
 sub print_course_creation_page {  sub print_course_creation_page {
     my $r=shift;      my $r=shift;
     my $crstype = 'Course';      my $crstype = 'Group';
 #    my $crstype = 'Group';      if ($env{'form.phase'} eq 'courseone') {
 #    if ($env{'form.phase'} eq 'courseone') {          $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 283  sub print_course_creation_page { Line 114  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 171  function validate(formname) {
                     'navi' => "Navigate",                      'navi' => "Navigate",
                     'cid'  => "Course ID",                      'cid'  => "Course ID",
                     'dmn'  => "Domain",                      'dmn'  => "Domain",
                       'dsh'  => "Date Shift",
                     '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 363  function validate(formname) { Line 198  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 268  END
     'Create_Course',undef,      'Create_Course',undef,
     'Create_Courses');      'Create_Courses');
     $r->print($start_page.$crumbs);      $r->print($start_page.$crumbs);
   
     if ($crstype eq 'Course') {      if ($crstype eq 'Course') {
           $r->print('<form action="/adm/createcourse" method="post" name="ccrs">'
                    .&Apache::lonhtmlcommon::start_pick_box()
   
                    .&Apache::lonhtmlcommon::row_headline()
                    .'<h3>'.$lt{'cinf'}.'</h3>'
                    .&Apache::lonhtmlcommon::row_closure()
   
                    .&Apache::lonhtmlcommon::row_title($lt{'ctit'})
                    .'<input type="text" size="50" name="title" />'
                    .&Apache::lonhtmlcommon::row_closure()
   
                    .&Apache::lonhtmlcommon::row_title($lt{'chsr'})
                    .$course_home
                    .&Apache::lonhtmlcommon::row_closure()
   
                    .&Apache::lonhtmlcommon::row_title($lt{'cidn'}.' ('.$lt{'opt'}.')')
                    .'<input type="text" size="30" name="crsid" />'
                    .&Apache::lonhtmlcommon::row_closure()
   
                    .&Apache::lonhtmlcommon::row_headline()
                    .'<h3>'.$lt{'iinf'}.'</h3>'
                    .$lt{'stat'}
                    .&Apache::lonhtmlcommon::row_closure()
   
                    .&Apache::lonhtmlcommon::row_title($lt{'ccod'})
                    .'<input type="text" size="30" name="crscode" />'
                    .'<br />('.$lt{'toin'}.')'
                    .&Apache::lonhtmlcommon::row_closure()
   
                    .&Apache::lonhtmlcommon::row_title($lt{'snid'})
                    .'<input type="text" size="30" name="crssections" />'
                    .'<br />('.$lt{'csli'}.')'
                    .&Apache::lonhtmlcommon::row_closure()
   
                    .&Apache::lonhtmlcommon::row_title($lt{'crcs'})
                    .'<input type="text" size="30" name="crsxlist" />'
                    .'<br />('.$lt{'cscs'}.')'
                    .&Apache::lonhtmlcommon::row_closure()
           );
   
           # Table: New Course / Clone Course
           $r->print(&Apache::lonhtmlcommon::row_headline()
                    .'<h3>'.$lt{'crco'}.'</h3>'
                    .&Apache::loncommon::start_data_table()
                    .&Apache::loncommon::start_data_table_header_row()
                    .'<th>'.$lt{'cncr'}.'</th>'
                    .'<th>&nbsp;'.&mt('or').'&nbsp;</th>'
                    .'<th>'.$lt{'cecr'}.'</th>'
                    .&Apache::loncommon::end_data_table_header_row()
                    .&Apache::loncommon::start_data_table_row()
   
                    # New Course:
                    .'<td>'
                    .&Apache::lonhtmlcommon::start_pick_box()
                    .&Apache::lonhtmlcommon::row_title($lt{'map'})
                    .'<input type="text" size="50" name="topmap" />'
                    .'<a href="javascript:openbrowser(\'ccrs\',\'topmap\')">'.$lt{'smap'}.'</a>'
                    .&Apache::lonhtmlcommon::row_closure()
                    .&Apache::lonhtmlcommon::row_title('<label for="nonstd">'.$lt{'sacr'}.'</label>')
                    .'<input id="nonstd" type="checkbox" name="nonstandard" />'
                    .'<br />('.$lt{'ocik'}.')'
                    .&Apache::lonhtmlcommon::row_closure()
                    .&Apache::lonhtmlcommon::row_title($lt{'fres'})
                    .'<label>'
                    .'<input type="radio" name="firstres" value="blank" />'.$lt{'blnk'}
                    .'</label>'
                    .'&nbsp;'
                    .'<label>'
                    .'<input type="radio" name="firstres" value="syl" checked="checked" />'.$lt{'sllb'}
                    .'</label>'
                    .'&nbsp;'
                    .'<label>'
                    .'<input type="radio" name="firstres" value="nav" />'.$lt{'navi'}
                    .'</label>'
                    .'<br />('.$lt{'stco'}.')'
                    .&Apache::lonhtmlcommon::row_closure(1)
                    .&Apache::lonhtmlcommon::end_pick_box()
   
                    .'<td>&nbsp;</td>'
   
                    # Clone Course:
                    .'<td>'
                    .&Apache::lonhtmlcommon::start_pick_box()
                    .&Apache::lonhtmlcommon::row_title($lt{'cid'})
                    .'<label>'
                    .'<input type="text" size="25" name="clonecourse" value="" />'
                    .'</label>'
                    .&Apache::lonhtmlcommon::row_closure(1)
                    .&Apache::lonhtmlcommon::row_title($lt{'dmn'})
                    .'<label>'
                    .$cloneform
                    .'</label>'
                    .&Apache::lonhtmlcommon::row_closure()
                    .&Apache::lonhtmlcommon::row_title($lt{'dsh'})
                    .'<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" />'
                    .&Apache::lonhtmlcommon::row_closure()
                    .&Apache::lonhtmlcommon::row_headline()
                    .$lt{'asov'}
                    .&Apache::lonhtmlcommon::row_closure(1)
                    .&Apache::lonhtmlcommon::end_pick_box()
                    .'</td>'
                    .&Apache::loncommon::end_data_table_row()
                    .&Apache::loncommon::end_data_table()
                    .&Apache::lonhtmlcommon::row_closure()
           );
   
           $r->print(&Apache::lonhtmlcommon::row_headline()
                    .'<h3>'.$lt{'assp'}.'</h3>'
                    .&Apache::lonhtmlcommon::row_closure()
   
                    .&Apache::lonhtmlcommon::row_title($lt{'oaas'})
                    .'<input type="checkbox" name="openall" />'
                    .&Apache::lonhtmlcommon::row_closure()
   
                    .&Apache::lonhtmlcommon::row_headline()
                    .'<h3>'.$lt{'mssg'}.'</h3>'
                    .&Apache::lonhtmlcommon::row_closure()
   
                    .&Apache::lonhtmlcommon::row_title($lt{'scpf'})
                    .'<input type="checkbox" name="setpolicy" checked="checked" />'
                    .&Apache::lonhtmlcommon::row_closure()
   
                    .&Apache::lonhtmlcommon::row_title($lt{'scfc'})
                    .'<input type="checkbox" name="setcontent" checked="checked" />'
                    .&Apache::lonhtmlcommon::row_closure()
   
                    .&Apache::lonhtmlcommon::row_headline()
                    .'<h3>'.$lt{'cmmn'}.'</h3>'
                    .&Apache::lonhtmlcommon::row_closure()
   
                    .&Apache::lonhtmlcommon::row_title($lt{'dsrd'})
                    .'<input type="checkbox" name="disresdis" />'
                    .&Apache::lonhtmlcommon::row_closure()
   
                    .&Apache::lonhtmlcommon::row_title($lt{'dsuc'})
                    .'<input type="checkbox" name="disablechat" /'
                    .&Apache::lonhtmlcommon::row_closure()
   
                    .&Apache::lonhtmlcommon::row_headline()
                    .'<h3>'.$lt{'acco'}.'</h3>'
                    .&Apache::lonhtmlcommon::row_closure()
   
                    .&Apache::lonhtmlcommon::row_title($lt{'snak'})
                    .'<input type="checkbox" name="setkeys" />'
                    .&Apache::lonhtmlcommon::row_closure()
   
                    .&Apache::lonhtmlcommon::row_title($lt{'kaut'})
                    .'<input type="text" size="30" name="keyauth" />'
                    .&Apache::lonhtmlcommon::row_closure()
   
                    .&Apache::lonhtmlcommon::row_headline()
                    .'<h3>'.$lt{'rshm'}.'</h3>'
                    .&Apache::lonhtmlcommon::row_closure()
   
                    .&Apache::lonhtmlcommon::row_title($lt{'rshm'})
                    .'<input type="text" name="reshome" size="30" value="/res/'.$defdom.'/" />'
                    .&Apache::lonhtmlcommon::row_closure()
   
                    .&Apache::lonhtmlcommon::row_headline()
                    .'<h3>'.$lt{'aens'}.'</h3>'
                    .&Apache::lonhtmlcommon::row_closure()
   
                    .&Apache::lonhtmlcommon::row_title($lt{'aadd'})
                    .'<label><input type="radio" name="autoadds" value="1" />'.$lt{'yes'}.'</label>'
                    .'<label><input type="radio" name="autoadds" value="0" checked="checked" />'.$lt{'no'}.'</label>'
                    .&Apache::lonhtmlcommon::row_closure()
   
                    .&Apache::lonhtmlcommon::row_title($lt{'audr'})
                    .'<label><input type="radio" name="autodrops" value="1" />'.$lt{'yes'}.'</label>'
                    .'<label><input type="radio" name="autodrops" value="0" checked="checked" />'.$lt{'no'}.'</label>'
                    .&Apache::lonhtmlcommon::row_closure()
   
                    .&Apache::lonhtmlcommon::row_title($lt{'dacu'})
                    .$enroll_table
                    .&Apache::lonhtmlcommon::row_closure()
   
                    .&Apache::lonhtmlcommon::row_title($lt{'dacc'})
                    .$access_table
                    .&Apache::lonhtmlcommon::row_closure()
   
                    .&Apache::lonhtmlcommon::row_title($lt{'psam'})
                    .$lt{'pcda'}.'<br />'
                    .$krbform.'<br />'
                    .$intform.'<br />'
                    .$locform
                    .&Apache::lonhtmlcommon::row_closure()
   
                    .&Apache::lonhtmlcommon::row_title($lt{'nech'})
                    .$lt{'nccl'}.'<br/>'
                    .'<label><input type="radio" name="notify_owner" value="1" />'.$lt{'yes'}.'</label>'
                    .'<label><input type="radio" name="notify_owner" value="0" checked="checked" />'.$lt{'no'}.'</label>'
                    .'<br />'
                    .$lt{'ndcl'}.'<br/>'
                    .'<label><input type="radio" name="notify_dc" value="1" />'.$lt{'yes'}.'</label>'
                    .'<label><input type="radio" name="notify_dc" value="0" checked="checked" />'.$lt{'no'}.'</label>'
                    .&Apache::lonhtmlcommon::row_closure()
   
                    .&Apache::lonhtmlcommon::row_title($lt{'irsp'})
                    .'<label>'
                    .'<input type="radio" name="showphotos" value="1" />'.$lt{'yes'}
                    .'</label> '
                    .'<label>'
                    .'<input type="radio" name="showphotos" value="0" checked="checked" />'.$lt{'no'}
                    .'</label> '
                    .&Apache::lonhtmlcommon::row_closure()
   
                    .&Apache::lonhtmlcommon::row_headline()
                    .'<h3>'.$lt{'cgrs'}.'</h3>'
                    .&Apache::lonhtmlcommon::row_closure()
   
                    .&Apache::lonhtmlcommon::row_title($lt{'cgrq'})
                    .'<input type="text" name="crsquota" value="20" size="6" />Mb'
                    .&Apache::lonhtmlcommon::row_closure()
   
                    .&Apache::lonhtmlcommon::row_headline()
                    .'<h3>'.$lt{'cc'}.'</h3>'
                    .&Apache::lonhtmlcommon::row_closure()
   
                    .&Apache::lonhtmlcommon::row_title($lt{'user'})
                    .'<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);          $r->print(<<ENDDOCUMENT);
 <form action="/adm/createcourse" method="post" name="ccrs">  
 <h2>$lt{'cinf'}</h2>  
 <p>  
 <label><b>$lt{'ctit'}:</b>  
 <input type="text" size="50" name="title" /></label>  
 </p><p>  
 <label>  
     <b>$lt{'chsr'}:</b>$course_home  
 </label>  
 </p><p>  
 <label>  
     <b>$lt{'cidn'} ($lt{'opt'})</b>  
     <input type="text" size="30" name="crsid" />  
 </label>  
 </p><p>  
 <h2>$lt{'iinf'}</h2>  
 <p>  
 $lt{'stat'}  
 </p><p>  
 <label>  
     <b>$lt{'ccod'}</b>  
     <input type="text" size="30" name="crscode" />  
 </label>  
 <br/>  
 ($lt{'toin'})  
 </p><p>  
 <label>  
     <b>$lt{'snid'}</b>  
     <input type="text" size="30" name="crssections" />  
 </label>  
 <br/>  
 ($lt{'csli'})  
 </p><p>  
 <label>  
     <b>$lt{'crcs'}</b>  
     <input type="text" size="30" name="crsxlist" />  
 </label>  
 <br/>  
 ($lt{'cscs'})  
 </p>  
 <h2>$lt{'crco'}</h2>  
 <table border="2">  
 <tr><th>$lt{'cncr'}</th><th>$lt{'cecr'}</th></tr>  
 <tr><td>  
 <p>  
 <label>  
     <b>$lt{'map'}:</b>  
     <input type="text" size="50" name="topmap" />  
 </label>  
 <a href="javascript:openbrowser('ccrs','topmap')">$lt{'smap'}</a>  
 </p><p>  
 <label for="nonstd"><b>$lt{'sacr'}</b></label>  
 <br />  
 ($lt{'ocik'}):  
 <input id="nonstd" type="checkbox" name="nonstandard" />  
 </p><p>  
 <b>$lt{'fres'}</b><br />($lt{'stco'}):  
 <label>  
     <input type="radio" name="firstres" value="blank" />$lt{'blnk'}  
 </label>  
 &nbsp;  
 <label>  
     <input type="radio" name="firstres" value="syl" checked />$lt{'sllb'}  
 </label>  
 &nbsp;  
 <label>  
     <input type="radio" name="firstres" value="nav" />$lt{'navi'}  
 </label>  
 </p>  
 </td><td>  
 <label>  
     $lt{'cid'}: <input type="text" size="25" name="clonecourse" value="" />  
 </label>  
 <br />  
 <label>  
     $lt{'dmn'}: $cloneform  
 </label>  
 <br />  
 &nbsp;<br />  
 $lt{'asov'}.  
 </td></tr>  
 </table>  
 <h2>$lt{'assp'}</h2>  
 <p>  
 <label>  
     <b>$lt{'oaas'}: </b>  
     <input type="checkbox" name="openall" />  
 </label>  
 </p>  
 <h2>$lt{'mssg'}</h2>  
 <p>  
 <label>  
     <b>$lt{'scpf'}: </b>  
     <input type="checkbox" name="setpolicy" checked />  
 </label>  
 <br />  
 <label>  
     <b>$lt{'scfc'}: </b>  
     <input type="checkbox" name="setcontent" checked />  
 </label>  
 </p>  
 <h2>$lt{'cmmn'}</h2>  
 <p>  
 <label>  
     <b>$lt{'dsrd'}: </b>  
     <input type="checkbox" name="disresdis" />  
 </label>  
 <br />  
 <label>  
     <b>$lt{'dsuc'}: </b>  
     <input type="checkbox" name="disablechat" />  
 </label>  
 </p>  
 <h2>$lt{'acco'}</h2>  
 <p>  
 <label>  
     <b>$lt{'snak'}: </b>  
     <input type="checkbox" name="setkeys" />  
 </label>  
 <br />  
 <label>  
     <b>$lt{'kaut'}: </b>  
     <input type="text" size="30" name="keyauth" />  
 </label>  
 </p>  
 <h2>$lt{'rshm'}</h2>  
 <p>  
 <label>  
     <b>$lt{'rshm'}: </b>  
     <input type="text" name="reshome" size="30" value="/res/$defdom/" />  
 </label>  
 </p>  
 <p>  
 <h2>$lt{'aens'}</h2>  
 $lt{'aesc'}  
 </p>  
 <p>  
 <b>$lt{'aadd'}</b>  
 <label><input type="radio" name="autoadds" value="1" />$lt{'yes'}</label>   
 <label><input type="radio" name="autoadds" value="0" checked="true" />$lt{'no'}  
 </label>  
 </p><p>  
 <b>$lt{'audr'}</b>  
 <label><input type="radio" name="autodrops" value="1" />$lt{'yes'}</label>   
 <label><input type="radio" name="autodrops" value="0" checked="true" />$lt{'no'}</label>  
 </p><p>  
 <b>$lt{'dacu'}</b>  
 $enroll_table  
 </p><p>  
 <b>$lt{'dacc'}</b>  
 $access_table  
 <p></p>  
 <b>$lt{'psam'}.</b><br />  
 $lt{'pcda'}.  
 </p><p>  
 $krbform  
 <br />  
 $intform  
 <br />  
 $locform  
 </p><p>  
 <b>$lt{'nech'}</b><br />  
 $lt{'nccl'}<br/>  
 <label>  
     <input type="radio" name="notify_owner" value="1" />$lt{'yes'}  
 </label>   
 <label>  
     <input type="radio" name="notify_owner" value="0" checked="true" />$lt{'no'}  
 </label>  
 <br />  
 $lt{'ndcl'}<br/>  
 <label>  
     <input type="radio" name="notify_dc" value="1" />$lt{'yes'}  
 </label>  
 <label>  
     <input type="radio" name="notify_dc" value="0" checked="true" />$lt{'no'}  
 </label>  
 </p><p>  
 <b>$lt{'irsp'}</b>  
 <label>  
     <input type="radio" name="showphotos" value="1" />$lt{'yes'}  
 </label>   
 <label>  
     <input type="radio" name="showphotos" value="0" checked="true" />$lt{'no'}  
 </label>  
 </p>  
 <p>  
 <h2>$lt{'cgrs'}</h2>  
 $lt{'cgrq'}  
 <input type="text" name="crsquota" value="20" size="6" />Mb   
 </p>  
 <hr />  
 <h2>$lt{'cc'}</h2>  
 <p>  
 <label>  
     <b>$lt{'user'}:</b> <input type="text" size="15" name="ccuname" />  
 </label>  
 </p><p>  
 <label>  
     <b>$lt{'dmn'}:</b> $domform  
 </label>  
 </p>  
 <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 644  $lt{'cgrq'} Line 516  $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 683  ENDDOCUMENT Line 556  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 699  ENDDOCUMENT Line 572  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 709  $lt{'asov'}. Line 585  $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 779  ENDDOCUMENT Line 655  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 790  sub create_course { Line 664  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 832  sub create_course { Line 705  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'},                 curruser => $env{'user.name'}.':'.$env{'user.domain'},
                crssections => $env{'form.crssections'},                 crssections => $env{'form.crssections'},
                crsxlist => $env{'form.crsxlist'},                 crsxlist => $env{'form.crsxlist'},
                autoadds => $env{'form.autoadds'},                 autoadds => $env{'form.autoadds'},
Line 865  sub create_course { Line 740  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->{'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'};  
     } 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 {
     my $r = shift;      my $r = shift;
     my $start_page =      my $start_page =
         &Apache::loncommon::start_page('Create a New Course');          &Apache::loncommon::start_page('Create a New Course or Group Space');
     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();
Line 1197  sub print_intro_page { Line 806  sub print_intro_page {
                      short_description =>                       short_description =>
     &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 1229  sub upload_batchfile { Line 842  sub upload_batchfile {
     my $r = shift;      my $r = shift;
     my $start_page =      my $start_page =
         &Apache::loncommon::start_page('Create a New Course or Group Space');          &Apache::loncommon::start_page('Create a New Course or Group Space');
     my $crumbs = &Apache::lonhtmlcommon::breadcrumbs('Upload Course Attributes File','Create_Course',undef,'Create_Courses');      my $crumbs = &Apache::lonhtmlcommon::breadcrumbs('Upload Course/Group 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 attributes file').'</h3>');      $r->print('<h3>'.&mt('Upload a courses or groups 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" />'.
Line 1280  sub process_batchfile { Line 893  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.93.2.2  
changed lines
  Added in v.1.111


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