--- loncom/interface/loncreatecourse.pm	2004/06/08 22:09:44	1.58
+++ loncom/interface/loncreatecourse.pm	2004/08/25 20:48:04	1.66
@@ -1,7 +1,7 @@
-#meserver The LearningOnline Network
+# The LearningOnline Network
 # Create a course
 #
-# $Id: loncreatecourse.pm,v 1.58 2004/06/08 22:09:44 raeburn Exp $
+# $Id: loncreatecourse.pm,v 1.66 2004/08/25 20:48:04 albertel Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -42,19 +42,34 @@ use localenroll;
 
 # ================================================ Get course directory listing
 
-#FIXME - doesn't support directories under /userfiles/ BUG#2999
+my @output=();
+
 sub crsdirlist {
     my ($courseid,$which)=@_;
-    unless ($which) { $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'},
 	 &Apache::loncommon::propath($crsdata{'domain'},$crsdata{'num'}));
-    my @output=();
     foreach (@listing) {
-	#FIXME if list is a DIR need to recurse
 	unless ($_=~/^\./) {
-	    push (@output,(split(/\&/,$_))[0]);
+	    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;
@@ -108,7 +123,9 @@ sub copyfile {
                      &readfile($origcrsid,$which),
 	    (
        '/uploaded/'.$origcrsdata{'domain'}.'/'.$origcrsdata{'num'}.'/'
-    => '/uploaded/'. $newcrsdata{'domain'}.'/'. $newcrsdata{'num'}.'/'
+    => '/uploaded/'. $newcrsdata{'domain'}.'/'. $newcrsdata{'num'}.'/',
+       '/public/'.$origcrsdata{'domain'}.'/'.$origcrsdata{'num'}.'/'
+    => '/public/'. $newcrsdata{'domain'}.'/'. $newcrsdata{'num'}.'/'
             )));
     }
 }
