--- loncom/interface/loncreatecourse.pm 2017/11/16 16:22:58 1.158.2.3.2.1 +++ 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.1 2017/11/16 16:22:58 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 # @@ -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 @@ -99,7 +103,7 @@ sub print_course_creation_page { foreach my $server (sort(keys(%host_servers))) { $course_home .= qq{}; } @@ -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 = < +// $coursebrowserjs END @@ -285,7 +296,7 @@ END 'Create_Courses'); $r->print($start_page.$crumbs); - $r->print('
' + $r->print('
' .&Apache::lonhtmlcommon::start_pick_box() .&Apache::lonhtmlcommon::row_headline() @@ -352,6 +363,7 @@ END .'' .''.&mt('Yes').(' 'x2) .''.&mt('No') + .' .&Apache::lonhtmlcommon::row_closure() ); } @@ -399,7 +411,7 @@ END .&Apache::lonhtmlcommon::row_closure(1) .&Apache::lonhtmlcommon::end_pick_box() - .' ' + .' ' # Clone Course: .'' @@ -449,7 +461,10 @@ END .&Apache::lonhtmlcommon::row_closure() .&Apache::lonhtmlcommon::row_title($lt{'oaas'}) - .'' + .'' + .''.(' 'x2) + .''.', ' + .$lt{'sta'}.' '.$openallfrom.'' .&Apache::lonhtmlcommon::row_closure() .&Apache::lonhtmlcommon::row_headline() @@ -563,7 +578,8 @@ END

-' + +

' ); } 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 { '

'.&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 +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; + } + ®ister_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;