Diff for /loncom/interface/slotrequest.pm between versions 1.90 and 1.91

version 1.90, 2009/03/20 10:05:08 version 1.91, 2009/03/27 06:47:59
Line 56  sub fail { Line 56  sub fail {
 }  }
   
 sub start_page {  sub start_page {
     my ($r,$title)=@_;      my ($r,$title,$brcrum)=@_;
     $r->print(&Apache::loncommon::start_page($title));      my $args;
       if (ref($brcrum) eq 'ARRAY') {
           $args = {bread_crumbs => $brcrum};
       }
       $r->print(&Apache::loncommon::start_page($title,undef,$args));
 }  }
   
 sub end_page {  sub end_page {
Line 133  sub check_for_reservation { Line 137  sub check_for_reservation {
  return 'error: Unable to determine current status';   return 'error: Unable to determine current status';
     }          }    
     my @got;      my @got;
     foreach my $slot_name (sort {      my @sorted_slots = &Apache::loncommon::sorted_slots(\@slots,\%slots);
  if (ref($slots{$a}) && ref($slots{$b})) {      foreach my $slot_name (@sorted_slots) {
     return $slots{$a}{'starttime'} <=> $slots{$b}{'starttime'}  
  }  
  if (ref($slots{$a})) { return -1;}  
  if (ref($slots{$b})) { return 1;}  
  return 0;  
     } @slots) {  
  next if (!defined($slots{$slot_name}) ||   next if (!defined($slots{$slot_name}) ||
  !ref($slots{$slot_name}));   !ref($slots{$slot_name}));
  &Apache::lonxml::debug(time." $slot_name ".   &Apache::lonxml::debug(time." $slot_name ".
Line 340  sub store_slot_parm { Line 338  sub store_slot_parm {
     &Apache::lonnet::instructor_log('slotreservationslog',\%storehash,      &Apache::lonnet::instructor_log('slotreservationslog',\%storehash,
                                     '',$env{'user.name'},$env{'user.domain'},                                      '',$env{'user.name'},$env{'user.domain'},
                                     $cnum,$cdom);                                      $cnum,$cdom);
       &Apache::lonnet::instructor_log($cdom.'_'.$cnum.'_slotlog',\%storehash,
                                       1,$env{'user.name'},$env{'user.domain'},
                                       $env{'user.name'},$env{'user.domain'});
   
     return;      return;
 }  }
   
Line 533  sub release_reservation { Line 535  sub release_reservation {
                                context => $env{'form.context'},                                 context => $env{'form.context'},
                         );                          );
             &Apache::lonnet::instructor_log('slotreservationslog',\%storehash,              &Apache::lonnet::instructor_log('slotreservationslog',\%storehash,
                                         1,$uname,$udom,$cnum,$cdom);                                              1,$uname,$udom,$cnum,$cdom);
               &Apache::lonnet::instructor_log($cdom.'_'.$cnum.'_slotlog',\%storehash,
                                               1,$uname,$udom,$uname,$udom);
  }   }
     }      }
   
Line 598  sub delete_slot { Line 602  sub delete_slot {
   
 sub return_link {  sub return_link {
     my ($r) = @_;      my ($r) = @_;
     $r->print('<p><a href="/adm/flip?postdata=return:">'.      if (($env{'form.command'} eq 'manageresv') || ($env{'form.context'} eq 'usermanage')) {
       &mt('Return to last resource').'</a></p>');   $r->print('<p><a href="/adm/slotrequest?command=manageresv">'.
                     &mt('Return to reservations'));  
       } else {
           $r->print('<p><a href="/adm/flip?postdata=return:">'.
             &mt('Return to last resource').'</a></p>');
       }
 }  }
   
 sub get_slot {  sub get_slot {
Line 805  sub get_description { Line 814  sub get_description {
 }  }
   
 sub show_choices {  sub show_choices {
     my ($r,$symb)=@_;      my ($r,$symb,$formname)=@_;
   
     my ($cnum,$cdom)=&get_course();      my ($cnum,$cdom)=&get_course();
     my %slots=&Apache::lonnet::dump('slots',$cdom,$cnum);      my %slots=&Apache::lonnet::dump('slots',$cdom,$cnum);
Line 823  sub show_choices { Line 832  sub show_choices {
                   '</span>');                    '</span>');
         return;          return;
     }      }
     my $available;      my (@available,$output);
     &Apache::lonxml::debug("Checking Slots");      &Apache::lonxml::debug("Checking Slots");
     my @got_slots=&check_for_reservation($symb,'allslots');      my @got_slots=&check_for_reservation($symb,'allslots');
     if ($got_slots[0] =~ /^error: /) {      if ($got_slots[0] =~ /^error: /) {
Line 832  sub show_choices { Line 841  sub show_choices {
                   '</span>');                    '</span>');
         return;          return;
     }      }
     $r->print('<table border="1">');  
     foreach my $slot (sort       foreach my $slot (sort 
       { return $slots{$a}->{'starttime'} <=> $slots{$b}->{'starttime'} }        { return $slots{$a}->{'starttime'} <=> $slots{$b}->{'starttime'} }
       (keys(%slots)))  {        (keys(%slots)))  {
Line 841  sub show_choices { Line 849  sub show_choices {
  next if (!&allowed_slot($slot,$slots{$slot},undef,\%slots,   next if (!&allowed_slot($slot,$slots{$slot},undef,\%slots,
  $consumed_uniqueperiods));   $consumed_uniqueperiods));
   
  $available++;          push(@available,$slot);
       }
       if (!@available) {
           $output = &mt('No available times.');
           if ($env{'form.command'} ne 'manageresv') {
               $output .= ' <a href="/adm/flip?postdata=return:">'.
                          &mt('Return to last resource').'</a>';
           }
           $r->print($output);
           return;
       }
       if ($env{'form.command'} eq 'manageresv') {
           $output = '<table border="0">';
       } else {
           $output = &Apache::loncommon::start_data_table();
       }
       foreach my $slot (@available) { 
  my $description=&get_description($slot,$slots{$slot});   my $description=&get_description($slot,$slots{$slot});
    my $form;
  my $form=&mt('Unavailable');  
  if ((grep(/^\Q$slot\E$/,@got_slots)) ||   if ((grep(/^\Q$slot\E$/,@got_slots)) ||
     &space_available($slot,$slots{$slot},$symb)) {      &space_available($slot,$slots{$slot},$symb)) {
     my $text=&mt('Select');      my $text=&mt('Select');
Line 859  sub show_choices { Line 881  sub show_choices {
    $consumed_uniqueperiods);     $consumed_uniqueperiods);
                 if ($conflict) {                  if ($conflict) {
                     if ($conflict =~ /^error: /) {                      if ($conflict =~ /^error: /) {
                         $r->print('<tr><td><span class="LC_error" colspan="2">'                          $form = '<span class="LC_error">'.
                                   .&mt('Slot: [_1] has unknown status.',$description)                                  &mt('Slot: [_1] has unknown status.',$description).
                                   .'</span></td></tr>');                                  '</span>';
                     } else {                      } else {
         $text=&mt('Change Reservation');          $text=&mt('Change Reservation');
         $command='get';          $command='get';
Line 869  sub show_choices { Line 891  sub show_choices {
                 }                  }
     }      }
     my $escsymb=&escape($symb);      my $escsymb=&escape($symb);
     $form=<<STUFF;              if (!$form) {
    <form method="post" action="/adm/slotrequest">                  if ($formname) {
                       $formname = 'name="'.$formname.'" ';
                   }
                   my $context = 'user';
                   if ($env{'form.command'} eq 'manageresv') {
                       $context = 'usermanage';
                   }
           $form=<<STUFF;
      <form method="post" action="/adm/slotrequest" $formname>
      <input type="submit" name="Select" value="$text" />       <input type="submit" name="Select" value="$text" />
      <input type="hidden" name="symb" value="$escsymb" />       <input type="hidden" name="symb" value="$escsymb" />
      <input type="hidden" name="slotname" value="$slot" />       <input type="hidden" name="slotname" value="$slot" />
      <input type="hidden" name="command" value="$command" />       <input type="hidden" name="command" value="$command" />
      <input type="hidden" name="context" value="user" />       <input type="hidden" name="context" value="$context" />
    </form>     </form>
 STUFF  STUFF
  }      }
  $r->print(<<STUFF);          } else {
 <tr>              $form = &mt('Unavailable');
           }
           if ($env{'form.command'} eq 'manageresv') {
               $output .= '<tr>';
           } else {
       $output .= &Apache::loncommon::start_data_table_row();
           }
           $output .= " 
  <td>$form</td>   <td>$form</td>
  <td>$description</td>   <td>$description</td>\n";
 </tr>          if ($env{'form.command'} eq 'manageresv') {
 STUFF              $output .= '</tr>';
           } else {
               $output .= &Apache::loncommon::end_data_table_row();
           }
     }      }
       if ($env{'form.command'} eq 'manageresv') {
     if (!$available) {          $output .= '</table>';
  $r->print('<tr><td>'.&mt('No available times.').      } else {
                   ' <a href="/adm/flip?postdata=return:">'.         $output .= &Apache::loncommon::end_data_table();
   &mt('Return to last resource').'</a></td></tr>');  
     }      }
     $r->print('</table>');      $r->print($output);
 }  }
   
 sub to_show {  sub to_show {
Line 1007  sub show_table { Line 1046  sub show_table {
  $r->print(&Apache::loncommon::help_open_topic('Slot AddInterface'));   $r->print(&Apache::loncommon::help_open_topic('Slot AddInterface'));
  $r->print('</div>');   $r->print('</div>');
     }      }
   
       if (!keys(%slots)) {
           $r->print('<div>'.&mt('No slots have been created in this course.').'</div>');
           return;
       }
           
     my %Saveable_Parameters = ('show'              => 'array',      my %Saveable_Parameters = ('show'              => 'array',
        'when'              => 'scalar',         'when'              => 'scalar',
Line 1108  sub show_table { Line 1152  sub show_table {
           <th>'.&mt('Slot Name Filter').'</th>            <th>'.&mt('Slot Name Filter').'</th>
           <th>'.&mt('Options').'</th>            <th>'.&mt('Options').'</th>
       </tr>        </tr>
       <tr><td>'.&Apache::loncommon::multiple_select_form('show',\@show,6,\%show_fields,\@show_order).        <tr><td valign="top">'.&Apache::loncommon::multiple_select_form('show',\@show,6,\%show_fields,\@show_order).
       '</td>        '</td>
            <td>             <td valign="top">
          '.&Apache::loncommon::multiple_select_form('studisplay',\@stu_display,           '.&Apache::loncommon::multiple_select_form('studisplay',\@stu_display,
     6,\%stu_display_fields,      6,\%stu_display_fields,
     \@stu_display_order).'      \@stu_display_order).'
            </td>             </td>
            <td>'.&Apache::loncommon::select_form($when,'when',%when_fields).             <td valign="top">'.&Apache::loncommon::select_form($when,'when',%when_fields).
           '</td>            '</td>
            <td>'.&Apache::loncommon::select_form($name_filter_type,             <td valign="top">'.&Apache::loncommon::select_form($name_filter_type,
  'name_filter_type',   'name_filter_type',
  %name_filter_type_fields).   %name_filter_type_fields).
       '<br />'.        '<br />'.
Line 1125  sub show_table { Line 1169  sub show_table {
       $env{'form.name_filter_value'},        $env{'form.name_filter_value'},
       15).        15).
           '</td>            '</td>
            <td>             <td valign="top">
             <table>              <table>
               <tr>                <tr>
                 <td rowspan="2">Deleted slots:</td>                  <td rowspan="2">Deleted slots:</td>
Line 1288  sub show_table { Line 1332  sub show_table {
  }   }
  my $proctors=join(', ',@proctors);   my $proctors=join(', ',@proctors);
   
           my %lt = &Apache::lonlocal::texthash (
                                                  edit   => 'Edit',
                                                  delete => 'Delete',
                                                  slotlog => 'History',
           );
  my $edit=(<<"EDITLINK");   my $edit=(<<"EDITLINK");
 <a href="/adm/helper/newslot.helper?name=$slot">Edit</a>  <a href="/adm/helper/newslot.helper?name=$slot">$lt{'edit'}</a>
 EDITLINK  EDITLINK
   
  my $delete=(<<"DELETELINK");   my $delete=(<<"DELETELINK");
 <a href="/adm/slotrequest?command=delete&amp;slotname=$slot">Delete</a>  <a href="/adm/slotrequest?command=delete&amp;slotname=$slot">$lt{'delete'}</a>
 DELETELINK  DELETELINK
   
           my $showlog=(<<"LOGLINK");
   <a href="/adm/slotrequest?command=slotlog&amp;slotname=$slot">$lt{'slotlog'}</a>
   LOGLINK
   
         my $remove_all=&remove_link($slot,'remove all').'<br />';          my $remove_all=&remove_link($slot,'remove all').'<br />';
   
         if ($ids ne '') { undef($delete); }          if ($ids ne '') { undef($delete); }
Line 1307  DELETELINK Line 1360  DELETELINK
  my $row_start=&Apache::loncommon::start_data_table_row();   my $row_start=&Apache::loncommon::start_data_table_row();
  my $row_end=&Apache::loncommon::end_data_table_row();   my $row_end=&Apache::loncommon::end_data_table_row();
         $r->print($row_start.          $r->print($row_start.
   "\n<td rowspan=\"$rowspan\">$edit $delete</td>\n");    "\n<td rowspan=\"$rowspan\">$edit $delete $showlog</td>\n");
  if (exists($show{'name'})) {   if (exists($show{'name'})) {
     $colspan++;$r->print("<td>$slot</td>");      $colspan++;$r->print("<td>$slot</td>");
  }   }
Line 1366  $row_end Line 1419  $row_end
 STUFF  STUFF
         }          }
     }      }
     $r->print('</table></form>');      $r->print(&Apache::loncommon::end_data_table().'</form>');
       return;
   }
   
   sub manage_reservations {
       my ($r,$type) = @_;
       my $navmap = Apache::lonnavmaps::navmap->new();
       $r->print('<p>'.&mt('Instructors may use a reservation system to place restrictions on when and where assignments can be worked on.').'<br />'.&mt('One example is for management of laboratory space, which is only available at certain times, and has a limited number of seats.').'</p><p>'.&mt('Your reservation status for any such assignments is listed below:').'</p>');
       if (!defined($navmap)) {
           $r->print('<div class="LC_error">'.
                     &mt('Unable to retrieve information about course contents').
                     '</div>');
           &Apache::lonnet::logthis('Manage Reservations - could not create navmap object in '.lc($type).':'.$env{'request.course.id'});
           return;
       }
       my (%parent,%shownparent,%container,%container_title,%contents);
       my ($depth,$count,$reservable,$lastcontainer,$rownum) = (0,0,0,0,0);
       my @backgrounds = ("LC_odd_row","LC_even_row");
       my $numcolors = scalar(@backgrounds);
       my $location=&Apache::loncommon::lonhttpdurl("/adm/lonIcons/whitespace_21.gif");
       $r->print('<table class="LC_data_table LC_tableOfContent">'."\n");
       my $it=$navmap->getIterator(undef,undef,undef,1,undef,undef);
       while (my $resource = $it->next()) {
           if ($resource == $it->BEGIN_MAP()) {
               $depth++;
               $parent{$depth} = $lastcontainer;
           }
           if ($resource == $it->END_MAP()) {
               $depth--;
               $lastcontainer = $parent{$depth};
           }
           if (ref($resource)) {
               my $symb = $resource->symb();
               my $ressymb = $symb;
               $contents{$lastcontainer} ++;
               next if (!$resource->is_problem() && !$resource->is_sequence() && 
                        !$resource->is_page());
               $count ++;
               if (($resource->is_sequence()) || ($resource->is_page())) {
                   $lastcontainer = $count;
                   $container{$lastcontainer} = $resource;
                   $container_title{$lastcontainer} = $resource->compTitle();
               }
               if ($resource->is_problem()) {
                   my ($useslots) = $resource->slot_control();
                   next if (($useslots eq '') || ($useslots =~ /^\s*no\s*$/i));
                   my ($msg,$get_choices,$slotdescription);
                   my $title = $resource->compTitle();
                   my $status = $resource->simpleStatus('0');
                   my ($slot_status,$date,$slot_name) = $resource->check_for_slot('0');
                   if ($slot_name ne '') {
                       my %slot=&Apache::lonnet::get_slot($slot_name);
                       $slotdescription=&get_description($slot_name,\%slot);
                   }
                   if ($slot_status == $resource->NOT_IN_A_SLOT) {
                       $msg=&mt('No current reservation.');
                       $get_choices = 1;
                   } elsif ($slot_status == $resource->NEEDS_CHECKIN) {
                       $msg='<span class="LC_nobreak">'.&mt('Reserved:').
                            '&nbsp;'.$slotdescription.'</span><br />'.
                            &mt('Access requires proctor validation.');
                   } elsif ($slot_status == $resource->WAITING_FOR_GRADE) {
                       $msg=&mt('Submitted and currently in grading queue.');
                   } elsif ($slot_status == $resource->CORRECT) {
                       $msg=&mt('Problem is unavailable.');
                   } elsif ($slot_status == $resource->RESERVED) {
                       $msg='<span class="LC_nobreak">'.&mt('Reserved:').
                            '&nbsp;'.$slotdescription.'</span><br />'.
                            &mt('Problem is currently available.');
                   } elsif ($slot_status == $resource->RESERVED_LOCATION) {
                       $msg='<span class="LC_nobreak">'.&mt('Reserved:').
                            '&nbsp;'.$slotdescription.'</span><br />'.
                            &mt('Problem is available at a different location.');
                       $get_choices = 1;
                   } elsif ($slot_status == $resource->RESERVED_LATER) {
                       $msg='<span class="LC_nobreak">'.&mt('Reserved:').
                            '&nbsp;'.$slotdescription.'</span><br />'.
                            &mt('Problem will be available later.');
                       $get_choices = 1;
                   } elsif ($slot_status == $resource->RESERVABLE) {
                       $msg=&mt('Reservation needed');
                       $get_choices = 1;
                   } elsif ($slot_status == $resource->NOTRESERVABLE) {
                       $msg=&mt('Reservation needed: none available.');
                   } elsif ($slot_status == $resource->UNKNOWN) {
                       $msg=&mt('Unable to determine status due to network problems.');
                   } else {
                       if ($status != $resource->OPEN) {
                           $msg = &Apache::lonnavmaps::getDescription($resource,'0'); 
                       }
                   }
                   $reservable ++;
                   my $treelevel = $depth;
                   my $higherup = $lastcontainer;
                   if ($depth > 1) {
                       my @maprows;
                       while ($treelevel > 1) {
                           if (ref($container{$higherup})) {
                               my $res = $container{$higherup};
                               last if (defined($shownparent{$higherup}));
                               my $maptitle = $res->compTitle();
                               my $type = 'sequence';
                               if ($res->is_page()) {
                                   $type = 'page';
                               }
                               &show_map_row($treelevel,$location,$type,$maptitle,
                                             \@maprows);
                               $shownparent{$higherup} = 1;
                           }
                           $treelevel --;
                           $higherup = $parent{$treelevel};
                       }
                       foreach my $item (@maprows) {
                           $rownum ++;
                           my $bgcolor = $backgrounds[$rownum % $numcolors];
                           $r->print('<tr class="'.$bgcolor.'">'.$item.'</tr>'."\n");
                       }
                   }
                   $rownum ++;
                   my $bgcolor = $backgrounds[$rownum % $numcolors];
                   $r->print('<tr class="'.$bgcolor.'"><td>'."\n");
                   for (my $i=0; $i<$depth; $i++) {
                       $r->print('<img src="'.$location.'" alt="" />');
                   }
                   my $result = '<a href="'.$resource->src().'?symb='.$symb.'">'.
                                '<img class="LC_contentImage" src="/adm/lonIcons/';
                   if ($resource->is_task()) {
                       $result .= 'task.gif" alt="'.&mt('Task');
                   } else {
                       $result .= 'problem.gif" alt="'.&mt('Problem');
                   }
                   $result .= '" /><b>'.$title.'</b></a>'.('&nbsp;' x6).'</td>';
                   my $hasaction;
                   if ($status == $resource->OPEN) {
                       if ($get_choices) {
                           $hasaction = 1;
                       }
                   }
                   if ($hasaction) {
                       $result .= '<td valgn="middle">'.$msg.'</td>'.
                                  '<td valign="middle">'.('&nbsp;' x6);
                   } else {
                       $result .= '<td colspan="2" valign="middle">'.$msg.'</td>';
                   }
                   $r->print($result);
                   if ($hasaction) {
                       my $formname = 'manageres_'.$reservable;
                       &show_choices($r,$symb,$formname);
                       $r->print('</td>');
                   }
                   $r->print('</tr>');
               }
           }
       }
       if (!$reservable) {
           $r->print('<span class="LC_info">'.&mt('No course items currently require a reservation to gain access.').'</span>');
       }
       $r->print('</table>'.
                 '<p><a href="/adm/slotrequest?command=showresv">'.
                 &mt('Reservation History').'</a></p>');
   }
   
   sub show_map_row {
       my ($depth,$location,$type,$title,$maprows) = @_;
       my $output = '<td>';
       for (my $i=0; $i<$depth-1; $i++) {
           $output .= '<img src="'.$location.'" alt="" />';
       }
       if ($type eq 'page') {
           $output .= '<img src="/adm/lonIcons/navmap.page.open.gif">&nbsp;'."\n";
       } else {
           $output .= '<img src="/adm/lonIcons/navmap.folder.open.gif">&nbsp;'."\n";
       }
       $output .= $title.'</td><td colspan="2">&nbsp;</td>'."\n";
       unshift (@{$maprows},$output);
       return;
   }
   
   sub show_reservations {
       my ($r,$uname,$udom) = @_;
       if (!defined($uname)) {
           $uname = $env{'user.name'};
       }
       if (!defined($udom)) {
           $udom = $env{'user.domain'};
       }
       my $formname = 'slotlog';
       my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
       my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
       my %log=&Apache::lonnet::dump('nohist_'.$cdom.'_'.$cnum.'_slotlog',$udom,$uname);
       if ($env{'form.origin'} eq 'aboutme') {
           $r->print('<div class="LC_fontsize_large">'.
                     &mt('History of student-schedulable slots for: [_1]',
                         &Apache::loncommon::plainname($env{'form.uname'},$env{'form.udom'},
                                                       'firstname')).'</div>');
       }
       $r->print('<form action="/adm/slotrequest" method="post" name="'.$formname.'">');
       # set defaults
       my $now = time();
       my $defstart = $now - (7*24*3600); #7 days ago
       my %defaults = (
                        page           => '1',
                        show           => '10',
                        action         => 'any',
                        log_start_date => $defstart,
                        log_end_date   => $now,
                      );
       my $more_records = 0;
   
       # set current
       my %curr;
       foreach my $item ('show','page','action') {
           $curr{$item} = $env{'form.'.$item};
       }
       my ($startdate,$enddate) =
           &Apache::lonuserutils::get_dates_from_form('log_start_date',
                                                      'log_end_date');
       $curr{'log_start_date'} = $startdate;
       $curr{'log_end_date'} = $enddate;
       foreach my $key (keys(%defaults)) {
           if ($curr{$key} eq '') {
               $curr{$key} = $defaults{$key};
           }
       }
       my ($version) = ($r->dir_config('lonVersion') =~ /^([\d\.]+)\-/);
       $r->print(&display_filter($formname,$cdom,$cnum,\%curr,$version));
       my $showntablehdr = 0;
       my $tablehdr = &Apache::loncommon::start_data_table().
                      &Apache::loncommon::start_data_table_header_row().
                      '<th>&nbsp;</th><th>'.&mt('When').'</th><th>'.&mt('Action').'</th>'.
                      '<th>'.&mt('Description').'</th><th>'.&mt('Start time').'</th>'.
                      '<th>'.&mt('End time').'</th><th>'.&mt('Resource').'</th>'.
                      &Apache::loncommon::end_data_table_header_row();
       my ($minshown,$maxshown);
       $minshown = 1;
       my $count = 0;
       if ($curr{'show'} ne &mt('all')) {
           $maxshown = $curr{'page'} * $curr{'show'};
           if ($curr{'page'} > 1) {
               $minshown = 1 + ($curr{'page'} - 1) * $curr{'show'};
           }
       }
       my (%titles,%maptitles);
       my %lt = &reservationlog_contexts();
       foreach my $id (sort { $log{$b}{'exe_time'}<=>$log{$a}{'exe_time'} } (keys(%log))) {
           next if (($log{$id}{'exe_time'} < $curr{'log_start_date'}) ||
                    ($log{$id}{'exe_time'} > $curr{'log_end_date'}));
           if ($curr{'show'} ne &mt('all')) {
               if ($count >= $curr{'page'} * $curr{'show'}) {
                   $more_records = 1;
                   last;
               }
           }
           if ($curr{'action'} ne 'any') {
               next if ($log{$id}{'logentry'}{'action'} ne $curr{'action'});
           }
           $count ++;
           next if ($count < $minshown);
           if (!$showntablehdr) {
               $r->print($tablehdr);
               $showntablehdr = 1;
           }
           my $symb = $log{$id}{'logentry'}{'symb'};
           my $slot_name = $log{$id}{'logentry'}{'slot'};
           my %slot=&Apache::lonnet::get_slot($slot_name);
           my $description = $slot{'description'};
           my $start = ($slot{'starttime'}?
                        &Apache::lonlocal::locallocaltime($slot{'starttime'}):'');
           my $end = ($slot{'endtime'}?
                      &Apache::lonlocal::locallocaltime($slot{'endtime'}):'');
           my $title = &get_resource_title($symb,\%titles,\%maptitles);
           my $chgaction = $log{$id}{'logentry'}{'action'};
           if ($chgaction ne '' && $lt{$chgaction} ne '') {
               $chgaction = $lt{$chgaction};
           }
           $r->print(&Apache::loncommon::start_data_table_row().'<td>'.$count.'</td><td>'.&Apache::lonlocal::locallocaltime($log{$id}{'exe_time'}).'</td><td>'.$chgaction.'</td><td>'.$description.'</td><td>'.$start.'</td><td>'.$end.'</td><td>'.$title.'</td>'.&Apache::loncommon::end_data_table_row()."\n");
       }
       if ($showntablehdr) {
           $r->print(&Apache::loncommon::end_data_table().'<br />');
           if (($curr{'page'} > 1) || ($more_records)) {
               $r->print('<table><tr>');
               if ($curr{'page'} > 1) {
                   $r->print('<td><a href="javascript:chgPage('."'previous'".');">'.&mt('Previous [_1] changes',$curr{'show'}).'</a></td>');
               }
               if ($more_records) {
                   $r->print('<td><a href="javascript:chgPage('."'next'".');">'.&mt('Next [_1] changes',$curr{'show'}).'</a></td>');
               }
               $r->print('</tr></table>');
               $r->print(<<"ENDSCRIPT");
   <script type="text/javascript">
   function chgPage(caller) {
       if (caller == 'previous') {
           document.$formname.page.value --;
       }
       if (caller == 'next') {
           document.$formname.page.value ++;
       }
       document.$formname.submit();
       return;
   }
   </script>
   ENDSCRIPT
           }
       } else {
           $r->print(&mt('There are no trasactions to display'));
       }
       $r->print('<input type="hidden" name="page" value="'.$curr{'page'}.'" />'."\n".
                 '<input type="hidden" name="command" value="showresv" />'."\n");
       if ($env{'form.origin'} eq 'aboutme') {
           $r->print('<input type="hidden" name="origin" value="'.$env{'form.origin'}.'" />'."\n".
                     '<input type="hidden" name="uname" value="'.$env{'form.uname'}.'" />'."\n".
                     '<input type="hidden" name="udom" value="'.$env{'form.udom'}.'" />'."\n");
       }
       $r->print('</form>');
       return;
   }
   
   sub show_reservations_log {
       my ($r) = @_;
       my $formname = 'reservationslog';
       my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
       my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
       my %slotlog=&Apache::lonnet::dump('nohist_slotreservationslog',$cdom,$cnum);
       if ((keys(%slotlog))[0]=~/^error\:/) { undef(%slotlog); }
   
       my (%log,@allsymbs);
       if (keys(%slotlog)) {
           foreach my $key (keys(%slotlog)) {
               if (ref($slotlog{$key}) eq 'HASH') {
                   if (ref($slotlog{$key}{'logentry'}) eq 'HASH') {
                       if ($slotlog{$key}{'logentry'}{'slot'} eq $env{'form.slotname'}) {
                           $log{$key} = $slotlog{$key};
                           if ($slotlog{$key}{'logentry'}{'symb'} ne '') {
                               push(@allsymbs,$slotlog{$key}{'logentry'}{'symb'});
                           }
                       }
                   }
               }
           }
       }
   
       $r->print('<form action="/adm/slotrequest" method="post" name="'.$formname.'">');
       my %saveable_parameters = ('show' => 'scalar',);
       &Apache::loncommon::store_course_settings('reservationslog',
                                                 \%saveable_parameters);
       &Apache::loncommon::restore_course_settings('reservationslog',
                                                   \%saveable_parameters);
       # set defaults
       my $now = time();
       my $defstart = $now - (7*24*3600); #7 days ago
       my %defaults = (
                        page           => '1',
                        show           => '10',
                        chgcontext     => 'any',
                        action         => 'any',
                        symb           => 'any',
                        log_start_date => $defstart,
                        log_end_date   => $now,
                      );
       my $more_records = 0;
   
       # set current
       my %curr;
       foreach my $item ('show','page','chgcontext','action','symb') {
           $curr{$item} = $env{'form.'.$item};
       }
       my ($startdate,$enddate) =
           &Apache::lonuserutils::get_dates_from_form('log_start_date',
                                                      'log_end_date');
       $curr{'log_start_date'} = $startdate;
       $curr{'log_end_date'} = $enddate;
       foreach my $key (keys(%defaults)) {
           if ($curr{$key} eq '') {
               $curr{$key} = $defaults{$key};
           }
       }
       my (%whodunit,%changed,$version);
       ($version) = ($r->dir_config('lonVersion') =~ /^([\d\.]+)\-/);
   
       my %slot=&Apache::lonnet::get_slot($env{'form.slotname'});
       my $description = $slot{'description'};
       $r->print('<div class="LC_fontsize_large">'.
                 &mt('Reservation changes for slot: [_1]',$description).'</div>');
   
       $r->print(&display_filter($formname,$cdom,$cnum,\%curr,$version,\@allsymbs));
       my $showntablehdr = 0;
       my $tablehdr = &Apache::loncommon::start_data_table().
                      &Apache::loncommon::start_data_table_header_row().
                      '<th>&nbsp;</th><th>'.&mt('When').'</th><th>'.&mt('Who made the change').
                      '</th><th>'.&mt('Affected User').'</th><th>'.&mt('Action').'</th>'.
                      '<th>'.&mt('Resource').'</th><th>'.&mt('Context').'</th>'.
                      &Apache::loncommon::end_data_table_header_row();
       my ($minshown,$maxshown);
       $minshown = 1;
       my $count = 0;
       if ($curr{'show'} ne &mt('all')) {
           $maxshown = $curr{'page'} * $curr{'show'};
           if ($curr{'page'} > 1) {
               $minshown = 1 + ($curr{'page'} - 1) * $curr{'show'};
           }
       }
       my %lt = &reservationlog_contexts();
       my (%titles,%maptitles);
       foreach my $id (sort { $log{$b}{'exe_time'}<=>$log{$a}{'exe_time'} } (keys(%log))) {
           next if (($log{$id}{'exe_time'} < $curr{'log_start_date'}) ||
                    ($log{$id}{'exe_time'} > $curr{'log_end_date'}));
           if ($curr{'show'} ne &mt('all')) {
               if ($count >= $curr{'page'} * $curr{'show'}) {
                   $more_records = 1;
                   last;
               }
           }
           if ($curr{'chgcontext'} ne 'any') {
               if ($curr{'chgcontext'} eq 'user') {
                   next if (($log{$id}{'logentry'}{'context'} ne 'user') && 
                            ($log{$id}{'logentry'}{'context'} ne 'usermanage'));
               } else {
                   next if ($log{$id}{'logentry'}{'context'} ne $curr{'chgcontext'});
               }
           }
           if ($curr{'action'} ne 'any') {
               next if ($log{$id}{'logentry'}{'action'} ne $curr{'action'});
           }
           if ($curr{'symb'} ne 'any') {
               next if ($log{$id}{'logentry'}{'symb'} ne $curr{'symb'});
           }
           $count ++;
           next if ($count < $minshown);
           if (!$showntablehdr) {
               $r->print($tablehdr);
               $showntablehdr = 1;
           }
           if ($whodunit{$log{$id}{'exe_uname'}.':'.$log{$id}{'exe_udom'}} eq '') {
               $whodunit{$log{$id}{'exe_uname'}.':'.$log{$id}{'exe_udom'}} =
                   &Apache::loncommon::plainname($log{$id}{'exe_uname'},$log{$id}{'exe_udom'});
           }
           if ($changed{$log{$id}{'uname'}.':'.$log{$id}{'udom'}} eq '') {
               $changed{$log{$id}{'uname'}.':'.$log{$id}{'udom'}} =
                   &Apache::loncommon::plainname($log{$id}{'uname'},$log{$id}{'udom'});
           }
           my $symb = $log{$id}{'logentry'}{'symb'};
           my $title = &get_resource_title($symb,\%titles,\%maptitles); 
           my $chgcontext = $log{$id}{'logentry'}{'context'};
           if ($chgcontext ne '' && $lt{$chgcontext} ne '') {
               $chgcontext = $lt{$chgcontext};
           }
           my $chgaction = $log{$id}{'logentry'}{'action'};
           if ($chgaction ne '' && $lt{$chgaction} ne '') {
               $chgaction = $lt{$chgaction}; 
           }
           $r->print(&Apache::loncommon::start_data_table_row().'<td>'.$count.'</td><td>'.&Apache::lonlocal::locallocaltime($log{$id}{'exe_time'}).'</td><td>'.$whodunit{$log{$id}{'exe_uname'}.':'.$log{$id}{'exe_udom'}}.'</td><td>'.$changed{$log{$id}{'uname'}.':'.$log{$id}{'udom'}}.'</td><td>'.$chgaction.'</td><td>'.$title.'</td><td>'.$chgcontext.'</td>'.&Apache::loncommon::end_data_table_row()."\n");
       }
       if ($showntablehdr) {
           $r->print(&Apache::loncommon::end_data_table().'<br />');
           if (($curr{'page'} > 1) || ($more_records)) {
               $r->print('<table><tr>');
               if ($curr{'page'} > 1) {
                   $r->print('<td><a href="javascript:chgPage('."'previous'".');">'.&mt('Previous [_1] changes',$curr{'show'}).'</a></td>');
               }
               if ($more_records) {
                   $r->print('<td><a href="javascript:chgPage('."'next'".');">'.&mt('Next [_1] changes',$curr{'show'}).'</a></td>');
               }
               $r->print('</tr></table>');
               $r->print(<<"ENDSCRIPT");
   <script type="text/javascript">
   function chgPage(caller) {
       if (caller == 'previous') {
           document.$formname.page.value --;
       }
       if (caller == 'next') {
           document.$formname.page.value ++;
       }
       document.$formname.submit();
       return;
   }
   </script>
   ENDSCRIPT
           }
       } else {
           $r->print(&mt('There are no records to display'));
       }
       $r->print('<input type="hidden" name="page" value="'.$curr{'page'}.'" />'.
                 '<input type="hidden" name="slotname" value="'.$env{'form.slotname'}.'" />'.
                 '<input type="hidden" name="command" value="slotlog" /></form>');
       return;
   }
   
   sub get_resource_title {
       my ($symb,$titles,$maptitles) = @_;
       my $title;
       if ((ref($titles) eq 'HASH') && (ref($maptitles) eq 'HASH')) { 
           if (defined($titles->{$symb})) {
               $title = $titles->{$symb};
           } else {
               $title = &Apache::lonnet::gettitle($symb);
               my $maptitle;
               my ($mapurl) = &Apache::lonnet::decode_symb($symb);
               if (defined($maptitles->{$mapurl})) {
                   $maptitle = $maptitles->{$mapurl};
               } else {
                   if ($mapurl eq $env{'course.'.$env{'request.course.id'}.'.url'}) {
                       $maptitle=&mt('Main Course Documents');
                   } else {
                       $maptitle=&Apache::lonnet::gettitle($mapurl);
                   }
                   $maptitles->{$mapurl} = $maptitle;
               }
               if ($maptitle ne '') {
                   $title .= ' '.&mt('(in [_1])',$maptitle);
               }
               $titles->{$symb} = $title;
           }
       } else {
           $title = $symb;
       }
       return $title;
   }
   
   sub reservationlog_contexts {
       my %lt = &Apache::lonlocal::texthash (
                                                any        => 'Any',
                                                user       => 'By student',
                                                manage     => 'Via Slot Manager',
                                                parameter  => 'Via Parameter Manager',
                                                reserve    => 'Made reservation',
                                                release    => 'Dropped reservation',
                                                usermanage => 'By student', 
                                            );
       return %lt;
   }
   
   sub display_filter {
       my ($formname,$cdom,$cnum,$curr,$version,$allsymbs) = @_;
       my $nolink = 1;
       my (%titles,%maptitles);
       my $output = '<table><tr><td valign="top">'.
                    '<span class="LC_nobreak"><b>'.&mt('Changes/page:').'</b><br />'.
                    &Apache::lonmeta::selectbox('show',$curr->{'show'},undef,
                                                 (&mt('all'),5,10,20,50,100,1000,10000)).
                    '</td><td>&nbsp;&nbsp;</td>';
       my $startform =
           &Apache::lonhtmlcommon::date_setter($formname,'log_start_date',
                                               $curr->{'log_start_date'},undef,
                                               undef,undef,undef,undef,undef,undef,$nolink);
       my $endform =
           &Apache::lonhtmlcommon::date_setter($formname,'log_end_date',
                                               $curr->{'log_end_date'},undef,
                                               undef,undef,undef,undef,undef,undef,$nolink);
       my %lt = &reservationlog_contexts();
       $output .= '<td valign="top"><b>'.&mt('Window during which changes occurred:').
                  '</b><br /><table><tr><td>'.&mt('After:').
                  '</td><td>'.$startform.'</td></tr><tr><td>'.&mt('Before:').'</td><td>'.
                  $endform.'</td></tr></table></td><td>&nbsp;&nbsp;</td>';
       if (ref($allsymbs) eq 'ARRAY') {
           $output .= '<td valign="top"><b>'.&mt('Resource').'</b><br />'.
                      '<select name="resource"><option value="any"';
           if ($curr->{'resource'} eq 'any') {
               $output .= ' selected="selected"';
           }
           $output .=  '>'.&mt('Any').'</option>'."\n";
           foreach my $symb (@{$allsymbs}) {
               my $title = &get_resource_title($symb,\%titles,\%maptitles);
               my $selstr = '';
               if ($curr->{'resource'} eq $symb) {
                   $selstr = ' selected="selected"';
               }
               $output .= '  <option value="'.$symb.'"'.$selstr.'>'.$title.'</option>';
           }
           $output .= '</select></td><td>&nbsp;&nbsp;</td><td valign="top"><b>'.
                      &mt('Context:').'</b><br /><select name="chgcontext">';
           foreach my $chgtype ('any','user','manage','parameter') {
               my $selstr = '';
               if ($curr->{'chgcontext'} eq $chgtype) {
                   $output .= $selstr = ' selected="selected"';
               }
               $output .= '<option value="'.$chgtype.'"'.$selstr.'>'.$lt{$chgtype}.'</option>'."\n";
           }
           $output .= '</select></td>';
       } else {
           $output .= '<td valign="top"><b>'.&mt('Action').'</b><br />'.
                      '<select name="action"><option value="any"';
           if ($curr->{'action'} eq 'any') {
               $output .= ' selected="selected"';
           }
           $output .=  '>'.&mt('Any').'</option>'."\n";
           foreach my $actiontype ('reserve','release') {
               my $selstr = '';
               if ($curr->{'action'} eq $actiontype) {
                   $output .= $selstr = ' selected="selected"';
               }
               $output .= '<option value="'.$actiontype.'"'.$selstr.'>'.$lt{$actiontype}.'</option>'."\n";
           }
           $output .= '</select></td>';
       }
       $output .= '<td>&nbsp;&nbsp;</td><td valign="middle"><input type="submit" value="'.
                  &mt('Update Display').'" /></tr></table>'.
                  '<span class="LC_roleslog_note">'.
                  &mt('[_1]Note:[_2] Only changes made from servers running LON-CAPA 2.8.99.0 or later are displayed.');
       if ($version) {
           $output .= ' '.&mt('This server is version [_3].','<b>','</b>',$version);
       }
       $output .= '</span><hr noshade><br />';
       return $output;
 }  }
   
 sub upload_start {  sub upload_start {
Line 1648  sub csv_upload_assign { Line 2303  sub csv_upload_assign {
     return '';      return '';
 }  }
   
   sub slot_command_titles {
       my %titles = (
                    slotlog            => 'Reservation Logs',
                    showslots          => 'Manage Slots',
                    showresv           => 'Reservation History',
                    manageresv         => 'Manage Reservations',
                    uploadstart        => 'Upload Slots File',
                    csvuploadmap       => 'Upload Slots File',
                    csvuploadassign    => 'Upload Slots File',
                    delete             => 'Slot Deletion',
                    release            => 'Reservation Result',
                    remove_reservation => 'Remove Registration',
                    get_reservation    => 'Request Reservation',
                 );
       return %titles;
   }
   
 sub handler {  sub handler {
     my $r=shift;      my $r=shift;
   
Line 1659  sub handler { Line 2331  sub handler {
     }      }
   
     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'});      &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'});
       
       my %crumb_titles = &slot_command_titles();
       my $brcrum;
   
     my $vgr=&Apache::lonnet::allowed('vgr',$env{'request.course.id'});      my $vgr=&Apache::lonnet::allowed('vgr',$env{'request.course.id'});
     my $mgr=&Apache::lonnet::allowed('mgr',$env{'request.course.id'});      my $mgr=&Apache::lonnet::allowed('mgr',$env{'request.course.id'});
       if ($env{'form.command'} eq 'showslots') {
           if (($vgr ne 'F') && ($mgr ne 'F')) {
               $env{'form.command'} = 'manageresv'; 
           }
       } elsif ($env{'form.command'} eq 'manageresv') {
           if (($vgr eq 'F') || ($mgr eq 'F')) {
               $env{'form.command'} = 'showslots';
           }
       }
     my $title='Requesting Another Worktime';      my $title='Requesting Another Worktime';
     if ($env{'form.command'} =~ /^(showslots|uploadstart|csvuploadmap|csvuploadassign)$/ && $vgr eq 'F') {      if ($env{'form.command'} eq 'showresv') {
  $title = 'Managing Slots';          $title = 'Reservation History';
           if ($env{'form.origin'} eq 'aboutme') {
               $brcrum =[{href=>"/adm/$env{'form.udom'}/$env{'form.uname'}/aboutme",text=>'Personal Information Page'}];
           } else {
               $brcrum =[{href=>"/adm/slotrequest?command=manageresv",text=>'Manage Reservations'}];
           }
           if (ref($brcrum) eq 'ARRAY') {
               push(@{$brcrum},{href=>"/adm/slotrequest?command=showresv",text=>$title});
           }
       } elsif ($env{'form.command'} eq 'manageresv') {
           $title = 'Manage Reservations';
           $brcrum =[{href=>"/adm/slotrequest?command=manageresv",text=>$title}];
       } elsif ($vgr eq 'F') {
           if ($env{'form.command'} =~ /^(slotlog|showslots|uploadstart|csvuploadmap|csvuploadassign|delete|release|remove_registration)$/) {
               $brcrum =[{href=>"/adm/slotrequest?command=showslots",
                          text=>$crumb_titles{'showslots'}}];
       $title = 'Managing Slots';
               unless ($env{'form.command'} eq 'showslots') {
                   if (ref($brcrum) eq 'ARRAY') {
                       push(@{$brcrum},{href=>"/adm/slotrequest?command=$env{'form.command'}",text=>$crumb_titles{$env{'form.command'}}});
                   }
               }
           }
       } elsif ($env{'form.command'} eq 'release') {
           if ($env{'form.context'} eq 'usermanage') {
               $brcrum =[{href=>"/adm/slotrequest?command=manageresv",
                          text=>$crumb_titles{'showslots'}}];
               $title = 'Manage Reservations';
               if (ref($brcrum) eq 'ARRAY') {
                   push(@{$brcrum},{href=>"/adm/slotrequest?command=$env{'form.command'}",text=>$crumb_titles{$env{'form.command'}}});
               }
               
           }
     }      }
     &start_page($r,$title);      &start_page($r,$title,$brcrum);
   
     if ($env{'form.command'} eq 'showslots' && $vgr eq 'F') {      if ($env{'form.command'} eq 'manageresv') {
           my $crstype = &Apache::loncommon::course_type();
           &manage_reservations($r,$crstype);
       } elsif ($env{'form.command'} eq 'showresv') {
           &show_reservations($r,$env{'form.uname'},$env{'form.udom'});
       } elsif ($env{'form.command'} eq 'showslots' && $vgr eq 'F') {
  &show_table($r,$mgr);   &show_table($r,$mgr);
     } elsif ($env{'form.command'} eq 'remove_registration' && $mgr eq 'F') {      } elsif ($env{'form.command'} eq 'remove_registration' && $mgr eq 'F') {
  &remove_registration($r);   &remove_registration($r);
Line 1695  sub handler { Line 2416  sub handler {
     }      }
     &csv_upload_map($r);      &csv_upload_map($r);
  }   }
       } elsif ($env{'form.command'} eq 'slotlog' && $mgr eq 'F') {
           &show_reservations_log($r);
     } else {      } else {
  my $symb=&unescape($env{'form.symb'});   my $symb=&unescape($env{'form.symb'});
  if (!defined($symb)) {   if (!defined($symb)) {

Removed from v.1.90  
changed lines
  Added in v.1.91


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