--- loncom/interface/loncreatecourse.pm 2017/11/16 16:22:58 1.158.2.3.2.1
+++ loncom/interface/loncreatecourse.pm 2019/07/26 17:27:44 1.158.2.5
@@ -1,7 +1,7 @@
# The LearningOnline Network
# Create a course
#
-# $Id: loncreatecourse.pm,v 1.158.2.3.2.1 2017/11/16 16:22:58 raeburn Exp $
+# $Id: loncreatecourse.pm,v 1.158.2.5 2019/07/26 17:27:44 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
@@ -731,8 +735,10 @@ sub create_course {
'
'.&mt('Course identifier to share with students: [_1]',$code).'
'
);
}
- # 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);
+ }
+ ®ister_cleanups($r,$crsudom,$env{'form.crscode'});
$r->print(''.&mt('Roles will be active at next login').'.
');
}
$r->print(''.
@@ -852,12 +858,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 +872,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 +889,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;
+ }
+ ®ister_cleanups($r,$defdom,$updatecats);
+
}
}
} else {
@@ -1289,6 +1303,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 +1351,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;