--- loncom/interface/loncreatecourse.pm	2017/11/17 01:02:28	1.158.2.3.2.2
+++ loncom/interface/loncreatecourse.pm	2020/05/22 19:57:57	1.158.2.6
@@ -1,7 +1,7 @@
 # The LearningOnline Network
 # Create a course
 #
-# $Id: loncreatecourse.pm,v 1.158.2.3.2.2 2017/11/17 01:02:28 raeburn Exp $
+# $Id: loncreatecourse.pm,v 1.158.2.6 2020/05/22 19:57:57 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -84,6 +84,10 @@ use Apache::lonclonecourse;
 use LONCAPA::batchcreatecourse;
 use LONCAPA qw(:DEFAULT :match);
 
+my $registered_flush;
+my $registered_instcats;
+my $modified_dom;
+
 # ===================================================== Phase one: fill-in form
 
 sub print_course_creation_page {
@@ -99,7 +103,7 @@ sub print_course_creation_page {
     foreach my $server (sort(keys(%host_servers))) {
         $course_home .= qq{<option value="$server"};
         if ($server eq $Apache::lonnet::perlvar{'lonHostID'}) {
-            $course_home .= " selected ";
+            $course_home .= ' selected="selected"';
         }
         $course_home .= qq{>$server $host_servers{$server}</option>};
     }
@@ -116,6 +120,8 @@ sub print_course_creation_page {
     my $endtime = time+(6*30*24*60*60); # 6 months from now, approx
     my $access_table = &Apache::lonuserutils::date_setting_table($starttime,
                                              $endtime,'create_defaultdates');
+    my $openallfrom =
+        &Apache::lonhtmlcommon::date_setter('ccrs','openallfrom',$starttime);
     if ($crstype eq 'Course') {
         $enroll_table = &Apache::lonuserutils::date_setting_table($starttime,
                                               $endtime,'create_enrolldates');
@@ -185,6 +191,7 @@ function validate(formname) {
                     'shd'  => 'Shift date parameters by number of days',
                     'assp' => "Assessment Parameters",
                     'oaas' => "Open all assessments",
+                    'sta'  => "starting from:",
                     'mssg' => "Messaging",
                     'scpf' => "Set course policy feedback to Course Coordinator",
                     'scfc' => "Set resource content feedback to Course Coordinator",
@@ -249,6 +256,8 @@ function validate(formname) {
     }
     my $js = <<END;
 <script type="text/javascript">
+// <![CDATA[
+
 var editbrowser = null;
 function openbrowser(formname,elementname) {
     var url = '/res/?';
@@ -267,6 +276,8 @@ function openbrowser(formname,elementnam
     editbrowser.focus();
 }
 $javascript_validations
+
+// ]]>
 </script>
 $coursebrowserjs
 END
@@ -285,7 +296,7 @@ END
 					    'Create_Courses');
     $r->print($start_page.$crumbs);
 
-    $r->print('<form action="/adm/createcourse" method="post" name="ccrs" action=""><div class="LC_createcourse">'
+    $r->print('<form action="/adm/createcourse" method="post" name="ccrs"><div class="LC_createcourse">'
              .&Apache::lonhtmlcommon::start_pick_box()
 
              .&Apache::lonhtmlcommon::row_headline()
@@ -352,6 +363,7 @@ END
                      .'<span class="LC_nobreak">'
                      .'<input type="radio" name="uniquecode" value="1" />'.&mt('Yes').('&nbsp;'x2)
                      .'<input type="radio" name="uniquecode" value="0" checked="checked" />'.&mt('No')
+                     .'</span> 
                      .&Apache::lonhtmlcommon::row_closure()
             );
     }
@@ -399,7 +411,7 @@ END
                  .&Apache::lonhtmlcommon::row_closure(1)
                  .&Apache::lonhtmlcommon::end_pick_box()
 
-                 .'<td>&nbsp;</td>'
+                 .'</td><td>&nbsp;</td>'
 
                  # Clone Course:
                  .'<td>'
@@ -449,7 +461,10 @@ END
                  .&Apache::lonhtmlcommon::row_closure()
 
                  .&Apache::lonhtmlcommon::row_title($lt{'oaas'})
-                 .'<input type="checkbox" name="openall" />'
+                 .'<span class="LC_nobreak">'
+                 .'<label><input type="radio" name="openall" value="0" checked="checked" />'.$lt{'no'}.'</label>'.('&nbsp;'x2)
+                 .'<label><input type="radio" name="openall" value="1" />'.$lt{'yes'}.'</label>'.',&nbsp;'
+                 .$lt{'sta'}.'&nbsp;'.$openallfrom.'</span>'
                  .&Apache::lonhtmlcommon::row_closure()
 
                  .&Apache::lonhtmlcommon::row_headline()
@@ -563,7 +578,8 @@ END
 <p>
 <input type="hidden" name="prevphase" value="courseone" />
 <input type="hidden" name="phase" value="coursetwo" />
-<input type="button" onclick="verify_message(this.form)" value="'.$lt{'opco'}.'" />'
+<input type="button" onclick="verify_message(this.form)" value="'.$lt{'opco'}.'" />
+</p>'
         );
     } elsif ($crstype eq 'Community') {
         $r->print('
@@ -585,7 +601,7 @@ sub create_course {
     my $ccuname =&LONCAPA::clean_username($env{'form.ccuname'});
     my $ccdomain=&LONCAPA::clean_domain($env{'form.ccdomain'});
     my $crstype = 'Community';
-    my ($enrollstart,$enrollend,$startaccess,$endaccess);
+    my ($enrollstart,$enrollend,$startaccess,$endaccess,$openallfrom);
     my %domdefaults = 
         &Apache::lonnet::get_domain_defaults($env{'request.role.domain'});
 
@@ -596,6 +612,7 @@ sub create_course {
     }
     $startaccess = &Apache::lonhtmlcommon::get_date_from_form('startaccess');
     $endaccess   = &Apache::lonhtmlcommon::get_date_from_form('endaccess');
+    $openallfrom = &Apache::lonhtmlcommon::get_date_from_form('openallfrom');
 
     my $autharg;
     my $authtype;
@@ -661,6 +678,7 @@ sub create_course {
                disresdis => $env{'form.disresdis'},
                disablechat => $env{'form.disablechat'},
                openall => $env{'form.openall'},
+               openallfrom => $openallfrom,
                firstres => $env{'form.firstres'}
                };
 
@@ -731,8 +749,10 @@ sub create_course {
                       '<p>'.&mt('Course identifier to share with students: [_1]',$code).'</p>'
                      );
         }
-        # Flush the course logs so reverse user roles immediately updated
-	$r->register_cleanup(\&Apache::lonnet::flushcourselogs);
+        if ($env{'form.crscode'} ne '') {
+            &Apache::lonnet::devalidate_cache_new('instcats',$crsudom);
+        }
+        &register_cleanups($r,$crsudom,$env{'form.crscode'});
 	$r->print('<p>'.&mt('Roles will be active at next login').'.</p>');
     }
     $r->print('<p><a href="/adm/createcourse?phase='.lc($crstype).'one">'.
@@ -852,12 +872,12 @@ sub process_batchfile {
     my $uname = $env{'user.name'};
     my $udom = $env{'user.domain'};
     my $dir = &LONCAPA::tempdir().'addcourse';
-    my ($result,$logmsg);
+    my ($result,$logmsg,$keysmsg,$codesref,$instcodesref);
     if (($defdom =~ /^$match_domain$/) && ($uname =~ /^$match_username$/) && ($udom =~/^$match_domain$/)) {
         my $batchfilepath=&Apache::lonnet::userfileupload('coursecreatorxml',undef,
                                                           'batchupload',undef,undef,
                                                           undef,undef,$defdom);
-        if ($batchfilepath =~ m{^(\Q$dir/$defdom/web/$uname\_$udom\E)/pending/([^/]+)$}) {
+        if ($batchfilepath =~ m{^(\Q$dir/$defdom/web/$uname\E_\Q$udom\E)/pending/([^/]+)$}) {
             my ($batchdir,$filename) = ($1,$2);
             if (-e "$batchfilepath") {
                 if (open(FILE,"<",$batchfilepath)) {
@@ -866,9 +886,10 @@ sub process_batchfile {
                     if ((defined($filename)) && (defined($batchdir))) {
                         my @requests = ($filename);
                         my %courseids = ();
-                        ($result,$logmsg) = &LONCAPA::batchcreatecourse::create_courses(
-                                                    \@requests,\%courseids,'web',$defdom,
-                                                    $uname,$udom);
+                       ($result,$logmsg,$keysmsg,$codesref,$instcodesref) =
+                            &LONCAPA::batchcreatecourse::create_courses(
+                                       \@requests,\%courseids,'web',$defdom,
+                                       $uname,$udom);
                         if (keys(%courseids) > 0) {
                             if (!-e "$batchdir/processed") {
                                 mkdir("$batchdir/processed", 0755);
@@ -882,6 +903,13 @@ sub process_batchfile {
                             if (-e "$batchdir/processed/$filename") {
                                 unlink("$batchdir/pending/$filename");
                             }
+                            my $updatecats;
+                            if ((ref($instcodesref) eq 'HASH') && (keys(%{$instcodesref}) > 0)) {
+                                &Apache::lonnet::devalidate_cache_new('instcats',$defdom);
+                                $updatecats = 1;
+                            }
+                            &register_cleanups($r,$defdom,$updatecats);
+
                         }
                     }
                 } else {
@@ -1289,6 +1317,44 @@ sub get_permission {
     return ($allowed,\%permission);
 }
 
+sub register_cleanups {
+    my ($r,$cdom,$updatecats) = @_;
+    # Flush the course logs so reverse user roles immediately updated
+    unless ($registered_flush) {
+        my $handlers = $r->get_handlers('PerlCleanupHandler');
+        $r->set_handlers('PerlCleanupHandler' => [\&Apache::lonnet::flushcourselogs,@{$handlers}]);
+        $registered_flush=1;
+    }
+    # Update cache of self-cataloging courses on institution's server(s).
+    if ($updatecats) {
+        if (&Apache::lonnet::shared_institution($cdom)) {
+            unless ($registered_instcats) {
+                my $handlers = $r->get_handlers('PerlCleanupHandler');
+                $r->set_handlers('PerlCleanupHandler' => [\&devalidate_remote_instcats,@{$handlers}]);
+                $registered_instcats=1;
+                $modified_dom = $cdom;
+            }
+        }
+    }
+    return;
+}
+
+sub devalidate_remote_instcats {
+    if ($modified_dom ne '') {
+        my %servers = &Apache::lonnet::internet_dom_servers($modified_dom);
+        my %thismachine;
+        map { $thismachine{$_} = 1; } &Apache::lonnet::current_machine_ids();
+        if (keys(%servers)) {
+            foreach my $server (keys(%servers)) {
+                next if ($thismachine{$server});
+                &Apache::lonnet::remote_devalidate_cache($server,['instcats:'.$modified_dom]);
+            }
+        }
+        $modified_dom = '';
+    }
+    return;
+}
+
 # ===================================================================== Handler
 sub handler {
     my $r = shift;
@@ -1299,6 +1365,10 @@ sub handler {
        return OK;
     }
 
+    $registered_flush = 0;
+    $registered_instcats = 0;
+    $modified_dom = '';
+
     my ($allowed,$permission) = &get_permission($env{'request.role.domain'});
     if ($allowed) {
         my $show_all_choices = 0;