--- loncom/interface/loncreatecourse.pm	2002/09/26 15:19:39	1.14
+++ loncom/interface/loncreatecourse.pm	2003/09/02 19:47:47	1.32
@@ -1,7 +1,7 @@
 # The LearningOnline Network
 # Create a course
 #
-# $Id: loncreatecourse.pm,v 1.14 2002/09/26 15:19:39 matthew Exp $
+# $Id: loncreatecourse.pm,v 1.32 2003/09/02 19:47:47 www Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -48,6 +48,106 @@ use Apache::loncommon;
 use Apache::lonratedt;
 use Apache::londocs;
 
+# -------------------------------------------- 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
+
+sub crsdirlist {
+    my ($courseid,$which)=@_;
+    unless ($which) { $which=''; }
+    my %crsdata=&Apache::lonnet::coursedescription($courseid);
+    my @listing=&Apache::lonnet::dirlist
+	($which,$crsdata{'domain'},$crsdata{'num'},
+	 &propath($crsdata{'domain'},$crsdata{'num'}));
+    my @output=();
+    foreach (@listing) {
+	unless ($_=~/^\./) {
+	    push (@output,(split(/\&/,$_))[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'},
+					  $crsdata{'home'},
+					  'output',$which);
+}
+
+# ============================================================= Copy a userfile
+
+sub copyfile {
+    my ($origcrsid,$newcrsid,$which)=@_;
+    return &writefile($newcrsid,$which,&readfile($origcrsid,$which));
+}
+
+# =============================================================== 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 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)/) {
+		 &copydb($origcrsid,$newcrsid,$_);
+	     }
+	}
+    }
+}
+
+# ======================================================= Copy all course files
+
+sub copycoursefiles {
+    my ($origcrsid,$newcrsid)=@_;
+    &copyuserfiles($origcrsid,$newcrsid);
+    &copydbfiles($origcrsid,$newcrsid);
+}
+
 # ===================================================== Phase one: fill-in form
 
 sub print_course_creation_page {
@@ -65,7 +165,12 @@ sub print_course_creation_page {
     $course_home .= "\n</select>\n";
     my $domform = &Apache::loncommon::select_dom_form($defdom,'ccdomain');
     my $bodytag=&Apache::loncommon::bodytag('Create a New Course');
-
+    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);
 <html>
 <script language="JavaScript" type="text/javascript">
@@ -87,10 +192,12 @@ function openbrowser(formname,elementnam
     editbrowser.focus();
 }
 </script>
+$coursebrowserjs
 <head>
 <title>The LearningOnline Network with CAPA</title>
 </head>
 $bodytag
+$helplink
 <form action="/adm/createcourse" method="post" name="ccrs">
 <h2>Course Information</h2>
 <p>
@@ -103,24 +210,34 @@ $bodytag
 <input type="text" size="30" name="crsid">
 </p>
 <h2>Course Content</h2>
+<table border="2">
+<tr><th>Completely new course</th><th>Clone an existing course</th></tr>
+<tr><td>
 <p>
 <b>Map:</b>
 <input type="text" size="50" name="topmap">
-<a href="javascript:openbrowser('ccrs','topmap')">Browse</a>
+<a href="javascript:openbrowser('ccrs','topmap')">Select Map</a>
 </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):
 <input type="checkbox" name="nonstandard">
 </p>
 <p>
-<b>First Resource</b> (standard courses only):
-<input type="radio" name="firstres" value="blank" checked>Blank
+<b>First Resource</b><br />(standard courses only):
+<input type="radio" name="firstres" value="blank">Blank
 &nbsp;
-<input type="radio" name="firstres" value="syl">Syllabus
+<input type="radio" name="firstres" value="syl" checked>Syllabus
 &nbsp;
 <input type="radio" name="firstres" value="nav">Navigate
 </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>
 <p>
 <b>Open all assessments: </b>
