Diff for /loncom/interface/lonpickcourse.pm between versions 1.111 and 1.120

version 1.111, 2014/03/13 14:46:46 version 1.120, 2016/10/19 13:14:05
Line 36  use Apache::loncoursedata; Line 36  use Apache::loncoursedata;
 use Apache::lonnet;  use Apache::lonnet;
 use Apache::lonlocal;  use Apache::lonlocal;
 use Apache::longroup;  use Apache::longroup;
 use Apache::courseclassifier;  
 use LONCAPA qw(:DEFAULT :match);  use LONCAPA qw(:DEFAULT :match);
   
 sub handler {  sub handler {
Line 51  sub handler { Line 50  sub handler {
     &Apache::loncommon::get_unprocessed_cgi      &Apache::loncommon::get_unprocessed_cgi
         ($ENV{'QUERY_STRING'},['domainfilter','form','cnumelement',          ($ENV{'QUERY_STRING'},['domainfilter','form','cnumelement',
        'cdomelement','cnameelement','roleelement',         'cdomelement','cnameelement','roleelement',
                                'multiple','type','setroles','fixeddom','cloner']);                                 'multiple','type','setroles','fixeddom','cloner',
                                  'crscode','crsdom']);
     my ($type,$title,$jscript,$multelement,$multiple,$roleelement,$typeelement,      my ($type,$title,$jscript,$multelement,$multiple,$roleelement,$typeelement,
         $lastaction,$autosubmit,$submitopener,$cloneruname,$clonerudom);          $lastaction,$autosubmit,$submitopener,$cloneruname,$clonerudom,$crscode,$crsdom);
   
     # Get course type - Course or Community.      # Get course type - Course, Community or Placement.
     $type = $env{'form.type'};      $type = $env{'form.type'};
     if (!defined($env{'form.type'})) {      if (!defined($env{'form.type'})) {
         $type = 'Course';          $type = 'Course';
Line 69  sub handler { Line 69  sub handler {
         $title = 'Selecting '.$type.'(s)';          $title = 'Selecting '.$type.'(s)';
     }      }
   
     # if called when a DC is selecting a course       # if called when a DC or DH is selecting a course 
     my $roledom = $env{'form.roleelement'};      my ($roledom,$rolename) = split(/:/,$env{'form.roleelement'});
     if ($roledom) {      if ($roledom) {
         $roleelement = '<input type="hidden" name="roleelement" value="'.$roledom.'" />';          $roleelement = '<input type="hidden" name="roleelement" value="'.$env{'form.roleelement'}.'" />';
         $submitopener = &processpick();          $submitopener = &processpick();
         $autosubmit = 'process_pick("'.$roledom.'")';          $autosubmit = 'process_pick("'.$roledom.'","'.$rolename.'")';
     }      }
     if ($env{'form.typeelement'} ne '') {      if ($env{'form.typeelement'} ne '') {
         $typeelement = '<input type="hidden" name="typeelement" value="'.$env{'form.typeelement'}.'" />';          $typeelement = '<input type="hidden" name="typeelement" value="'.$env{'form.typeelement'}.'" />';
Line 83  sub handler { Line 83  sub handler {
     # if called when a DC is creating a course for another user.      # if called when a DC is creating a course for another user.
     if ($env{'form.form'} eq 'ccrs') {      if ($env{'form.form'} eq 'ccrs') {
         ($cloneruname,$clonerudom) = ($env{'form.cloner'} =~ /^($match_username):($match_domain)$/);          ($cloneruname,$clonerudom) = ($env{'form.cloner'} =~ /^($match_username):($match_domain)$/);
           $crscode = $env{'form.crscode'};
           $crsdom = $env{'request.role.domain'};
     }      }
   
     # if called when requesting a course      # if called when requesting a course
     if ($env{'form.form'} eq 'requestcrs') {      if ($env{'form.form'} eq 'requestcrs') {
         $cloneruname = $env{'user.name'};          $cloneruname = $env{'user.name'};
         $clonerudom =  $env{'user.domain'};          $clonerudom =  $env{'user.domain'};
           $crscode = $env{'form.crscode'};
           $crsdom = $env{'form.crsdom'};
     }      }
   
     my $onlyown = 0;      my $onlyown = 0;
Line 106  sub handler { Line 110  sub handler {
   
     if ((($env{'form.form'} eq 'cu') || ($env{'form.form'} eq 'studentform')) &&       if ((($env{'form.form'} eq 'cu') || ($env{'form.form'} eq 'studentform')) && 
         ($env{'form.pickedcourse'})) {          ($env{'form.pickedcourse'})) {
         $loaditem{'onload'} .= 'setDefaultCredits();setRoles();setSections();';          if ($type ne 'Community') {
               my %coursedescription =
                   &Apache::lonnet::coursedescription($env{'form.pickedcourse'},
                                                      {'one_time' => '1'});
               my $cdom = $coursedescription{'domain'};
               my %domdefs = &Apache::lonnet::get_domain_defaults($cdom);
               if (($domdefs{'officialcredits'} || $domdefs{'unofficialcredits'} || $domdefs{'textbookcredits'})) {
                   $loaditem{'onload'} .= 'setDefaultCredits();';
               }
           }
           $loaditem{'onload'} .= 'setRoles();setSections();';
       }
       if ((($env{'form.gosearch'}) && ($env{'form.updater'} eq '')) && (!$onlyown)) {
           $loaditem{'onload'} .=  'hideSearching(); ';
     }      }
     my $js = &js_changer();      my $js = &Apache::loncommon::js_changer();
     $r->print(&Apache::loncommon::start_page($title,$js,      $r->print(&Apache::loncommon::start_page($title,$js,
      {'add_entries' => \%loaditem,       {'add_entries' => \%loaditem,
       'no_nav_bar'  => 1, }));        'no_nav_bar'  => 1, }));
Line 141  sub handler { Line 158  sub handler {
     my $filter = {};      my $filter = {};
     my $action = '/adm/pickcourse';      my $action = '/adm/pickcourse';
     my ($numtitles,$showroles,$nohost,@codetitles);      my ($numtitles,$showroles,$nohost,@codetitles);
     if (!$onlyown) {      unless ($onlyown) {
         my $filterlist = ['domainfilter','sincefilter'];          my $filterlist = ['domainfilter','sincefilter'];
         # created filter for DCs only          # created filter for DCs only
         if ($env{'user.adv'} && $env{'form.domainfilter'} &&          if ($env{'user.adv'} && $env{'form.domainfilter'} &&
Line 208  sub handler { Line 225  sub handler {
             if ($coord_cloneable) {              if ($coord_cloneable) {
                 $clonetext .= '<input type="hidden" name="cc_clone" value="'.$coord_cloneable.'" />';                  $clonetext .= '<input type="hidden" name="cc_clone" value="'.$coord_cloneable.'" />';
             }              }
               if ($crscode ne '') {
                   $clonetext .= '<input type="hidden" name="crscode" value="'.$crscode.'" />';
               }
               if ($crsdom ne '') {
                   $clonetext .= '<input type="hidden" name="crsdom" value="'.$crsdom.'" />';
               }
         }          }
         $r->print(&Apache::loncommon::build_filters($filterlist,$type,$roleelement,$multelement,          $r->print(&Apache::loncommon::build_filters($filterlist,$type,$roleelement,$multelement,
                                                     $filter,$action,\$numtitles,undef,$cloneruname,                                                      $filter,$action,\$numtitles,undef,$cloneruname,
Line 228  sub handler { Line 251  sub handler {
                 $domcloner = 1;                  $domcloner = 1;
             }              }
         }          }
         my %courses = &search_courses($r,$type,$onlyown,$filter,$numtitles,          my %courses;
                                       $cloneruname,$clonerudom,$domcloner,\@codetitles);          if (!$onlyown) {
               $r->print('<div id="searching">'.&mt('Searching ...').'</div>');
               $r->rflush();
               my $srchdom = $filter->{'domainfilter'};
               %courses = &Apache::loncommon::search_courses($srchdom,$type,$filter,$numtitles,
                                                             $cloneruname,$clonerudom,$domcloner,
                                                             \@codetitles,$env{'form.cc_clone'},
                                                             $crsdom,$crscode);
           } else {
               $r->print('<br />');
               my %coursehash = &Apache::loncommon::findallcourses();
               foreach my $cid (sort(keys(%coursehash))) {
                   $courses{$cid}{'description'} = $env{'course.'.$cid.'.description'};
               }
           }
         if ($nohost) {          if ($nohost) {
             $r->print ('<span class="LC_warning">'.              $r->print ('<span class="LC_warning">'.
                        &mt('User does not exist - username: [_1], domain: [_2].',                         &mt('User does not exist - username: [_1], domain: [_2].',
Line 237  sub handler { Line 274  sub handler {
                            '<b>'.$filter->{'persondomfilter'}.'</b>').'</span>');                             '<b>'.$filter->{'persondomfilter'}.'</b>').'</span>');
         } else {          } else {
             &display_matched_courses($r,$type,$multiple,$action,$showroles,$cloneruname,              &display_matched_courses($r,$type,$multiple,$action,$showroles,$cloneruname,
                                      $clonerudom,%courses);                                       $clonerudom,$crsdom,$crscode,%courses);
         }          }
     }      }
     $r->print(&Apache::loncommon::end_page());      $r->print(&Apache::loncommon::end_page());
     return OK;      return OK;
 }  }
   
 sub js_changer {  
     return <<ENDJS;  
 <script type="text/javascript">  
 // <![CDATA[  
 function updateFilters(caller) {  
     if (typeof(caller) != "undefined") {  
         document.filterpicker.updater.value = caller.name;  
     }  
     document.filterpicker.submit();  
 }  
 // ]]>  
 </script>  
   
 ENDJS  
 }  
   
 sub processpick {  sub processpick {
     my $openerform = 'rolechoice';      my $openerform = 'rolechoice';
     if ($env{'form.form'} eq 'studentform') {      if ($env{'form.form'} eq 'studentform') {
Line 267  sub processpick { Line 288  sub processpick {
     }      }
     my $process_pick = <<"ENDONE";      my $process_pick = <<"ENDONE";
 <script type="text/javascript">  <script type="text/javascript">
 function process_pick(dom) {  function process_pick(dom,rolename) {
     var pickedCourse=opener.document.$openerform.$env{'form.cnumelement'}.value;      var pickedCourse=opener.document.$openerform.$env{'form.cnumelement'}.value;
     var pickedDomain=opener.document.$openerform.$env{'form.cdomelement'}.value;      var pickedDomain=opener.document.$openerform.$env{'form.cdomelement'}.value;
     var okDomain = 0;      var okDomain = 0;
Line 276  ENDONE Line 297  ENDONE
         $process_pick .= <<"ENDTWO";          $process_pick .= <<"ENDTWO";
     if (pickedDomain == dom) {      if (pickedDomain == dom) {
         if (pickedCourse != '') {          if (pickedCourse != '') {
             var ccrole = "cc";              var courseTarget; 
             var pickedType = "$env{'form.type'}";              if (rolename == 'cc') {
             if (pickedType == "Community") {                  var ccrole = "cc";
                 ccrole = "co";                  var pickedType = "$env{'form.type'}";
             }                  if (pickedType == "Community") {
             var courseTarget = ccrole+"./"+pickedDomain+"/"+pickedCourse                      ccrole = "co";
             opener.document.title='Role selected. Please stand by.';                  }
             opener.status='Role selected. Please stand by.';                  courseTarget = ccrole+"./"+pickedDomain+"/"+pickedCourse;
             opener.document.rolechoice.newrole.value=courseTarget              } else {
             opener.document.rolechoice.submit();                  if (!/\\W/.test(rolename)) {
                       courseTarget = "cr/"+pickedDomain+"/"+pickedDomain+"-domainconfig/"+rolename+"./"+pickedDomain+"/"+pickedCourse;
                   }
               }
               if ((courseTarget != '') && (courseTarget != undefined)) { 
                   opener.document.title='Role selected. Please stand by.';
                   opener.status='Role selected. Please stand by.';
                   opener.document.rolechoice.newrole.value=courseTarget;
                   opener.document.rolechoice.submit();
               } else {
                   alert("Invalid role selection");
                   return;
               }
         }          }
     }       }
     else {      else {
         alert("You may only use this screen to select courses in the current domain: "+dom+"\\nPlease return to the roles page window and click the 'Select Course' link for domain: "+pickedDomain+",\\n if you are a Domain Coordinator in that domain, and wish to become a Course Coordinator in a course in the domain");          alert("You may only use this screen to select courses in the current domain: "+dom+"\\nPlease return to the roles page window and click the 'Select Course' link for domain: "+pickedDomain+",\\n if you are a Domain Coordinator in that domain, and wish to become a Course Coordinator in a course in the domain");
     }      }
Line 362  function setDefaultCredits() { Line 395  function setDefaultCredits() {
 }  }
   
 sub display_matched_courses {  sub display_matched_courses {
     my ($r,$type,$multiple,$action,$showroles,$cloneruname,$clonerudom,%courses) = @_;      my ($r,$type,$multiple,$action,$showroles,$cloneruname,$clonerudom,$crsdom,$crscode,%courses) = @_;
     if ($env{'form.form'} eq 'portform') {      if ($env{'form.form'} eq 'portform') {
         $action = '/adm/portfolio';          $action = '/adm/portfolio';
     }      }
Line 383  sub display_matched_courses { Line 416  sub display_matched_courses {
                .'<fieldset>'                 .'<fieldset>'
                .'<legend>'.&mt('Pick action').'</legend>'                 .'<legend>'.&mt('Pick action').'</legend>'
                .'<span class="LC_nobreak"><label>'                 .'<span class="LC_nobreak"><label>'
                .'<input type="radio" name="phase" value="ccrole"'.$ccrolechk.'/>'                 .'<input type="radio" name="phase" value="adhocrole"'.$ccrolechk.'/>'
                .'&nbsp;');                 .'&nbsp;');
             if ($type eq 'Community') {              if (&Apache::lonnet::allowed('ccc',$crsdom)) {
                 $r->print(&mt('Enter the community with the role of [_1].',$cctitle));                  if ($type eq 'Community') {
             } else {                      $r->print(&mt('Enter the community with the role of [_1].',$cctitle));
                 $r->print(&mt('Enter the course with the role of [_1].',$cctitle));                  } elsif ($type eq 'Placement') {
                       $r->print(&mt('Enter the placement test with the role of [_1].',$cctitle));
                   } else {
                       $r->print(&mt('Enter the course with the role of [_1].',$cctitle));
                   }
               } elsif (&Apache::lonnet::allowed('rar',$crsdom)) {
                   my %adhocroles = &Apache::lonnet::userenvironment($env{'user.domain'},$env{'user.name'},
                                                                     'adhocroles.'.$crsdom);
                   if (keys(%adhocroles)) {
                       my @adhoc = split(/,/,$adhocroles{'adhocroles.'.$crsdom});
                       if (@adhoc > 1) {
                           my %adhochash;
                           map { $adhochash{$_} = $_; } @adhoc; 
                           my $selector = &Apache::loncommon::select_form($adhoc[0],'adhocrole',\%adhochash);
                           if ($type eq 'Community') {
                               $r->print(&mt('Enter the community with one of the available ad hoc roles: [_1].',
                                             $selector)); 
                           } elsif ($type eq 'Placement') {
                               $r->print(&mt('Enter the placement test with one of the available ad hoc roles: [_1].',
                                             $selector));
                           } else {
                               $r->print(&mt('Enter the course with one of the available ad hoc roles: [_1].',
                                             $selector));
                           }
                       } else {
                           if ($type eq 'Community') {
                               $r->print(&mt('Enter the community with the ad hoc role of: [_1]',$adhoc[0]));
                           } elsif ($type eq 'Placement') {
                               $r->print(&mt('Enter the placement test with the ad hoc role of: [_1]',$adhoc[0]));
                           } else {
                               $r->print(&mt('Enter the course with the ad hoc role of: [_1]',$adhoc[0]));
                           }
                       }
                   }
             }              }
             $r->print('</label></span><br />'              $r->print('</label></span><br />'
                .'<span class="LC_nobreak"><label>'                 .'<span class="LC_nobreak"><label>'
                .'<input type="radio" name="phase" value="menu"'.$menuchk.'/>&nbsp;');                 .'<input type="radio" name="phase" value="menu"'.$menuchk.'/>&nbsp;');
             if ($type eq 'Community') {              if (&Apache::lonnet::allowed('ccc',$crsdom)) {
                 $r->print(&mt('View or modify community settings which only a [_1] may modify.',$dctitle));                  if ($type eq 'Community') {
             } else {                      $r->print(&mt('View or modify community settings which only a [_1] may modify.',$dctitle));
                 $r->print(&mt('View or modify course settings which only a [_1] may modify.',$dctitle));                  } elsif ($type eq 'Placement') {
                       $r->print(&mt('View or modify placement test settings which only a [_1] may modify.',$dctitle));
                   } else {
                       $r->print(&mt('View or modify course settings which only a [_1] may modify.',$dctitle));
                   }
               } elsif (&Apache::lonnet::allowed('rar',$crsdom)) {
                   if ($type eq 'Community') {
                       $r->print(&mt('View community settings which only a [_1] may modify.',$dctitle));
                   } elsif ($type eq 'Placement') {
                       $r->print(&mt('View placement test settings which only a [_1] may modify.',$dctitle));
                   } else {
                       $r->print(&mt('View course settings which only a [_1] may modify.',$dctitle));
                   }
             }              }
             $r->print('</label></span>'              $r->print('</label></span>'
                .'</fieldset></div>'                       .'</fieldset></div>'
                .'<br clear="all" />'                       .'<br clear="all" />'
             );                       );
         }          }
     }      }
     my %by_descrip;      my %by_descrip;
Line 436  sub display_matched_courses { Line 514  sub display_matched_courses {
         $r->print('<th>'.&mt('Select').'</th>'          $r->print('<th>'.&mt('Select').'</th>'
                  .'<th>'.$titlehdr.'</th>'                   .'<th>'.$titlehdr.'</th>'
                  .'<th>'.&mt('Domain').'</th>');                   .'<th>'.&mt('Domain').'</th>');
         unless ($type eq 'Community') {          unless (($type eq 'Community') || ($type eq 'Placement')) {
             $r->print('<th>'.&mt('Course Code').'</th>');              $r->print('<th>'.&mt('Course Code').'</th>');
         }          }
         $r->print('<th>'.&mt('Owner/Co-owner(s)').'</th>');          $r->print('<th>'.&mt('Owner/Co-owner(s)').'</th>');
Line 455  sub display_matched_courses { Line 533  sub display_matched_courses {
             map {$cc_cloneable{$_} = 1;} split('&',$coord_cloneable);              map {$cc_cloneable{$_} = 1;} split('&',$coord_cloneable);
         }          }
     }      }
       my (%gotdomdefaults,%gotcodedefaults);
     foreach my $description (sort { lc($a) cmp lc($b) } (keys(%by_descrip))) {      foreach my $description (sort { lc($a) cmp lc($b) } (keys(%by_descrip))) {
         foreach my $course (@{$by_descrip{$description}}) {          foreach my $course (@{$by_descrip{$description}}) {
             $r->print(&Apache::loncommon::start_data_table_row());              $r->print(&Apache::loncommon::start_data_table_row());
Line 480  sub display_matched_courses { Line 559  sub display_matched_courses {
                     }                      }
                     unless ($canclone) {                      unless ($canclone) {
                         my $cloners = $courses{$course}{'cloners'};                          my $cloners = $courses{$course}{'cloners'};
                         if ($cloners ne '') {                           if ($cloners ne '') {
                             my @cloneable = split(',',$cloners);                              my @cloneable = split(',',$cloners);
                             if (grep(/^\*$/,@cloneable)) {                              if (grep(/^\*$/,@cloneable)) {
                                 $canclone = 1;                                  $canclone = 1;
Line 491  sub display_matched_courses { Line 570  sub display_matched_courses {
                             if (grep(/^\Q$cloneruname\E:\Q$clonerudom\E$/,@cloneable)) {                              if (grep(/^\Q$cloneruname\E:\Q$clonerudom\E$/,@cloneable)) {
                                 $canclone = 1;                                  $canclone = 1;
                             }                              }
                               unless ($canclone) {
                                   if (($instcode) && ($crscode) && ($cdom eq $crsdom)) {
                                       foreach my $cloner (@cloneable) {
                                           if (($cloner ne '*') && ($cloner !~ /^\*\:$match_domain$/) &&
                                               ($cloner !~ /^$match_username\:$match_domain$/) && ($cloner ne '')) {
                                               if ($cloner =~ /\=/) {
                                                   my (%codedefaults,@code_order);
                                                   if (ref($gotcodedefaults{$cdom}) eq 'HASH') {
                                                       if (ref($gotcodedefaults{$cdom}{'defaults'}) eq 'HASH') {
                                                           %codedefaults = %{$gotcodedefaults{$cdom}{'defaults'}};
                                                       }
                                                       if (ref($gotcodedefaults{$cdom}{'order'}) eq 'ARRAY') {
                                                           @code_order = @{$gotcodedefaults{$cdom}{'order'}};
                                                       }
                                                   } else {
                                                       &Apache::lonnet::auto_instcode_defaults($cdom,
                                                                                               \%codedefaults,
                                                                                               \@code_order);
                                                       $gotcodedefaults{$cdom}{'defaults'} = \%codedefaults;
                                                       $gotcodedefaults{$cdom}{'order'} = \@code_order;
                                                   }
                                                   if (@code_order > 0) {
                                                       if (&Apache::lonnet::check_instcode_cloning(\%codedefaults,\@code_order,
                                                                                                   $cloner,$instcode,$crscode)) {
                                                           $canclone = 1;
                                                           last;
                                                       }
                                                   }
                                               }
                                           }
                                       }
                                   }
                               }
                           } else {
                               my %domdefs;
                               if (ref($gotdomdefaults{$cdom}) eq 'HASH') {
                                   %domdefs = %{$gotdomdefaults{$cdom}};
                               } else {
                                   %domdefs = &Apache::lonnet::get_domain_defaults($cdom);
                                   $gotdomdefaults{$cdom} = \%domdefs;
                               }
                               if ($domdefs{'canclone'}) {
                                   unless ($domdefs{'canclone'} eq 'none') {
                                       if ($domdefs{'canclone'} eq 'domain') {
                                           if ($clonerudom eq $cdom) {
                                               $canclone = 1;
                                           }
                                       } elsif (($instcode) && ($crscode) &&
                                                ($cdom eq $crsdom)) {
                                           my (%codedefaults,@code_order); 
                                           if (ref($gotcodedefaults{$cdom}) eq 'HASH') {
                                               if (ref($gotcodedefaults{$cdom}{'defaults'}) eq 'HASH') {
                                                   %codedefaults = %{$gotcodedefaults{$cdom}{'defaults'}};
                                               }
                                               if (ref($gotcodedefaults{$cdom}{'order'}) eq 'ARRAY') {
                                                   @code_order = @{$gotcodedefaults{$cdom}{'order'}};
                                               }
                                           } else {
                                               &Apache::lonnet::auto_instcode_defaults($cdom,
                                                                                       \%codedefaults,
                                                                                       \@code_order);
                                               $gotcodedefaults{$cdom}{'defaults'} = \%codedefaults;
                                               $gotcodedefaults{$cdom}{'order'} = \@code_order;
                                           }
                                           if (@code_order > 0) {
                                               if (&Apache::lonnet::default_instcode_cloning($cdom,$domdefs{'canclone'},
                                                                                             $instcode,$crscode,\%codedefaults,
                                                                                             \@code_order)) {
                                                   $canclone = 1;
                                               }
                                           }
                                       }
                                   }
                               }
                         }                          }
                     }                      }
                 }                  }
Line 512  sub display_matched_courses { Line 665  sub display_matched_courses {
             $r->print(&Apache::lonnet::domain($cdom,'description')?              $r->print(&Apache::lonnet::domain($cdom,'description')?
                       $cdom.' ('.&Apache::lonnet::domain($cdom,'description').')':$cdom);                        $cdom.' ('.&Apache::lonnet::domain($cdom,'description').')':$cdom);
             $r->print('</td>');              $r->print('</td>');
             unless ($type eq 'Community') {               unless (($type eq 'Community') || ($type eq 'Placement')) { 
                 $r->print('<td>');                  $r->print('<td>');
                 if ($instcode ne '') {                  if ($instcode ne '') {
                     $r->print(&unescape($instcode));                      $r->print(&unescape($instcode));
Line 610  sub get_coordinator_cloneable { Line 763  sub get_coordinator_cloneable {
         my ($cc_clone,$ccrole);          my ($cc_clone,$ccrole);
         if ($type eq 'Community') {          if ($type eq 'Community') {
             $ccrole = 'co';              $ccrole = 'co';
         } elsif ($type eq 'Course') {          } else {
             $ccrole = 'cc';              $ccrole = 'cc';
         }          }
         my %ccroles = &Apache::lonnet::get_my_roles($cloneruname,$clonerudom,          my %ccroles = &Apache::lonnet::get_my_roles($cloneruname,$clonerudom,
Line 624  sub get_coordinator_cloneable { Line 777  sub get_coordinator_cloneable {
     }      }
 }  }
   
 sub search_courses {  
     my ($r,$type,$onlyown,$filter,$numtitles,$cloneruname,$clonerudom,$domcloner,$codetitles) = @_;  
     my (%courses,%showcourses,$cloner,$ccrole);  
     if ($type eq 'Community') {  
         $ccrole = 'co';  
     } else {  
         $ccrole = 'cc';  
     }  
     if (!$onlyown) {  
         $r->print('<div id="searching">'.&mt('Searching ...').'</div>');  
         $r->rflush();  
         if (($filter->{'ownerfilter'} ne '') ||  
             ($filter->{'ownerdomfilter'} ne '')) {  
             $filter->{'combownerfilter'} = $filter->{'ownerfilter'}.':'.  
                                            $filter->{'ownerdomfilter'};  
         }  
         foreach my $item ('descriptfilter','coursefilter','combownerfilter') {  
             if (!$filter->{$item}) {  
                 $filter->{$item}='.';  
             }  
         }  
         my $now = time;  
         my $timefilter =   
            ($filter->{'sincefilter'}==-1?1:$now-$filter->{'sincefilter'});  
         my ($createdbefore,$createdafter);  
         if (($filter->{'createdfilter'} ne '') && ($filter->{'createdfilter'} !=-1)) {  
             $createdbefore = $now;  
             $createdafter = $now-$filter->{'createdfilter'};  
         }  
         my ($instcodefilter,$regexpok);  
         if ($numtitles) {  
             if ($env{'form.official'} eq 'on') {  
                 $instcodefilter =   
                     &Apache::courseclassifier::instcode_search_str($filter->{'domainfilter'},$numtitles,$codetitles);  
                 $regexpok = 1;  
             } elsif ($env{'form.official'} eq 'off') {  
                 $instcodefilter = &Apache::courseclassifier::instcode_search_str($filter->{'domainfilter'},$numtitles,$codetitles);  
                 unless ($instcodefilter eq '') {  
                     $regexpok = -1;  
                 }  
             }  
         } else {  
             $instcodefilter = $filter->{'instcodefilter'};  
         }  
         if ($instcodefilter eq '') { $instcodefilter = '.'; }  
         if ($type eq '') { $type = '.'; }  
    
         if (($clonerudom ne '') && ($cloneruname ne '')) {  
             $cloner = $cloneruname.':'.$clonerudom;    
         }  
         %courses =   
             &Apache::lonnet::courseiddump($filter->{'domainfilter'},  
                                           $filter->{'descriptfilter'},  
                                           $timefilter,  
                                           $instcodefilter,  
                                           $filter->{'combownerfilter'},  
                                           $filter->{'coursefilter'},  
                                           undef,undef,$type,$regexpok,undef,undef,  
                                           undef,undef,$cloner,$env{'form.cc_clone'},  
                                           $filter->{'cloneableonly'},  
                                           $createdbefore,$createdafter,undef,  
                                           $domcloner);  
         if (($filter->{'personfilter'} ne '') && ($filter->{'persondomfilter'} ne '')) {  
             my %rolehash = &Apache::lonnet::get_my_roles($filter->{'personfilter'},  
                                                          $filter->{'persondomfilter'},  
                                                          'userroles',undef,  
                                                          [$ccrole,'in','ad','ep','ta','cr'],  
                                                          $filter->{'domainfilter'});  
             foreach my $role (keys(%rolehash)) {  
                 my ($cnum,$cdom,$courserole) = split(':',$role);  
                 my $cid = $cdom.'_'.$cnum;  
                 if (exists($courses{$cid})) {  
                     if (ref($courses{$cid}) eq 'HASH') {  
                         if (ref($courses{$cid}{roles}) eq 'ARRAY') {  
                             if (!grep(/^\Q$courserole\E$/,@{$courses{$cid}{roles}})) {   
                                 push (@{$courses{$cid}{roles}},$courserole);  
                             }  
                         } else {  
                             $courses{$cid}{roles} = [$courserole];  
                         }  
                         $showcourses{$cid} = $courses{$cid};  
                     }  
                 }  
             }  
             %courses = %showcourses;  
         }  
     } else {  
         $r->print('<br />');  
         my %coursehash = &Apache::loncommon::findallcourses();   
         foreach my $cid (sort(keys(%coursehash))) {  
             $courses{$cid}{'description'} = $env{'course.'.$cid.'.description'};  
         }  
     }  
     return %courses;  
 }  
   
 sub course_chooser {  sub course_chooser {
     my ($multiple,$cdom,$cnum,$cleandesc,$canclone) = @_;      my ($multiple,$cdom,$cnum,$cleandesc,$canclone) = @_;
     my $output;       my $output; 
Line 727  sub course_chooser { Line 784  sub course_chooser {
         $output = '<label><input type="checkbox" name="course_id" value="'.$cdom.'_'.$cnum.'" />'."\n";          $output = '<label><input type="checkbox" name="course_id" value="'.$cdom.'_'.$cnum.'" />'."\n";
     } elsif ((($env{'form.form'} eq 'ccrs') || ($env{'form.form'} eq 'requestcrs')) && (!$canclone))  {      } elsif ((($env{'form.form'} eq 'ccrs') || ($env{'form.form'} eq 'requestcrs')) && (!$canclone))  {
         if ($env{'form.form'} eq 'ccrs') {          if ($env{'form.form'} eq 'ccrs') {
             $output = &mt('No cloning for ').$env{'form.cloner'}."\n";              $output = &mt('No cloning for [_1]',$env{'form.cloner'})."\n";
         } else {          } else {
             $output = &mt('No rights to clone')."\n";              $output = &mt('No rights to clone')."\n";
         }          }
Line 751  sub gochoose_javascript { Line 808  sub gochoose_javascript {
                                  total => 'coursetotal',                                   total => 'coursetotal',
                                  list  => 'courselist',                                   list  => 'courselist',
                               },                                },
                        'Placement' => {
                                    name  => 'coursepick',
                                    total => 'coursetotal',
                                    list  => 'courselist',
                                    },
                     );                      );
     my $output = qq|      my $output = qq|
 function gochoose(cname,cdom,cdesc) {  function gochoose(cname,cdom,cdesc) {
Line 872  Course Activity - how recently was cours Line 934  Course Activity - how recently was cours
 Course Domain - the domain of the course  Course Domain - the domain of the course
   
 =item *  =item *
 Type - Course or Community  Type - Course, Community or Placement
   
 =item *  =item *
 Course Institutional Code - the institutional identifier assigned to the course  Course Institutional Code - the institutional identifier assigned to the course
Line 925  Following selection, and/or submission, Line 987  Following selection, and/or submission,
 X<create_user_javascript()>  X<create_user_javascript()>
 B<create_user_javascript($type)>:  B<create_user_javascript($type)>:
   
 Input: 1 - $type  - the course type - Course or Community  Input: 1 - $type  - the course type - Course, Community, or Placement
   
 Output: 1 - $output - javascript wrapped in E<lt>scriptE<gt>E<lt>/scriptE<gt> tags   Output: 1 - $output - javascript wrapped in E<lt>scriptE<gt>E<lt>/scriptE<gt> tags 
   
Line 936  javascript code for reporting selected s Line 998  javascript code for reporting selected s
   
 =item *  =item *
 X<display_matched_courses()>  X<display_matched_courses()>
 B<display_matched_courses($r,$type,$multiple,$action,$showroles,$cloneruname,$clonerudom,%courses)>:  B<display_matched_courses($r,$type,$multiple,$action,$showroles,$cloneruname,$clonerudom,$crsdom,$crscode,%courses)>:
   
 Input: 7 - request object, course type, multiple (0 or 1), form action, whether to show roles (for course personnel filter), username of new course owner, domain of new course owner, hash of courses.  Input: 8 - request object, course type, multiple (0 or 1), form action, whether to show roles (for course personnel filter), username of new course owner, domain of new course owner, domain of new course, institutional code of new course, hash of courses.
   
 Output: 0  Output: 0
   
Line 955  Output: 2 - $jscript - javascript for ch Line 1017  Output: 2 - $jscript - javascript for ch
   
 Side Effects: None  Side Effects: None
   
 =item *  
 X<search_courses()>  
 B<search_courses($r,$type,$onlyown,$filter,$numtitles,$cloneruname,$clonerudom,  
                  $domcloner,$codetitles)>:  
   
   
 Input: 9 -  request object, course type, search scope: only courses in which user has active role (1), or any course (0); anonymous hash of criteria and their values; for institutional codes - number of categories; optional username of new course owner, optional domain of new course owner). Seventh and eighth needed when search is for courses to clone from course request form, or course creation form (DC). Optional "domcloner" flag (has value=1 if user has ccc priv in    
 domain being filtered by (used when DC is using course creation form). Ninth is reference to array of titles of components in institutional codes (official courses).  
   
 Output: 1 - %courses - hash of courses satisfying search criteria, keys = course IDs, values are corresponding colon-separated escaped description, institutional code, owner and type.  
   
 Side Effects: None  
   
   
 =item *  =item *
 X<course_chooser()>  X<course_chooser()>

Removed from v.1.111  
changed lines
  Added in v.1.120


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