Diff for /loncom/interface/lonrequestcourse.pm between versions 1.36.2.3 and 1.39

version 1.36.2.3, 2009/10/24 03:56:01 version 1.39, 2009/11/04 17:42:17
Line 130  sub handler { Line 130  sub handler {
     }      }
   
     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},      &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
                                             ['action','showdom','cnum','state']);          ['action','showdom','cnum','state','crstype']);
     &Apache::lonhtmlcommon::clear_breadcrumbs();      &Apache::lonhtmlcommon::clear_breadcrumbs();
     my $dom = &get_course_dom();      my $dom = &get_course_dom();
     my $action = $env{'form.action'};      my $action = $env{'form.action'};
Line 234  sub handler { Line 234  sub handler {
                                     foreach my $item (@code_order) {                                      foreach my $item (@code_order) {
                                         $crosslistcode .= $env{'form.crosslist_'.$i.'_'.$item};                                           $crosslistcode .= $env{'form.crosslist_'.$i.'_'.$item}; 
                                     }                                      }
                                     if ($crosslistcode ne '') {                                      if ($crosslistcode ne '') { 
                                         ($codechk{$i}, my $rest) =                                           ($codechk{$i}, my $rest) = 
                                             &Apache::lonnet::auto_validate_instcode('',$dom,$crosslistcode);                                              &Apache::lonnet::auto_validate_instcode('',$dom,$crosslistcode);
                                     }                                      }
                                     unless ($codechk{$i} eq 'valid') {                                      unless ($codechk{$i} eq 'valid') {
Line 272  sub handler { Line 272  sub handler {
   
     my $loaditems = &onload_action($action,$state);      my $loaditems = &onload_action($action,$state);
   
     my %can_request;      my (%can_request,%request_domains);
     my $canreq = &Apache::lonnet::check_can_request($dom,\%can_request);      my $canreq = 
           &Apache::lonnet::check_can_request($dom,\%can_request,\%request_domains);
     if ($action eq 'new') {      if ($action eq 'new') {
         if ($canreq) {          if ($canreq) {
             if ($state eq 'crstype') {              if ($state eq 'crstype') {
                 &print_main_menu($r,\%can_request,\%states,$dom,$jscript,$loaditems,                  &print_main_menu($r,\%can_request,\%states,$dom,$jscript,$loaditems,
                                  $crumb);                                   $crumb,\%request_domains);
             } else {              } else {
                 &request_administration($r,$action,$state,$page,\%states,$dom,                  &request_administration($r,$action,$state,$page,\%states,$dom,
                                         $jscript,$loaditems,$crumb,$newinstcode,                                          $jscript,$loaditems,$crumb,$newinstcode,
Line 293  sub handler { Line 294  sub handler {
         }          }
     } elsif ($action eq 'view') {      } elsif ($action eq 'view') {
         if ($state eq 'crstype') {          if ($state eq 'crstype') {
             &print_main_menu($r,\%can_request,\%states,$dom,$jscript,$loaditems,$crumb);              &print_main_menu($r,\%can_request,\%states,$dom,$jscript,$loaditems,$crumb,\%request_domains);
         } else {          } else {
             &request_administration($r,$action,$state,$page,\%states,$dom,$jscript,              &request_administration($r,$action,$state,$page,\%states,$dom,$jscript,
                                     $loaditems,$crumb);                                      $loaditems,$crumb);
Line 312  sub handler { Line 313  sub handler {
     } elsif ($action eq 'log') {      } elsif ($action eq 'log') {
         &print_request_logs($jscript,$loaditems,$crumb);          &print_request_logs($jscript,$loaditems,$crumb);
     } else {      } else {
         &print_main_menu($r,\%can_request,\%states,$dom,$jscript,'',$crumb);          &print_main_menu($r,\%can_request,\%states,$dom,$jscript,'',$crumb,\%request_domains);
     }      }
     return OK;      return OK;
 }  }
Line 591  sub onload_action { Line 592  sub onload_action {
 }  }
   
 sub print_main_menu {  sub print_main_menu {
     my ($r,$can_request,$states,$dom,$jscript,$loaditems,$crumb) = @_;      my ($r,$can_request,$states,$dom,$jscript,$loaditems,$crumb,$request_domains) = @_;
     my ($types,$typename) = &Apache::loncommon::course_types();      my ($types,$typename) = &Apache::loncommon::course_types();
     my $onchange;      my $onchange;
     unless ($env{'form.interface'} eq 'textual') {      unless ($env{'form.interface'} eq 'textual') {
         $onchange = 1;          $onchange = 'this.form.submit()';
     }      }
   
     my $nextstate_setter = "\n";      my $nextstate_setter = "\n";
Line 611  sub print_main_menu { Line 612  sub print_main_menu {
         }          }
     }      }
   
     my $standby=&mt('Course selected. Please stand by.');  
     my $js = <<"END";      my $js = <<"END";
   
 function enterrole (thisform,rolecode,buttonname) {  
     document.title='$standby';  
     window.status='$standby';  
     thisform.newrole.value=rolecode;  
     thisform.selectrole.value='1';  
     thisform.submit();  
 }  
   
 function ToSyllabus(cdom,cnum) {  
     if (cdom == '' || cdom == null) {  
         return;  
     }  
     if (cnum == '' || cnum == null) {  
         return;  
     }  
     var options = 'height=600,width=800,resizable=yes,scrollbars=yes,location=no,menubar=no,toolbar=no';  
     var url = "/public/"+cdom+"/"+cnum+"/syllabus";  
     syllwin = window.open(url,'',options,1);  
     syllwin.focus();  
     return;  
 }  
   
 function nextPage(formname) {  function nextPage(formname) {
     var crschoice = document.mainmenu_coursetype.crstype.value;      var crschoice = document.mainmenu_coursetype.crstype.value;
     var actionchoice = document.mainmenu_action.action.value;      var actionchoice = document.mainmenu_action.action.value;
Line 658  function check_can_request(crschoice,act Line 636  function check_can_request(crschoice,act
     var unofficial = '';      var unofficial = '';
     var community = '';          var community = '';    
 END  END
       if (ref($can_request) eq 'HASH') {
     foreach my $item (keys(%{$can_request})) {          foreach my $item (keys(%{$can_request})) {
             $js .= "                   $js .= " 
         $item = 1;          $item = 1;
 ";  ";
           }
     }      }
     my %lt = &Apache::lonlocal::texthash(      my %lt = &Apache::lonlocal::texthash(
         official => 'You are not permitted to request creation of an official course in this domain.',          official => 'You are not permitted to request creation of an official course in this domain.',
Line 698  END Line 677  END
     }      }
     return true;      return true;
 }  }
   
 END  END
     $r->print(&header('Concept Test Courses',$js.$jscript,$loaditems).$crumb);      my ($pagetitle,$pageinfo,$domaintitle);
     my $existing = &existing_courses();      if (ref($can_request) eq 'HASH') {
     if ($existing) {          if (($can_request->{'official'}) || ($can_request->{'unofficial'})) {
         $r->print('<div class="LC_left_float">'.              if ($can_request->{'community'}) {
                  '<h3>'.&mt('Request creation of a new course').'</h3>');                  $pagetitle = 'Course/Community Requests';
     } else {                  $pageinfo = &mt('Request creation of a new course or community, or review your pending requests.');
         $r->print('<div><h3>'.&mt('Request creation of a new course, or review your pending course requests.').'</h3>');                  $domaintitle = &mt('Course/Community Domain');
               } else {
                   $pagetitle = 'Course Requests';
                   $pageinfo = &mt('Request creation of a new course, or review your pending course requests.');
                   $domaintitle = &mt('Course Domain');
               }
           } elsif ($can_request->{'community'}) {
               $pagetitle = 'Course/Community Requests';
               $pageinfo = &mt('Request creation of a new course or community, or review your pending requests.');
               $domaintitle = &mt('Community Domain');
           } else {
               $pagetitle = 'Course/Community Requests';
               $pageinfo = &mt('You do not have rights to request creation of courses in this domain; please choose a different domain.');
               $domaintitle = &mt('Course/Community Domain');
           }
       }
       my @incdoms;
       if (ref($request_domains) eq 'HASH') {
           foreach my $item (keys(%{$request_domains})) {
               if (ref($request_domains->{$item}) eq 'ARRAY') {
                   foreach my $possdom (@{$request_domains->{$item}}) {
                       unless(grep(/^\Q$possdom\E$/,@incdoms)) {
                           push(@incdoms,$possdom);
                       } 
                   } 
               }
           }
     }      }
     $r->print('<p>'.      $r->print(&header($pagetitle,$js.$jscript,$loaditems).$crumb.
                '<p>'.$pageinfo.'</p>'.
                '<div>'.
               &Apache::lonhtmlcommon::start_pick_box().                &Apache::lonhtmlcommon::start_pick_box().
               &Apache::lonhtmlcommon::row_title(&mt('Course Domain')).                &Apache::lonhtmlcommon::row_title($domaintitle).
               '<form name="domforcourse" method="post" action="/adm/requestcourse">');                '<form name="domforcourse" method="post" action="/adm/requestcourse">'.
     $r->print('GCI Web Center Concept Test Delivery (gcitest)'."\n".                &Apache::loncommon::select_dom_form($dom,'showdom','',1,$onchange,\@incdoms));
               '<input type="hidden" value="gcitest" name="showdom" />');      if (!$onchange) {
           $r->print('&nbsp;<input type="submit" name="godom" value="'.
                      &mt('Change').'" />');
       }
       unless ((ref($can_request) eq 'HASH') && (keys(%{$can_request}) > 0)) {
           $r->print(&Apache::lonhtmlcommon::row_closure(1)."\n".
                     &Apache::lonhtmlcommon::end_pick_box().'</div>'."\n".
                     &Apache::loncommon::end_page());
           return;
       }
     $r->print('</form>'.&Apache::lonhtmlcommon::row_closure());      $r->print('</form>'.&Apache::lonhtmlcommon::row_closure());
   
     my $formname = 'requestcrs';      my $formname = 'requestcrs';
     my $nexttext = &mt('Next');      my $nexttext = &mt('Next');
     $r->print(&Apache::lonhtmlcommon::row_title(&mt('Action')).'      $r->print(&Apache::lonhtmlcommon::row_title(&mt('Action')).'
Line 723  END Line 737  END
 <select size="1" name="action" >  <select size="1" name="action" >
  <option value="new">'.&mt('New request').'</option>   <option value="new">'.&mt('New request').'</option>
  <option value="view">'.&mt('View/Modify/Cancel pending requests').'</option>   <option value="view">'.&mt('View/Modify/Cancel pending requests').'</option>
    <option value="log">'.&mt('View request history').'</option>
 </select></form>'.  </select></form>'.
               &Apache::lonhtmlcommon::row_closure(1).                &Apache::lonhtmlcommon::row_closure(1).
               &Apache::lonhtmlcommon::row_title(&mt('Course Type')).                &Apache::lonhtmlcommon::row_title(&mt('Type')).'
               &mt($typename->{'unofficial'})."\n".  <form name="mainmenu_coursetype" method="post" action="">
               '<form name="mainmenu_coursetype" method="post" action="">'."\n".  <select size="1" name="crstype">');
               '<input type="hidden" name="crstype" value="unofficial" ></form>'."\n".      if (ref($can_request) eq 'HASH') {
           if (keys(%{$can_request}) > 1) {
               $r->print(' <option value="any">'.&mt('All types').'</option>');
           }
           if ((ref($types) eq 'ARRAY') && (ref($typename) eq 'HASH')) {
               foreach my $type (@{$types}) {
                   next unless($can_request->{$type});
                   my $selected = '';
                   if ($env{'form.crstype'} eq '') {
                       if ($type eq 'official') {
                           $selected = ' selected="selected"';
                       }
                   } else {
                       if ($type eq $env{'form.crstype'}) {
                           $selected = ' selected="selected"';
                       }
                   }
                   $r->print('<option value="'.$type.'"'.$selected.'>'.&mt($typename->{$type}).
                             '</option>'."\n");
               }
           }
       }
       $r->print('</select></form>'."\n".
               &Apache::lonhtmlcommon::row_closure(1)."\n".                &Apache::lonhtmlcommon::row_closure(1)."\n".
               &Apache::lonhtmlcommon::end_pick_box().'</p>'."\n".                &Apache::lonhtmlcommon::end_pick_box().'</div>'."\n".
               '<p><form name="'.$formname.'" method="post" action="">'."\n".                '<div><form name="'.$formname.'" method="post" action="/adm/requestcourse">'."\n".
               '<input type="hidden" name="state" value="crstype" />'."\n".                '<input type="hidden" name="state" value="crstype" />'."\n".
               '<input type="hidden" name="showdom" value="'.$dom.'" />'."\n".                '<input type="hidden" name="showdom" value="'.$dom.'" />'."\n".
               '<input type="hidden" name="crstype" value="" />'."\n".                '<input type="hidden" name="crstype" value="" />'."\n".
               '<input type="hidden" name="action" value="" />'."\n".                '<input type="hidden" name="action" value="" />'."\n".
               '<input type="button" name="next" value="'.$nexttext.                '<input type="button" name="next" value="'.$nexttext.
               '" onclick="javascript:nextPage(document.'.$formname.')" />'."\n".                '" onclick="javascript:nextPage(document.'.$formname.')" />'."\n".
               '</form></p>');                '</form></div>');
     if ($existing) {  
         $r->print('</div><div class="LC_left_float"><h3>'.&mt('Enter an existing Concept Test course').'</h3>'.$existing.'</div><div class="LC_clear_float_footer"></div>');  
     } else {  
         $r->print('</div>');  
     }  
     $r->print(&Apache::loncommon::end_page());      $r->print(&Apache::loncommon::end_page());
     return;      return;
 }  }
   
 sub existing_courses {  
     my $output;  
     my %roleshash = &Apache::lonnet::get_my_roles(undef,undef,'userroles',undef,  
                                                   ['cc'],['gcitest']);  
     my %courses;  
     if (keys(%roleshash) > 0) {  
         foreach my $key (keys(%roleshash)) {  
             my ($cnum,$cdom,$role) = split(':',$key);  
             my ($tstart,$tend) = split(':',$roleshash{$key});  
             my %coursehash = &Apache::lonnet::coursedescription($cdom.'/'.$cnum);  
             $courses{$cdom.'_'.$cnum}{'description'} = $coursehash{'description'};  
             $courses{$cdom.'_'.$cnum}{'owner'} = $coursehash{'internal.courseowner'};  
             if (defined($coursehash{'default_enrollment_start_date'}) ) {  
                 $courses{$cdom.'_'.$cnum}{'startaccess'} =   
                     &Apache::lonlocal::locallocaltime($coursehash{'default_enrollment_start_date'});  
             }  
             if (defined($coursehash{'default_enrollment_end_date'}) ) {  
                 $courses{$cdom.'_'.$cnum}{'endaccess'} =   
                     &Apache::lonlocal::locallocaltime($coursehash{'default_enrollment_end_date'});  
                 if ($coursehash{'default_enrollment_end_date'} == 0) {  
                     $courses{$cdom.'_'.$cnum}{'endaccess'} = &mt('No ending date');  
                 }  
             }  
         }  
         $output = '<form name="pickrole" action="/adm/roles" method="post">'.  
                   &Apache::loncommon::start_data_table().  
                   &Apache::loncommon::start_data_table_header_row();  
         my @coltitles = ('Select','Title','Owner(s)',  
                          'Default Access Dates for Students','Student Counts');  
         foreach my $item (@coltitles) {  
             $output .= '<th>';  
             if ($item eq 'Select') {  
                 $output .= '&nbsp;&nbsp;';  
             } else {  
                 $output .= &mt($item);  
             }  
             $output .= '</th>';  
         }  
         $output .= &Apache::loncommon::end_data_table_header_row();  
         my %courseinfo = &build_courseinfo_hash(\%courses);  
         my %Sortby;  
         foreach my $course (sort(keys(%courses))) {  
             my $clean_title = $courseinfo{$course}{'title'};  
             $clean_title =~ s/\W+//g;  
             if ($clean_title eq '') {  
                 $clean_title = $courseinfo{$course}{'title'};  
             }  
             push(@{$Sortby{$clean_title}},$course);  
         }  
         my @sorted_courses;  
         my @sorted_courses = sort { lc($a) cmp lc($b) } (keys(%Sortby));  
         foreach my $item (@sorted_courses) {  
             foreach my $course (@{$Sortby{$item}}) {  
                 my ($cdom,$cnum) = split('_',$course);   
                 $output.= &Apache::loncommon::start_data_table_row().  
                           &courseinfo_row($courseinfo{$course},$cnum,$cdom).  
                           &Apache::loncommon::end_data_table_row();  
             }  
         }  
         $output .= &Apache::loncommon::end_data_table().  
                    '<input type="hidden" name="newrole" value="" />'.  
                    '<input type="hidden" name="selectrole" value="" /></form>';  
     }  
     return $output;  
 }  
   
 sub build_courseinfo_hash {  
     my ($courses) = @_;  
     my %courseinfo;  
     foreach my $course (keys(%{$courses})) {  
         my ($cdom,$cnum) = split('_',$course);  
         my $descr;  
         if (ref($courses->{$course}) eq 'HASH') {  
             $descr = $courses->{$course}{'description'};  
         }  
         my $cleandesc=&HTML::Entities::encode($descr,'<>&"');  
         $cleandesc=~s/'/\\'/g;  
         $cleandesc =~ s/^\s+//;  
         my ($cdom,$cnum)=split(/\_/,$course);  
         my ($singleowner,@owners,%ownernames);  
         if (ref($courses->{$course}) eq 'HASH') {  
             $singleowner = $courses->{$course}{'owner'};  
             push(@owners,$singleowner);  
             if (ref($courses->{$course}{'co-owners'}) eq 'ARRAY') {  
                 foreach my $item (@{$courses->{$course}{'co-owners'}}) {  
                     push(@owners,$item);  
                 }  
             }  
         }  
         foreach my $owner (@owners) {  
             my ($ownername,$ownerdom);  
             if ($owner =~ /:/) {  
                 ($ownername,$ownerdom) = split(/:/,$owner);  
             } else {  
                 $ownername = $owner;  
                 if ($owner ne '') {  
                     $ownerdom = $cdom;  
                 }  
             }  
             if ($ownername ne '' && $ownerdom ne '') {  
                 my %namehash=&Apache::loncommon::getnames($ownername,$ownerdom);  
                 $ownernames{$ownername.':'.$ownerdom} = \%namehash;  
             }  
         }  
         $courseinfo{$course}{'cdom'} = $cdom;  
         $courseinfo{$course}{'cnum'} = $cnum;  
         my @lastnames;  
         foreach my $owner (keys(%ownernames)) {  
             if (ref($ownernames{$owner}) eq 'HASH') {  
                 push(@lastnames,$ownernames{$owner}{'lastname'});  
             }  
         }  
         $courseinfo{$course}{'ownerlastnames'} = join(', ',sort(@lastnames));  
         $courseinfo{$course}{'title'} = $cleandesc;  
         $courseinfo{$course}{'owner'} = $singleowner;  
         my @classids;  
         $courseinfo{$course}{'counts'} =  &count_students($cdom,$cnum,0);  
         my $startaccess = $courses->{$course}{'startaccess'};  
         my $endaccess = $courses->{$course}{'endaccess'};  
         my $accessdates;  
         if ($startaccess) {  
             $accessdates .= '<i>'.&mt('From:[_1]','</i> '.$startaccess).'<br />';  
         }  
         if ($endaccess) {  
             $accessdates .= '<i>'.&mt('To:[_1]','</i> '.$endaccess).'<br />';  
         }  
         $courseinfo{$course}{'access'} = $accessdates;  
     }  
     return %courseinfo;  
 }  
   
 sub courseinfo_row {  
     my ($info,$cnum,$cdom) = @_;  
     my $output;  
     if (ref($info) eq 'HASH') {  
         my $rolecode = 'cc./'.$cdom.'/'.$cnum;  
         my $buttonname = $rolecode;  
         $buttonname=~s/\W//g;  
         $output .= '<td><input type="button" name="'.$buttonname.'" value="'.&mt('Select').'" onclick="javascript:enterrole(this.form,'."'$rolecode','$buttonname'".')" ></td>'.  
                    '<td>'.$info->{'title'}.'&nbsp;<font size="-2">'.  
                    '<a href="javascript:ToSyllabus('."'$cdom','$cnum'".')">'.  
                    &mt('Syllabus').'</a></font></td>'.  
                    '<td>'.$info->{'ownerlastnames'}.'</td>'.  
                    '<td>'.$info->{'access'}.'</td>'.  
                    '<td>'.$info->{'counts'}.'</td>';  
     } else {  
         $output = '<td colspan="4">'.&mt('No information available for [_1].',  
                                          $cdom.'_'.$cnum).'</td>';  
         return $output;  
     }  
     return $output;  
 }  
   
 sub count_students {  
     my ($cdom,$cnum,$numsec) = @_;  
     my $classlist = &Apache::loncoursedata::get_classlist($cdom,$cnum);  
     my %student_count = (  
                            Active => 0,  
                            Future => 0,  
                            Expired => 0,  
                        );  
     my %idx;  
     $idx{'status'} = &Apache::loncoursedata::CL_STATUS();  
     my %status_title = &Apache::lonlocal::texthash(  
                            Expired => 'Previous access',  
                            Active => 'Current access',  
                            Future => 'Future access',  
                        );  
   
     while (my ($student,$data) = each(%$classlist)) {  
         $student_count{$data->[$idx{'status'}]} ++;  
     }  
   
     my $countslist = &mt('[quant,_1,section:,sections:,No sections]',$numsec).'<br />';  
     foreach my $status ('Active','Future') {  
         $countslist .= '<span class="LC_nobreak">'.$status_title{$status}.': '.  
                        $student_count{$status}.'</span><br />';  
     }  
     return $countslist;  
 }  
   
   
 sub request_administration {  sub request_administration {
     my ($r,$action,$state,$page,$states,$dom,$jscript,$loaditems,$crumb,      my ($r,$action,$state,$page,$states,$dom,$jscript,$loaditems,$crumb,
         $newinstcode,$codechk,$checkedcode,$description,$invalidcrosslist,          $newinstcode,$codechk,$checkedcode,$description,$invalidcrosslist,
Line 2235  sub print_review { Line 2085  sub print_review {
     if (($env{'form.clonecrs'} =~ /^$match_name$/) &&       if (($env{'form.clonecrs'} =~ /^$match_name$/) && 
         ($env{'form.clonedom'} =~ /^$match_domain$/)) {          ($env{'form.clonedom'} =~ /^$match_domain$/)) {
         my $canclone = &Apache::loncoursequeueadmin::can_clone_course($env{'user.name'},          my $canclone = &Apache::loncoursequeueadmin::can_clone_course($env{'user.name'},
                            $env{'user.domain'},$env{'form.clonecrs'}, $env{'form.clonedom'});                             $env{'user.domain'},$env{'form.clonecrs'},$env{'form.clonedom'},
                              $env{'form.crstype'});
         if ($canclone) {          if ($canclone) {
             my %courseenv = &Apache::lonnet::userenvironment($env{'form.clonedom'},              my %courseenv = &Apache::lonnet::userenvironment($env{'form.clonedom'},
                               $env{'form.clonecrs'},('description','internal.coursecode'));                                $env{'form.clonecrs'},('description','internal.coursecode'));
Line 2801  sub print_request_outcome { Line 2652  sub print_request_outcome {
         if ($clonehome ne 'no_host') {            if ($clonehome ne 'no_host') {  
             my $canclone =                my $canclone =  
                 &Apache::loncoursequeueadmin::can_clone_course($env{'user.name'},                  &Apache::loncoursequeueadmin::can_clone_course($env{'user.name'},
                         $env{'user.domain'},$env{'form.clonecrs'}, $env{'form.clonedom'});                          $env{'user.domain'},$env{'form.clonecrs'},$env{'form.clonedom'},
                           $crstype);
             if ($canclone) {              if ($canclone) {
                 $clonecrs = $env{'form.clonecrs'};                  $clonecrs = $env{'form.clonecrs'};
                 $clonedom = $env{'form.clonedom'};                  $clonedom = $env{'form.clonedom'};

Removed from v.1.36.2.3  
changed lines
  Added in v.1.39


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