@@ -238,7 +255,8 @@ sub print_course_creation_page {
     my $coursebrowserjs=&Apache::loncommon::coursebrowser_javascript();
     my $starttime = time;
     my $endtime = time+(6*30*24*60*60); # 6 months from now, approx
-    my $date_table = &Apache::londropadd::date_setting_table($starttime,$endtime,'createcourse');
+    my $enroll_table = &Apache::londropadd::date_setting_table($starttime,$endtime,'create_enrolldates');
+    my $access_table = &Apache::londropadd::date_setting_table($starttime,$endtime,'create_defaultdates');
     my ($krbdef,$krbdefdom) =
     &Apache::loncommon::get_kerberos_defaults($defdom);
     my $javascript_validations=&Apache::londropadd::javascript_validations('createcourse',$krbdefdom);
@@ -262,7 +280,7 @@ sub print_course_creation_page {
                     'snid' => "Section Numbers and corresponding LON-CAPA section/group IDs",
                     'csli' => "a comma separated list of institutional section numbers, each separated by a colon from the (optional) corresponding section/group ID to be used in LON-CAPA e.g., 001:1,002:2",
                     'crcs' => "Crosslisted courses",
-                    'cscs' => "a comma separated list of course sections crosslisted with the current course, with each entry including the institutional course section name followed by a colon and then the (optional) groupID to be used in LON-CAPA, e.g., fs03ent231001:ent1,fs03bot231001:bot1,fs03zol231002:bot2", 
+                    'cscs' => "a comma separated list of course sections crosslisted with the current course, with each entry including the institutional course section name followed by a colon and then the (optional) groupID to be used in LON-CAPA, e.g., fs03ent231001:ent1,fs03bot231001:bot1,fs03zol231002:zol2",
                     'crco' => "Course Content",
                     'cncr' => "Completely new course",
                     'cecr' => "Clone an existing course", 
@@ -300,6 +318,7 @@ sub print_course_creation_page {
                     'no'   => "No",
                     'audr' => "Automated drops",
                     'dacu' => "Duration of automated classlist updates",
+                    'dacc' => "Default start and end dates for student access",
                     '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",
                     'nech' => "Notification of enrollment changes",
@@ -436,8 +455,11 @@ $lt{'aesc'}
 <input type="radio" name="autodrops" value="1" />$lt{'yes'} <input type="radio" name="autodrops" value="0" checked="true" />$lt{'no'}
 </p><p>
 <b>$lt{'dacu'}</b>
-$date_table
+$enroll_table
 </p><p>
+<b>$lt{'dacc'}</b>
+$access_table
+<p></p>
 <b>$lt{'psam'}.</b><br />
 $lt{'pcda'}.
 </p><p>
@@ -526,7 +548,8 @@ ENDENHEAD
     my $courseid=&Apache::lonnet::createcourse($ENV{'request.role.domain'},
                                                $cdescr,$curl,
                                                $ENV{'form.course_home'},
-                                               $ENV{'form.nonstandard'});
+                                               $ENV{'form.nonstandard'},
+                                               $ENV{'form.crscode'});
 
     # Note: The testing routines depend on this being output; see 
     # Utils::Course. This needs to at least be output as a comment
@@ -569,44 +592,63 @@ ENDENHEAD
 #
 # Set environment (will override cloned, if existing)
 #
-    my @affiliates = ();  # Used to accumulate sections and crosslistings
+    my @sections = ();
+    my @xlists = ();
     if ($ENV{'form.crsid'}) {
         $cenv{'courseid'}=$ENV{'form.crsid'};
     }
     if ($ENV{'form.crscode'}) {
         $cenv{'internal.coursecode'}=$ENV{'form.crscode'};
     }
+    if ($ccuname) {
+        $cenv{'internal.courseowner'} = $ccuname;
+    } else {
+        $cenv{'internal.courseowner'} = $ENV{'user.name'};
+    }
+
+    my @badclasses = (); # Used to accumulate sections/crosslistings that did not pass classlist access check for course owner.
     if ($ENV{'form.crssections'}) {
-        $cenv{'internal.sectionnums'}=$ENV{'form.crssections'};
-        my @sections = ();
-        if ($cenv{'internal.sectionnums'} =~ m/,/) {
-            @sections = split/,/,$cenv{'internal.sectionnums'};
+        $cenv{'internal.sectionnums'} = '';
+        if ($ENV{'form.crssections'} =~ m/,/) {
+            @sections = split/,/,$ENV{'form.crssections'};
         } else {
-            $sections[0] = $cenv{'internal.sectionnums'};
+            $sections[0] = $ENV{'form.crssections'};
         }
         if (@sections > 0) {
-            foreach (@sections) {
-                my ($sec,$gp) = split/:/,$_; 
-                push @affiliates,$ENV{'form.crscode'}.$sec;
+            foreach my $item (@sections) {
+                my ($sec,$gp) = split/:/,$item;
+                my $class = $ENV{'form.crscode'}.$sec;
+                my $addcheck = &Apache::lonnet::auto_new_course($crsunum,$crsudom,$class,$cenv{'internal.courseowner'});
+                if ($addcheck eq 'ok') {
+                    $cenv{'internal.sectionnums'} .= $item.',';
+                } else {
+                    push @badclasses, $class;
+                }
             }
+            $cenv{'internal.sectionnums'} =~ s/,$//;
         }
     }
 # do not hide course coordinator from staff listing, 
 # even if privileged
     $cenv{'nothideprivileged'}=$ccuname.':'.$ccdomain;
     if ($ENV{'form.crsxlist'}) {
-       $cenv{'internal.crosslistings'}=$ENV{'form.crsxlist'};
-       my @xlists = ();
-        if ($cenv{'internal.crosslistings'} =~ m/,/) {
-            @xlists = split/,/,$cenv{'internal.crosslistings'};
+        $cenv{'internal.crosslistings'}='';
+        if ($ENV{'form.crsxlist'} =~ m/,/) {
+            @xlists = split/,/,$ENV{'form.crsxlist'};
         } else {
-            $xlists[0] = $cenv{'internal.crosslistings'};
+            $xlists[0] = $ENV{'form.crsxlist'};
         }
         if (@xlists > 0) {
-            foreach (@xlists) {
-                my ($xl,$gp) = split/:/,$_;
-                push @affiliates,$xl;
+            foreach my $item (@xlists) {
+                my ($xl,$gp) = split/:/,$item;
+                my $addcheck =  &Apache::lonnet::auto_new_course($crsunum,$crsudom,$xl,$cenv{'internal.courseowner'});
+                if ($addcheck eq 'ok') {
+                    $cenv{'internal.crosslistings'} .= $item.',';
+                } else {
+                    push @badclasses, $xl;
+                }
             }
+            $cenv{'internal.crosslistings'} =~ s/,$//;
         }
     }
     if ($ENV{'form.autoadds'}) {
@@ -617,38 +659,32 @@ ENDENHEAD
     }
     if ($ENV{'form.notify'}) {
       if ($ccuname) {
-        $cenv{'internal.notifylist'} = $ccuname;
+        $cenv{'internal.notifylist'} = $ccuname.'@'.$ccdomain;
       }
     }
-    if ($ccuname) {
-        $cenv{'internal.courseowner'} = $ccuname;
-    } else {
-        $cenv{'internal.courseowner'} = $ENV{'user.name'};
-    }
-    if (@affiliates > 0) {
-        my @badclasses = ();
-        foreach my $class (@affiliates) {
-            my $addcheck = &Apache::lonnet::auto_new_course($crsuhome,$class,$cenv{'internal.courseowner'});
-            unless ($addcheck eq 'ok') {
-                push @badclasses, $class; 
-            }
-        }
-        if (@badclasses > 0) {
-            $r->print('<font color="red">'.
-                      "The courses listed below were included as sections or crosslistings affiliated with your new LON-CAPA course. 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 ($cenv{'internal.courseowner'}) - does not have rights to access enrollment in these classes (as determined by your instititution's policies on access to official classlists).<br/><ul>\n");
-            foreach (@badclasses) {
-                $r->print("<li>$_</li>\n");
-            }
-            $r->print ("</ul><br/><br/></font>\n");
+    if (@badclasses > 0) {
+        my %lt=&Apache::lonlocal::texthash(
+                'tclb' => 'The courses listed below have not been included as sections or crosslistings affiliated with your new LON-CAPA course. 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'
+        );
+        $r->print('<font color="red">'.$lt{'tclb'}.' ('.$cenv{'internal.courseowner'}.') - '.$lt{'dnhr'}.' ('.$lt{'adby'}.').<br /><ul>'."\n");
+        foreach (@badclasses) {
+            $r->print("<li>$_</li>\n");
         }
+        $r->print ("</ul><br /><br /></font>\n");
     }
-    my $startdate = &Apache::lonhtmlcommon::get_date_from_form('startdate');
-    my $enddate   = &Apache::lonhtmlcommon::get_date_from_form('enddate');
+    my $enrollstart = &Apache::lonhtmlcommon::get_date_from_form('startenroll');
+    my $enrollend   = &Apache::lonhtmlcommon::get_date_from_form('endenroll');
+    my $startaccess = &Apache::lonhtmlcommon::get_date_from_form('startaccess');
+    my $endaccess = &Apache::lonhtmlcommon::get_date_from_form('endaccess');
     if ($ENV{'form.no_end_date'}) {
-      $enddate = 0;
+      $endaccess = 0;
     }
-    $cenv{'internal.autostart'}=$startdate;
-    $cenv{'internal.autoend'}=$enddate;
+    $cenv{'internal.autostart'}=$enrollstart;
+    $cenv{'internal.autoend'}=$enrollend;
+    $cenv{'default_enrollment_start_date'}=$startaccess;
+    $cenv{'default_enrollment_end_date'}=$endaccess;
     if ($ENV{'form.showphotos'}) {
       $cenv{'internal.showphotos'}=$ENV{'form.showphotos'};
     }