Diff for /loncom/interface/loncreatecourse.pm between versions 1.170 and 1.176

version 1.170, 2019/07/25 20:13:56 version 1.176, 2021/08/31 17:23:27
Line 80  use Apache::loncommon; Line 80  use Apache::loncommon;
 use Apache::londocs;  use Apache::londocs;
 use Apache::lonlocal;  use Apache::lonlocal;
 use Apache::lonuserutils;  use Apache::lonuserutils;
 use Apache::lonclonecourse;  
 use LONCAPA::batchcreatecourse;  use LONCAPA::batchcreatecourse;
 use LONCAPA qw(:DEFAULT :match);  use LONCAPA qw(:DEFAULT :match);
   
   my $registered_flush;
   my $registered_instcats;
   my $modified_dom;
   
 # ===================================================== Phase one: fill-in form  # ===================================================== Phase one: fill-in form
   
 sub print_course_creation_page {  sub print_course_creation_page {
Line 101  sub print_course_creation_page { Line 104  sub print_course_creation_page {
     foreach my $server (sort(keys(%host_servers))) {      foreach my $server (sort(keys(%host_servers))) {
         $course_home .= qq{<option value="$server"};          $course_home .= qq{<option value="$server"};
         if ($server eq $Apache::lonnet::perlvar{'lonHostID'}) {          if ($server eq $Apache::lonnet::perlvar{'lonHostID'}) {
             $course_home .= " selected ";              $course_home .= ' selected="selected"';
         }          }
         $course_home .= qq{>$server $host_servers{$server}</option>};          $course_home .= qq{>$server $host_servers{$server}</option>};
     }      }
Line 119  sub print_course_creation_page { Line 122  sub print_course_creation_page {
     my $endtime = time+(6*30*24*60*60); # 6 months from now, approx      my $endtime = time+(6*30*24*60*60); # 6 months from now, approx
     my $access_table = &Apache::lonuserutils::date_setting_table($starttime,      my $access_table = &Apache::lonuserutils::date_setting_table($starttime,
                                              $endtime,'create_defaultdates');                                               $endtime,'create_defaultdates');
       my $openallfrom =
           &Apache::lonhtmlcommon::date_setter('ccrs','openallfrom',$starttime);
     if (($crstype eq 'Course') || ($crstype eq 'Placement')) {      if (($crstype eq 'Course') || ($crstype eq 'Placement')) {
         $enroll_table = &Apache::lonuserutils::date_setting_table($starttime,          $enroll_table = &Apache::lonuserutils::date_setting_table($starttime,
                                               $endtime,'create_enrolldates');                                                $endtime,'create_enrolldates');
Line 186  function validate(formname) { Line 191  function validate(formname) {
                     'ncd'  => "Do not clone date parameters",                      'ncd'  => "Do not clone date parameters",
                     'prd'  => 'Clone date parameters as-is',                      'prd'  => 'Clone date parameters as-is',
                     'shd'  => 'Shift date parameters by number of days',                      'shd'  => 'Shift date parameters by number of days',
                       'dpl'  => 'URL shortcuts (for deep linking)',
                       'nsl'  => 'Do not clone URL shortcuts',
                       'tsl'  => 'Transfer URL shortcuts from existing course to new course',
                       'csl'  => 'Create new URL shortcuts in new course',
                     'assp' => "Assessment Parameters",                      'assp' => "Assessment Parameters",
                     'oaas' => "Open all assessments",                      'oaas' => "Open all assessments",
                       'sta'  => "starting from:",
                     'mssg' => "Messaging",                      'mssg' => "Messaging",
                     'scpf' => "Set course policy feedback to Course Coordinator",                      'scpf' => "Set course policy feedback to Course Coordinator",
                     'scfc' => "Set resource content feedback to Course Coordinator",                      'scfc' => "Set resource content feedback to Course Coordinator",
Line 250  function validate(formname) { Line 260  function validate(formname) {
         $lt{'cc'}  = &mt('(will be assigned Coordinator role)');          $lt{'cc'}  = &mt('(will be assigned Coordinator role)');
         $lt{'cgrs'} = &mt('Community Group Settings');          $lt{'cgrs'} = &mt('Community Group Settings');
         $lt{'cgrq'} = &mt('Set a quota for the total disk space available for storage of community group portfolio files');          $lt{'cgrq'} = &mt('Set a quota for the total disk space available for storage of community group portfolio files');
           $lt{'tsl'} = &mt('Transfer URL shortcuts from existing community to new community');
           $lt{'csl'} = &mt('Create new URL shortcuts in new community');
     } elsif ($crstype eq 'Placement') {      } elsif ($crstype eq 'Placement') {
         $lt{'cinf'} = &mt('Placement Test Information');          $lt{'cinf'} = &mt('Placement Test Information');
         $lt{'ctit'} = &mt('Placement Test Title');          $lt{'ctit'} = &mt('Placement Test Title');
Line 265  function validate(formname) { Line 277  function validate(formname) {
     }      }
     my $js = <<END;      my $js = <<END;
 <script type="text/javascript">  <script type="text/javascript">
   // <![CDATA[
   
 var editbrowser = null;  var editbrowser = null;
 function openbrowser(formname,elementname) {  function openbrowser(formname,elementname) {
     var url = '/res/?';      var url = '/res/?';
Line 283  function openbrowser(formname,elementnam Line 297  function openbrowser(formname,elementnam
     editbrowser.focus();      editbrowser.focus();
 }  }
 $javascript_validations  $javascript_validations
   
   // ]]>
 </script>  </script>
 $coursebrowserjs  $coursebrowserjs
 END  END
Line 302  END Line 318  END
     'Create_Courses');      'Create_Courses');
     $r->print($start_page.$crumbs);      $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::start_pick_box()
   
              .&Apache::lonhtmlcommon::row_headline()               .&Apache::lonhtmlcommon::row_headline()
Line 372  END Line 388  END
                      .'<span class="LC_nobreak">'                       .'<span class="LC_nobreak">'
                      .'<input type="radio" name="uniquecode" value="1" />'.&mt('Yes').('&nbsp;'x2)                       .'<input type="radio" name="uniquecode" value="1" />'.&mt('Yes').('&nbsp;'x2)
                      .'<input type="radio" name="uniquecode" value="0" checked="checked" />'.&mt('No')                       .'<input type="radio" name="uniquecode" value="0" checked="checked" />'.&mt('No')
                        .'</span>'
                      .&Apache::lonhtmlcommon::row_closure()                       .&Apache::lonhtmlcommon::row_closure()
                  );                   );
     }      }
Line 418  END Line 435  END
                  .'<input type="radio" name="firstres" value="nav" />'.$lt{'navi'}                   .'<input type="radio" name="firstres" value="nav" />'.$lt{'navi'}
                  .'</label>');                   .'</label>');
     }      }
       my $tinyurlhelp=&Apache::loncommon::help_open_topic('Clone_Tiny_URLs');
     $r->print('<br />('.$lt{'stco'}.')'      $r->print('<br />('.$lt{'stco'}.')'
                  .&Apache::lonhtmlcommon::row_closure(1)                   .&Apache::lonhtmlcommon::row_closure(1)
                  .&Apache::lonhtmlcommon::end_pick_box()                   .&Apache::lonhtmlcommon::end_pick_box()
   
                  .'<td>&nbsp;</td>'                   .'</td><td>&nbsp;</td>'
   
                  # Clone Course:                   # Clone Course:
                  .'<td>'                   .'<td>'
Line 447  END Line 465  END
                  .'<label>'                   .'<label>'
                  .'<input type="radio" name="datemode" value="shift" checked="checked" /> '.$lt{'shd'}                   .'<input type="radio" name="datemode" value="shift" checked="checked" /> '.$lt{'shd'}
                  .'</label>'                   .'</label>'
                  .' <input type="text" size="5" name="dateshift" value="365" />'                   .' <input type="text" size="5" name="dateshift" value="364" />'
                    .&Apache::lonhtmlcommon::row_closure()
                    .&Apache::lonhtmlcommon::row_title($tinyurlhelp.$lt{'dpl'})
                    .'<label>'
                    .'<input type="radio" name="tinyurls" value="delete" /> '.$lt{'nsl'}
                    .'</label><br />'
                    .'<label>'
                    .'<input type="radio" name="tinyurls" value="transfer" /> '.$lt{'tsl'}
                    .'</label><br />'
                    .'<label>'
                    .'<input type="radio" name="tinyurls" value="create" checked="checked" /> '.$lt{'csl'}
                    .'</label>'
                  .&Apache::lonhtmlcommon::row_closure()                   .&Apache::lonhtmlcommon::row_closure()
                  .&Apache::lonhtmlcommon::row_headline()                   .&Apache::lonhtmlcommon::row_headline()
                  .'<span class="LC_info">'.$lt{'asov'}.'</span>'                   .'<span class="LC_info">'.$lt{'asov'}.'</span>'
Line 472  END Line 501  END
                  .&Apache::lonhtmlcommon::row_closure()                   .&Apache::lonhtmlcommon::row_closure()
   
                  .&Apache::lonhtmlcommon::row_title($lt{'oaas'})                   .&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_closure()
   
                  .&Apache::lonhtmlcommon::row_headline()                   .&Apache::lonhtmlcommon::row_headline()
Line 586  END Line 618  END
 <p>  <p>
 <input type="hidden" name="prevphase" value="courseone" />  <input type="hidden" name="prevphase" value="courseone" />
 <input type="hidden" name="phase" value="coursetwo" />  <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') {      } elsif ($crstype eq 'Community') {
         $r->print('          $r->print('
Line 616  sub create_course { Line 649  sub create_course {
     my $ccuname =&LONCAPA::clean_username($env{'form.ccuname'});      my $ccuname =&LONCAPA::clean_username($env{'form.ccuname'});
     my $ccdomain=&LONCAPA::clean_domain($env{'form.ccdomain'});      my $ccdomain=&LONCAPA::clean_domain($env{'form.ccdomain'});
     my $crstype = 'Community';      my $crstype = 'Community';
     my ($enrollstart,$enrollend,$startaccess,$endaccess);      my ($enrollstart,$enrollend,$startaccess,$endaccess,$openallfrom);
     my %domdefaults =       my %domdefaults = 
         &Apache::lonnet::get_domain_defaults($env{'request.role.domain'});          &Apache::lonnet::get_domain_defaults($env{'request.role.domain'});
   
Line 629  sub create_course { Line 662  sub create_course {
     }      }
     $startaccess = &Apache::lonhtmlcommon::get_date_from_form('startaccess');      $startaccess = &Apache::lonhtmlcommon::get_date_from_form('startaccess');
     $endaccess   = &Apache::lonhtmlcommon::get_date_from_form('endaccess');      $endaccess   = &Apache::lonhtmlcommon::get_date_from_form('endaccess');
       $openallfrom = &Apache::lonhtmlcommon::get_date_from_form('openallfrom');
   
     my $autharg;      my $autharg;
     my $authtype;      my $authtype;
Line 669  sub create_course { Line 703  sub create_course {
                clonedomain => $env{'form.clonedomain'},                 clonedomain => $env{'form.clonedomain'},
                datemode => $env{'form.datemode'},                 datemode => $env{'form.datemode'},
                dateshift => $env{'form.dateshift'},                 dateshift => $env{'form.dateshift'},
                  tinyurls  => $env{'form.tinyurls'},
                crsid => $env{'form.crsid'},                 crsid => $env{'form.crsid'},
                curruser => $env{'user.name'}.':'.$env{'user.domain'},                 curruser => $env{'user.name'}.':'.$env{'user.domain'},
                crssections => $env{'form.crssections'},                 crssections => $env{'form.crssections'},
Line 694  sub create_course { Line 729  sub create_course {
                disresdis => $env{'form.disresdis'},                 disresdis => $env{'form.disresdis'},
                disablechat => $env{'form.disablechat'},                 disablechat => $env{'form.disablechat'},
                openall => $env{'form.openall'},                 openall => $env{'form.openall'},
                  openallfrom => $openallfrom,
                firstres => $env{'form.firstres'}                 firstres => $env{'form.firstres'}
                };                 };
   
Line 735  sub create_course { Line 771  sub create_course {
         return;          return;
     }      }
     my ($courseid,$crsudom,$crsunum,$code);      my ($courseid,$crsudom,$crsunum,$code);
     my ($success,$output) =       my ($success,$output,$clonemsgref) = 
  &Apache::loncommon::construct_course($args,\$logmsg,\$courseid,   &Apache::loncommon::construct_course($args,\$logmsg,\$courseid,
      \$crsudom,\$crsunum,       \$crsudom,\$crsunum,
      $env{'user.domain'},       $env{'user.domain'},
      $env{'user.name'},'dc_create',undef,undef,\$code);       $env{'user.name'},'dc_create',undef,undef,\$code);
     $r->print($output);      $r->print($output);
       if (ref($clonemsgref) eq 'ARRAY') {
           my $user_lh = &Apache::loncommon::user_lang($env{'user.name'},$env{'user.domain'});
           foreach my $item (@{$clonemsgref}) {
               if (ref($item) eq 'HASH') {
                   $r->print(&mt($item->{mt},@{$item->{args}}).'<br />'."\n");
               }
           }
       }
     if ($success) {      if ($success) {
         #          #
  # Make the requested user a course coordinator or group coordinator   # Make the requested user a course coordinator or group coordinator
Line 764  sub create_course { Line 808  sub create_course {
                       '<p>'.&mt('Course identifier to share with students: [_1]',$code).'</p>'                        '<p>'.&mt('Course identifier to share with students: [_1]',$code).'</p>'
                      );                       );
         }          }
         # Flush the course logs so reverse user roles immediately updated          if ($env{'form.crscode'} ne '') {
  $r->register_cleanup(\&Apache::lonnet::flushcourselogs);              &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>'.&mt('Roles will be active at next login').'.</p>');
     }      }
     $r->print('<p><a href="/adm/createcourse?phase='.lc($crstype).'one">'.      $r->print('<p><a href="/adm/createcourse?phase='.lc($crstype).'one">'.
Line 893  sub process_batchfile { Line 939  sub process_batchfile {
     my $uname = $env{'user.name'};      my $uname = $env{'user.name'};
     my $udom = $env{'user.domain'};      my $udom = $env{'user.domain'};
     my $dir = &LONCAPA::tempdir().'addcourse';      my $dir = &LONCAPA::tempdir().'addcourse';
     my ($result,$logmsg);      my ($result,$logmsg,$clonemsg,$keysmsg,$codesref,$instcodesref);
     if (($defdom =~ /^$match_domain$/) && ($uname =~ /^$match_username$/) && ($udom =~/^$match_domain$/)) {      if (($defdom =~ /^$match_domain$/) && ($uname =~ /^$match_username$/) && ($udom =~/^$match_domain$/)) {
         my $batchfilepath=&Apache::lonnet::userfileupload('coursecreatorxml',undef,          my $batchfilepath=&Apache::lonnet::userfileupload('coursecreatorxml',undef,
                                                           'batchupload',undef,undef,                                                            'batchupload',undef,undef,
Line 907  sub process_batchfile { Line 953  sub process_batchfile {
                     if ((defined($filename)) && (defined($batchdir))) {                      if ((defined($filename)) && (defined($batchdir))) {
                         my @requests = ($filename);                          my @requests = ($filename);
                         my %courseids = ();                          my %courseids = ();
                         ($result,$logmsg) = &LONCAPA::batchcreatecourse::create_courses(                          ($result,$logmsg,$clonemsg,$keysmsg,$codesref,$instcodesref) =
                                                     \@requests,\%courseids,'web',$defdom,                              &LONCAPA::batchcreatecourse::create_courses(
                                                     $uname,$udom);                                         \@requests,\%courseids,'web',$defdom,
                                          $uname,$udom);
                         if (keys(%courseids) > 0) {                          if (keys(%courseids) > 0) {
                             if (!-e "$batchdir/processed") {                              if (!-e "$batchdir/processed") {
                                 mkdir("$batchdir/processed", 0755);                                  mkdir("$batchdir/processed", 0755);
Line 923  sub process_batchfile { Line 970  sub process_batchfile {
                             if (-e "$batchdir/processed/$filename") {                              if (-e "$batchdir/processed/$filename") {
                                 unlink("$batchdir/pending/$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);
                           }
                           if ($clonemsg) {
                               $clonemsg = '<p class="LC_info">'.$clonemsg.'</p>'."\n";
                         }                          }
                     }                      }
                 } else {                  } else {
Line 940  sub process_batchfile { Line 996  sub process_batchfile {
     }      }
     $r->print(&Apache::loncommon::start_page('Create a New Course, Community or Placement Test').      $r->print(&Apache::loncommon::start_page('Create a New Course, Community or Placement Test').
               &Apache::lonhtmlcommon::breadcrumbs('Creation Outcome','Create_Course',undef,'Create_Courses').                &Apache::lonhtmlcommon::breadcrumbs('Creation Outcome','Create_Course',undef,'Create_Courses').
               $logmsg.$result.'<br /><a href="/adm/createcourse">'.                $logmsg.$clonemsg.$result.'<br /><a href="/adm/createcourse">'.
               &mt('Creation options menu').'</a>'.                &mt('Creation options menu').'</a>'.
               &Apache::loncommon::end_page());                &Apache::loncommon::end_page());
     
Line 1335  sub get_permission { Line 1391  sub get_permission {
     return ($allowed,\%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  # ===================================================================== Handler
 sub handler {  sub handler {
     my $r = shift;      my $r = shift;
Line 1345  sub handler { Line 1439  sub handler {
        return OK;         return OK;
     }      }
   
       $registered_flush = 0;
       $registered_instcats = 0;
       $modified_dom = '';
   
     my ($allowed,$permission) = &get_permission($env{'request.role.domain'});      my ($allowed,$permission) = &get_permission($env{'request.role.domain'});
     if ($allowed) {      if ($allowed) {
         my $show_all_choices = 0;          my $show_all_choices = 0;
Line 1487  sub handler { Line 1585  sub handler {
            my $start_page=&Apache::loncommon::start_page('Requests Validation Result',$js);             my $start_page=&Apache::loncommon::start_page('Requests Validation Result',$js);
            my $crumbs = &Apache::lonhtmlcommon::breadcrumbs('Validation Attempted','Course_Requests',undef,'Course_Requests');             my $crumbs = &Apache::lonhtmlcommon::breadcrumbs('Validation Attempted','Course_Requests',undef,'Course_Requests');
            $r->print($start_page.$crumbs."\n".'<div>'.             $r->print($start_page.$crumbs."\n".'<div>'.
                      &Apache::loncoursequeueadmin::process_official_reqs('domain',$env{'request.role.domain'}).'</div>'.                       &Apache::loncoursequeueadmin::process_official_reqs('domain',$env{'request.role.domain'},
                                                                            $env{'user.name'},$env{'user.domain'}).
                        '</div>'.
                      &Apache::loncommon::end_page());                       &Apache::loncommon::end_page());
        } elsif (($env{'form.phase'} eq 'creationlog') && ($show_all_choices)) {         } elsif (($env{'form.phase'} eq 'creationlog') && ($show_all_choices)) {
            &Apache::lonhtmlcommon::add_breadcrumb             &Apache::lonhtmlcommon::add_breadcrumb

Removed from v.1.170  
changed lines
  Added in v.1.176


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>