@@ -134,7 +251,18 @@ $bodytag
 <b>Set content feedback to Course Coordinator: </b>
 <input type="checkbox" name="setcontent" checked>
 </p>
-
+<h2>Communication</h2>
+<p>
+<b>Disable student resource discussion: </b>
+<input type="checkbox" name="disresdis" /> <br />
+<b>Disable student use of chatrooms: </b>
+<input type="checkbox" name="disablechat" />
+</p>
+<h2>Access Control</h2>
+<p>
+<b>Students need access key to enter course: </b>
+<input type="checkbox" name="setkeys" />
+</p>
 <h2>Course Coordinator</h2>
 <p>
 <b>Username:</b> <input type="text" size="15" name="ccuname" />
@@ -191,11 +319,16 @@ ENDENHEAD
 #
 # Open course
 #
+    my %cenv=();
     my $courseid=&Apache::lonnet::createcourse($ENV{'request.role.domain'},
                                                $cdescr,$curl,
                                                $ENV{'form.course_home'},
                                                $ENV{'form.nonstandard'});
 
+    # 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.
     $r->print('New LON-CAPA Course ID: '.$courseid.'<br>');
 #
 # Check if created correctly
@@ -204,28 +337,62 @@ ENDENHEAD
     my $crsuhome=&Apache::lonnet::homeserver($crsunum,$crsudom);
     $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>');
+# Copy all files
+	    &copycoursefiles($cloneid,$courseid);
+# Restore title
+	    $cenv{'description'}=$cdescr;
+	}
+    }
+#
+# Set environment (will override cloned, if existing)
 #
-    my %cenv=();
-    my $envflag=0;
     if ($ENV{'form.crsid'}) {
-	$envflag=1;
         $cenv{'courseid'}=$ENV{'form.crsid'};
     }
     if (($ccdomain) && ($ccuname)) {
        if ($ENV{'form.setpolicy'}) {
-	   $envflag=1;
            $cenv{'policy.email'}=$ccuname.':'.$ccdomain;
        }
        if ($ENV{'form.setcontent'}) {
-           $envflag=1;
            $cenv{'question.email'}=$ccuname.':'.$ccdomain;
        }
     }
-    if ($envflag) {
-       $r->print('Setting environment: '.                 
+    if ($ENV{'form.setkeys'}) {
+       $cenv{'keyaccess'}='yes';
+    }
+    if ($ENV{'form.disresdis'}) {
+        $cenv{'pch.roles.denied'}='st';
+    }
+    if ($ENV{'form.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();;
+    #
+    # By default, use standard grading
+    $cenv{'grading'} = 'standard';
+
+    $r->print('<br />Setting environment: '.                 
           &Apache::lonnet::put('environment',\%cenv,$crsudom,$crsunum).'<br>');
-   }
 #
 # Open all assignments
 #
@@ -254,7 +421,7 @@ ENDENHEAD
             $url='/adm/navmaps';
         }
         $Apache::lonratedt::resources[1]=$title.':'.$url.':false:start:res';
-        my ($errtext,$fatal)=
+        ($errtext,$fatal)=
            &Apache::londocs::storemap($crsunum,$crsudom,'default.sequence');
         $r->print(($fatal?$errtext:'write ok').'<br>');
   }
@@ -275,7 +442,11 @@ ENDENHEAD
                $ccuname.' at '.$ccdomain.': '.
     &Apache::lonnet::assignrole($ccdomain,$ccuname,$courseid,'cc').'<p>');
    }
-    $r->print('Roles will be active at next login.</body></html>');
+    if ($ENV{'form.setkeys'}) {
+	$r->print(
+ '<p><a href="/adm/managekeys?cid='.$crsudom.'_'.$crsunum.'">Manage Access Keys</a></p>');
+    }
+    $r->print('<p>Roles will be active at next login.</p></body></html>');
 }
 
 # ===================================================================== Handler