--- loncom/interface/loncreatecourse.pm	2017/08/11 00:24:53	1.167
+++ loncom/interface/loncreatecourse.pm	2019/07/26 02:28:34	1.172
@@ -1,7 +1,7 @@
 # The LearningOnline Network
 # Create a course
 #
-# $Id: loncreatecourse.pm,v 1.167 2017/08/11 00:24:53 raeburn Exp $
+# $Id: loncreatecourse.pm,v 1.172 2019/07/26 02:28:34 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -82,7 +82,11 @@ use Apache::lonlocal;
 use Apache::lonuserutils;
 use Apache::lonclonecourse;
 use LONCAPA::batchcreatecourse;
-use LONCAPA;
+use LONCAPA qw(:DEFAULT :match);
+
+my $registered_flush;
+my $registered_instcats;
+my $modified_dom;
 
 # ===================================================== Phase one: fill-in form
 
@@ -764,8 +768,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">'.
@@ -889,42 +895,67 @@ sub upload_batchfile {
 
 sub process_batchfile {
     my $r = shift;
-    my $start_page =
-        &Apache::loncommon::start_page('Create a New Course, Community or Placement Test');
-    my $crumbs = &Apache::lonhtmlcommon::breadcrumbs('Creation Outcome','Create_Course',undef,'Create_Courses');
-    my $end_page =
-        &Apache::loncommon::end_page();
     my $defdom=$env{'request.role.domain'};
-    my $batchfilepath=&Apache::lonnet::userfileupload('coursecreatorxml',undef,
-                                                      'batchupload',undef,undef,
-                                                       undef,undef,$defdom);
-    my ($batchdir,$filename) = ($batchfilepath =~ m-^(.+)/pending/([^/]+)$-);
-    my ($result,$logmsg);
-    if (-e "$batchfilepath") {
-        open(FILE,"<$batchfilepath");
-        my @buffer = <FILE>;
-        close(FILE);
-        if ((defined($filename)) && (defined($batchdir))) {
-            my @requests = ($filename);
-            my %courseids = ();
-            ($result,$logmsg) = &LONCAPA::batchcreatecourse::create_courses(
-                                        \@requests,\%courseids,'web',$defdom,
-                                        $env{'user.name'},$env{'user.domain'});
-            if ($result) {
-                if (!-e "$batchdir/processed") {
-                    mkdir("$batchdir/processed", 0755);
-                    open(FILE,">$batchdir/processed/$filename");
-                    print FILE @buffer;
+    my $uname = $env{'user.name'};
+    my $udom = $env{'user.domain'};
+    my $dir = &LONCAPA::tempdir().'addcourse';
+    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\E_\Q$udom\E)/pending/([^/]+)$}) {
+            my ($batchdir,$filename) = ($1,$2);
+            if (-e "$batchfilepath") {
+                if (open(FILE,"<",$batchfilepath)) {
+                    my @buffer = <FILE>;
                     close(FILE);
-                    if (-e "$batchdir/processed/$filename") {
-                        unlink("$batchdir/pending/$filename");
+                    if ((defined($filename)) && (defined($batchdir))) {
+                        my @requests = ($filename);
+                        my %courseids = ();
+                        ($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);
+                            }
+                            if (-d "$batchdir/processed") {
+                                if (open(FILE,">","$batchdir/processed/$filename")) {
+                                    print FILE @buffer;
+                                    close(FILE);
+                                }
+                            }
+                            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 {
+                    $result = '<p class="LC_error">'.&mt('Could not open attributes file.').'<br />'.&mt('No courses created.').'</p>';
                 }
+            } else {
+                $result = '<p class="LC_error">'.&mt('No uploaded attributes file found.').'<br />'.&mt('No courses created.').'</p>';
             }
+        } else {
+            $result = '<p class="LC_error">'.&mt('Invalid path to attributes file.').'<br />'.&mt('No courses created.').'</p>';
         }
+    } else {
+        $result = '<p class="LC_error">'.&mt("Your username, domain, and/or your current role's domain are missing or contain invalid characters.").
+                  '<br />'.&mt('No courses created.').'</p>';
     }
-    $r->print($start_page.$crumbs.$logmsg.$result.'<br /><a href="/adm/createcourse">'.
-              &mt('Creation options menu').'</a>'.$end_page);
+    $r->print(&Apache::loncommon::start_page('Create a New Course, Community or Placement Test').
+              &Apache::lonhtmlcommon::breadcrumbs('Creation Outcome','Create_Course',undef,'Create_Courses').
+              $logmsg.$result.'<br /><a href="/adm/createcourse">'.
+              &mt('Creation options menu').'</a>'.
+              &Apache::loncommon::end_page());
  
 }
 
@@ -1317,6 +1348,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;
@@ -1327,6 +1396,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;