Diff for /loncom/interface/loncreatecourse.pm between versions 1.29 and 1.39

version 1.29, 2003/08/30 18:49:10 version 1.39, 2003/11/12 21:37:07
Line 47  use Apache::lonnet; Line 47  use Apache::lonnet;
 use Apache::loncommon;  use Apache::loncommon;
 use Apache::lonratedt;  use Apache::lonratedt;
 use Apache::londocs;  use Apache::londocs;
   use Apache::lonlocal;
 # -------------------------------------------- Return path to profile directory  
   
 sub propath {  
     my ($udom,$uname)=@_;  
     $udom=~s/\W//g;  
     $uname=~s/\W//g;  
     my $subdir=$uname.'__';  
     $subdir =~ s/(.)(.)(.).*/$1\/$2\/$3/;  
     my $proname="$Apache::lonnet::perlvar{'lonUsersDir'}/$udom/$subdir/$uname";  
     return $proname;  
 }   
   
 # ================================================ Get course directory listing  # ================================================ Get course directory listing
   
Line 68  sub crsdirlist { Line 57  sub crsdirlist {
     my %crsdata=&Apache::lonnet::coursedescription($courseid);      my %crsdata=&Apache::lonnet::coursedescription($courseid);
     my @listing=&Apache::lonnet::dirlist      my @listing=&Apache::lonnet::dirlist
  ($which,$crsdata{'domain'},$crsdata{'num'},   ($which,$crsdata{'domain'},$crsdata{'num'},
  &propath($crsdata{'domain'},$crsdata{'num'}));   &Apache::loncommon::propath($crsdata{'domain'},$crsdata{'num'}));
     my @output=();      my @output=();
     foreach (@listing) {      foreach (@listing) {
  unless ($_=~/^\./) {   unless ($_=~/^\./) {
Line 90  sub readfile { Line 79  sub readfile {
 # ============================================================ Write a userfile  # ============================================================ Write a userfile
   
 sub writefile {  sub writefile {
     my ($courseid,$which,$data)=@_;      (my $courseid, my $which,$ENV{'form.output'})=@_;
     my %crsdata=&Apache::lonnet::coursedescription($courseid);      my %crsdata=&Apache::lonnet::coursedescription($courseid);
     $ENV{'form.output'}=$data;  
     return &Apache::lonnet::finishuserfileupload(      return &Apache::lonnet::finishuserfileupload(
   $crsdata{'num'},$crsdata{'domain'},    $crsdata{'num'},$crsdata{'domain'},
   $crsdata{'home'},    $crsdata{'home'},
   'output',$which);    '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  # ============================================================= Copy a userfile
   
 sub copyfile {  sub copyfile {
     my ($origcrsid,$newcrsid,$which)=@_;      my ($origcrsid,$newcrsid,$which)=@_;
     return &writefile($newcrsid,$which,&readfile($origcrsid,$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'}.'/'
               )));
       }
   }
   
   # =============================================================== 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'});
       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'};
       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/) {
       $newdata{$thiskey}=$newdata{$thiskey}+$delta;
    }
       }
       return &Apache::lonnet::put
    ('resourcedata',\%newdata,$newcrsdata{'domain'},$newcrsdata{'num'});
   }
   
   # ========================================================== Copy all userfiles
   
   sub copyuserfiles {
       my ($origcrsid,$newcrsid)=@_;
       foreach (&crsdirlist($origcrsid,'userfiles')) {
    &copyfile($origcrsid,$newcrsid,$_);
       }
   }
   # ========================================================== Copy all userfiles
   
   sub copydbfiles {
       my ($origcrsid,$newcrsid)=@_;
       foreach (&crsdirlist($origcrsid)) {
    if ($_=~/\.db$/) {
       unless 
                ($_=~/^(nohist\_|discussiontimes|classlist|versionupdate|resourcedata)/) {
    &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
Line 124  sub print_course_creation_page { Line 238  sub print_course_creation_page {
     my $domform = &Apache::loncommon::select_dom_form($defdom,'ccdomain');      my $domform = &Apache::loncommon::select_dom_form($defdom,'ccdomain');
     my $bodytag=&Apache::loncommon::bodytag('Create a New Course');      my $bodytag=&Apache::loncommon::bodytag('Create a New Course');
     my $helplink=&Apache::loncommon::help_open_topic('Create_Course','Help on Creating Courses');      my $helplink=&Apache::loncommon::help_open_topic('Create_Course','Help on Creating Courses');
       my $cloneform=&Apache::loncommon::select_dom_form
    ($ENV{'request.role.domain'},'clonedomain').
        &Apache::loncommon::selectcourse_link
        ('ccrs','clonecourse','clonedomain');
       my $coursebrowserjs=&Apache::loncommon::coursebrowser_javascript();
     $r->print(<<ENDDOCUMENT);      $r->print(<<ENDDOCUMENT);
 <html>  <html>
 <script language="JavaScript" type="text/javascript">  <script language="JavaScript" type="text/javascript">
Line 145  function openbrowser(formname,elementnam Line 264  function openbrowser(formname,elementnam
     editbrowser.focus();      editbrowser.focus();
 }  }
 </script>  </script>
   $coursebrowserjs
 <head>  <head>
 <title>The LearningOnline Network with CAPA</title>  <title>The LearningOnline Network with CAPA</title>
 </head>  </head>
Line 162  $helplink Line 282  $helplink
 <input type="text" size="30" name="crsid">  <input type="text" size="30" name="crsid">
 </p>  </p>
 <h2>Course Content</h2>  <h2>Course Content</h2>
   <table border="2">
   <tr><th>Completely new course</th><th>Clone an existing course</th></tr>
   <tr><td>
 <p>  <p>
 <b>Map:</b>  <b>Map:</b>
 <input type="text" size="50" name="topmap">  <input type="text" size="50" name="topmap">
 <a href="javascript:openbrowser('ccrs','topmap')">Select Map</a>  <a href="javascript:openbrowser('ccrs','topmap')">Select Map</a>
 </p><p>  </p><p>
 <b>Do NOT generate as standard course</b>   <b>Do NOT generate as standard course</b><br /> 
 (only check if you know what you are doing):  (only check if you know what you are doing):
 <input type="checkbox" name="nonstandard">  <input type="checkbox" name="nonstandard">
 </p>  </p>
 <p>  <p>
 <b>First Resource</b> (standard courses only):  <b>First Resource</b><br />(standard courses only):
 <input type="radio" name="firstres" value="blank">Blank  <input type="radio" name="firstres" value="blank">Blank
 &nbsp;  &nbsp;
 <input type="radio" name="firstres" value="syl" checked>Syllabus  <input type="radio" name="firstres" value="syl" checked>Syllabus
 &nbsp;  &nbsp;
 <input type="radio" name="firstres" value="nav">Navigate  <input type="radio" name="firstres" value="nav">Navigate
 </p>  </p>
   </td><td>
   Course ID: <input input type="text" size="25" name="clonecourse" value="" />
   <br />
   Domain: 
   $cloneform<br />&nbsp;<br />
   Additional settings, if specified below, will override cloned settings.
   </td></tr>
   </table>
 <h2>Assessment Parameters</h2>  <h2>Assessment Parameters</h2>
 <p>  <p>
 <b>Open all assessments: </b>  <b>Open all assessments: </b>
Line 261  ENDENHEAD Line 391  ENDENHEAD
 #  #
 # Open course  # Open course
 #  #
       my %cenv=();
     my $courseid=&Apache::lonnet::createcourse($ENV{'request.role.domain'},      my $courseid=&Apache::lonnet::createcourse($ENV{'request.role.domain'},
                                                $cdescr,$curl,                                                 $cdescr,$curl,
                                                $ENV{'form.course_home'},                                                 $ENV{'form.course_home'},
Line 278  ENDENHEAD Line 409  ENDENHEAD
     my $crsuhome=&Apache::lonnet::homeserver($crsunum,$crsudom);      my $crsuhome=&Apache::lonnet::homeserver($crsunum,$crsudom);
     $r->print('Created on: '.$crsuhome.'<br>');      $r->print('Created on: '.$crsuhome.'<br>');
 #  #
 # Set environment  # Are we cloning?
   #
       my $cloneid='';
       if (($ENV{'form.clonecourse'}) && ($ENV{'form.clonedomain'})) {
    $cloneid='/'.$ENV{'form.clonedomain'}.'/'.$ENV{'form.clonecourse'};
           my ($clonecrsudom,$clonecrsunum)=($cloneid=~/^\/(\w+)\/(\w+)$/);
    my $clonehome=&Apache::lonnet::homeserver($clonecrsunum,$clonecrsudom);
    if ($clonehome eq 'no_host') {
       $r->print(
       '<br /><font color="red">Attempting to clone non-existing course '.$cloneid.'</font>');
    } else {
       $r->print(
       '<br /><font color="green">Cloning course from '.$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'};
   # Mark as cloned
       $cenv{'clonedfrom'}=$cloneid;
    }
       }
   #
   # Set environment (will override cloned, if existing)
 #  #
     my %cenv=();  
     my $envflag=0;  
     if ($ENV{'form.crsid'}) {      if ($ENV{'form.crsid'}) {
  $envflag=1;  
         $cenv{'courseid'}=$ENV{'form.crsid'};          $cenv{'courseid'}=$ENV{'form.crsid'};
     }      }
     if (($ccdomain) && ($ccuname)) {      if (($ccdomain) && ($ccuname)) {
        if ($ENV{'form.setpolicy'}) {         if ($ENV{'form.setpolicy'}) {
    $envflag=1;  
            $cenv{'policy.email'}=$ccuname.':'.$ccdomain;             $cenv{'policy.email'}=$ccuname.':'.$ccdomain;
        }         }
        if ($ENV{'form.setcontent'}) {         if ($ENV{'form.setcontent'}) {
            $envflag=1;  
            $cenv{'question.email'}=$ccuname.':'.$ccdomain;             $cenv{'question.email'}=$ccuname.':'.$ccdomain;
        }         }
     }      }
     if ($ENV{'form.setkeys'}) {      if ($ENV{'form.setkeys'}) {
        $envflag=1;  
        $cenv{'keyaccess'}='yes';         $cenv{'keyaccess'}='yes';
     }      }
     if ($ENV{'form.disresdis'}) {      if ($ENV{'form.disresdis'}) {
  $envflag=1;  
         $cenv{'pch.roles.denied'}='st';          $cenv{'pch.roles.denied'}='st';
     }      }
     if ($ENV{'form.disablechat'}) {      if ($ENV{'form.disablechat'}) {
  $envflag=1;  
         $cenv{'plc.roles.denied'}='st';          $cenv{'plc.roles.denied'}='st';
     }      }
   
     # Record we've not yet viewed the Course Initialization Helper for this course      # Record we've not yet viewed the Course Initialization Helper for this 
       # course
     $cenv{'course.helper.not.run'} = 1;      $cenv{'course.helper.not.run'} = 1;
     #      #
     # Use new Randomseed      # Use new Randomseed
     #      #
     $envflag=1;  
     $cenv{'rndseed'}=&Apache::lonnet::latest_rnd_algorithm_id();;      $cenv{'rndseed'}=&Apache::lonnet::latest_rnd_algorithm_id();;
     #      #
     # By default, use standard grading      # By default, use standard grading
     $cenv{'grading'} = 'standard';      $cenv{'grading'} = 'standard';
   
     if ($envflag) {      $r->print('<br />Setting environment: '.                 
        $r->print('Setting environment: '.                   
           &Apache::lonnet::put('environment',\%cenv,$crsudom,$crsunum).'<br>');            &Apache::lonnet::put('environment',\%cenv,$crsudom,$crsunum).'<br>');
    }  
 #  #
 # Open all assignments  # Open all assignments
 #  #
     if ($ENV{'form.openall'}) {      if ($ENV{'form.openall'}) {
        my $storeunder=$crsudom.'_'.$crsunum.'.0.opendate';         my $storeunder=$crsudom.'_'.$crsunum.'.0.opendate';
        my %storecontent = ($storeunder        => time,         my %storecontent = ($storeunder         => time,
                            $storeunder.'type' => 'date_start');                             $storeunder.'.type' => 'date_start');
                 
        $r->print('Opening all assignments: '.&Apache::lonnet::cput         $r->print('Opening all assignments: '.&Apache::lonnet::cput
                  ('resourcedata',\%storecontent,$crsudom,$crsunum).'<br>');                   ('resourcedata',\%storecontent,$crsudom,$crsunum).'<br>');
Line 385  sub handler { Line 531  sub handler {
     my $r = shift;      my $r = shift;
   
     if ($r->header_only) {      if ($r->header_only) {
        $r->content_type('text/html');         &Apache::loncommon::content_type($r,'text/html');
        $r->send_http_header;         $r->send_http_header;
        return OK;         return OK;
     }      }
   
     if (&Apache::lonnet::allowed('ccc',$ENV{'request.role.domain'})) {      if (&Apache::lonnet::allowed('ccc',$ENV{'request.role.domain'})) {
        $r->content_type('text/html');         &Apache::loncommon::content_type($r,'text/html');
        $r->send_http_header;         $r->send_http_header;
   
        if ($ENV{'form.phase'} eq 'two') {         if ($ENV{'form.phase'} eq 'two') {

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


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