Diff for /loncom/interface/slotrequest.pm between versions 1.94 and 1.115

version 1.94, 2009/03/29 18:06:09 version 1.115, 2012/08/23 14:17:13
Line 137  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;
     my @sorted_slots = &Apache::loncommon::sorted_slots(\@slots,\%slots);      my @sorted_slots = &Apache::loncommon::sorted_slots(\@slots,\%slots,'starttime');
     foreach my $slot_name (@sorted_slots) {      foreach my $slot_name (@sorted_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 ".
        $slots{$slot_name}->{'starttime'}." -- ".         $slots{$slot_name}->{'starttime'}." -- ".
        $slots{$slot_name}->{'startreserve'});         $slots{$slot_name}->{'startreserve'}." -- ".
  if ($slots{$slot_name}->{'endtime'} > time &&                                 $slots{$slot_name}->{'endreserve'});
     $slots{$slot_name}->{'startreserve'} < time) {   if (($slots{$slot_name}->{'endtime'} > time) &&
     # between start of reservation times and end of slot      ($slots{$slot_name}->{'startreserve'} < time) &&
               ((!$slots{$slot_name}->{'endreserve'}) || 
                ($slots{$slot_name}->{'endreserve'} > time))) {
       # between start of reservation time and end of reservation time
               # and before end of slot
     if ($mode eq 'allslots') {      if ($mode eq 'allslots') {
  push(@got,$slot_name);   push(@got,$slot_name);
     } else {      } else {
Line 335  sub store_slot_parm { Line 339  sub store_slot_parm {
                        context => $env{'form.context'},                         context => $env{'form.context'},
                     );                      );
   
     &Apache::lonnet::instructor_log('slotreservationslog',\%storehash,      &Apache::lonnet::write_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,      &Apache::lonnet::write_log($cdom.'_'.$cnum.'_slotlog',\%storehash,
                                     1,$env{'user.name'},$env{'user.domain'},                                 1,$env{'user.name'},$env{'user.domain'},
                                     $env{'user.name'},$env{'user.domain'});                                 $env{'user.name'},$env{'user.domain'});
   
     return;      return;
 }  }
Line 534  sub release_reservation { Line 538  sub release_reservation {
                                action  => 'release',                                 action  => 'release',
                                context => $env{'form.context'},                                 context => $env{'form.context'},
                         );                          );
             &Apache::lonnet::instructor_log('slotreservationslog',\%storehash,              &Apache::lonnet::write_log('slotreservationslog',\%storehash,
                                             1,$uname,$udom,$cnum,$cdom);                                         1,$uname,$udom,$cnum,$cdom);
             &Apache::lonnet::instructor_log($cdom.'_'.$cnum.'_slotlog',\%storehash,              &Apache::lonnet::write_log($cdom.'_'.$cnum.'_slotlog',\%storehash,
                                             1,$uname,$udom,$uname,$udom);                                         1,$uname,$udom,$uname,$udom);
  }   }
     }      }
   
Line 562  sub release_reservation { Line 566  sub release_reservation {
     if ($mgr eq 'F') {      if ($mgr eq 'F') {
  $msg = &mt('Released Reservation for user: [_1]',"$uname:$udom");   $msg = &mt('Released Reservation for user: [_1]',"$uname:$udom");
     } else {      } else {
  $msg = &mt('Released Reservation: [_1]',$description);   $msg = '<span style="font-weight: bold;">'.&mt('Released reservation: [_1]',$description).'</span><br /><br />';
           my $person = &Apache::loncommon::plainname($env{'user.name'},$env{'user.domain'});
           my $subject = &mt('Reservation change: [_1]',$description);
           my $msgbody = &mt('Reservation released by [_1] for [_2].',$person,$description);
           $msg .= &slot_change_messaging($slot{'reservationmsg'},$subject,$msgbody,'release');
     }      }
     return (1,$msg);      return (1,$msg);
 }  }
Line 629  sub get_slot { Line 637  sub get_slot {
  my $description1=&get_description($slot_name,\%slot);   my $description1=&get_description($slot_name,\%slot);
  %slot=&Apache::lonnet::get_slot($env{'form.slotname'});   %slot=&Apache::lonnet::get_slot($env{'form.slotname'});
  my $description2=&get_description($env{'form.slotname'},\%slot);   my $description2=&get_description($env{'form.slotname'},\%slot);
  $r->print('<p>'.&mt('Already have a reservation: [_1].',$description1).'</p>');  
  if ($slot_name ne $env{'form.slotname'}) {   if ($slot_name ne $env{'form.slotname'}) {
     $r->print(<<STUFF);      $r->print(<<STUFF);
 <form method="post" action="/adm/slotrequest">  <form method="post" action="/adm/slotrequest">
Line 638  sub get_slot { Line 645  sub get_slot {
    <input type="hidden" name="releaseslot" value="$slot_name" />     <input type="hidden" name="releaseslot" value="$slot_name" />
    <input type="hidden" name="command" value="change" />     <input type="hidden" name="command" value="change" />
 STUFF  STUFF
             $r->print('<p>'              $r->print('<p class="LC_error">'.&mt('Reservation currently unchanged').'</p>');
                      .&mt('You can either [_1]Change[_2] your reservation from [_3] to [_4] or'              if ($slot_name ne '') {
                          ,'<input type="submit" name="change" value="'                  $r->print('<p>'.&mt('To complete the transaction you [_1]must confirm[_2] you want to [_3]process the change[_4] to [_5].'
                          ,'" />'                           ,'<b>','</b>','<i>','</i>','<b>'.$description2.'</b>')
                          ,'<b>'.$description1.'</b>'                           .'<br />'
                          ,'<b>'.$description2.'</b>')                           .&mt('Or you can choose to [_1]make no change[_2] and continue[_2] with the reservation you already had: [_3].'
                      .'<br /></p>'                           ,'<i>','</i>','<b>'.$description1.'</b>')
             );                           .'</p><p><span class="LC_nobreak">'
     &return_link($r);                           .'<input type="submit" name="change" value="'.&mt('Process the change').'" />' 
                            .('&nbsp;'x3)
                            .'<input type="submit" name="nochange" value="'.&mt('Make no change').'" />'
                            .'</span></p>');
               }
     $r->print(<<STUFF);      $r->print(<<STUFF);
 </form>  </form>
 STUFF  STUFF
         } else {          } else {
               $r->print('<p>'.&mt('Already have a reservation: [_1].',$description1).'</p>');
     &return_link($r);      &return_link($r);
  }   }
  return 0;   return 0;
Line 667  STUFF Line 679  STUFF
                      .&mt('An error occurred while attempting to make a reservation. ([_1])',$1)                       .&mt('An error occurred while attempting to make a reservation. ([_1])',$1)
                      .'</span></p>');                       .'</span></p>');
  } elsif ($reserved > -1) {   } elsif ($reserved > -1) {
     $r->print('<p>'.&mt('Success: [_1]',$description).'</p>');      $r->print('<p style="font-weight: bold;">'.&mt('Successfully signed up:  [_1]',$description).'</p>');
     $retvalue = 1;      $retvalue = 1;
               my $person = &Apache::loncommon::plainname($env{'user.name'},$env{'user.domain'});
               my $subject = &mt('Reservation change: [_1]',$description);
               my $msgbody = &mt('Successful reservation by [_1] for [_2].',$person,$description);
               my $msg = &slot_change_messaging($slot{'reservationmsg'},$subject,$msgbody,'reserve');
               if ($msg) {
                   $r->print($msg);
               }
  } elsif ($reserved < 0) {   } elsif ($reserved < 0) {
     $r->print('<p>'.&mt('Already reserved: [_1]',$description).'</p>');      $r->print('<p>'.&mt('Already reserved: [_1]',$description).'</p>');
  }   }
Line 707  $lt{'or'} Line 726  $lt{'or'}
 STUFF  STUFF
   
     if (!$inhibit_return_link) {       if (!$inhibit_return_link) { 
         $r->print(&mt('or').'</p>').&return_link($r);          $r->print(&mt('or').'</p>');
           &return_link($r);
     } else {      } else {
         $r->print('</p>');          $r->print('</p>');
     }      }
Line 740  sub allowed_slot { Line 760  sub allowed_slot {
     if ($slot->{'startreserve'} > time) {      if ($slot->{'startreserve'} > time) {
  return 0;   return 0;
     }      }
       # reserve time ended
       if (($slot->{'endreserve'}) &&
           ($slot->{'endreserve'} < time)) {
           return 0;
       }    
     &Apache::lonxml::debug("$slot_name reserve good");      &Apache::lonxml::debug("$slot_name reserve good");
   
     my $userallowed=0;      my $userallowed=0;
Line 817  sub show_choices { Line 842  sub show_choices {
     my ($r,$symb,$formname)=@_;      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::get_course_slots($cnum,$cdom);
     my $consumed_uniqueperiods = &get_consumed_uniqueperiods(\%slots);      my $consumed_uniqueperiods = &get_consumed_uniqueperiods(\%slots);
     if (ref($consumed_uniqueperiods) eq 'HASH') {      if (ref($consumed_uniqueperiods) eq 'HASH') {
         if (&Apache::lonnet::error(%$consumed_uniqueperiods)) {          if (&Apache::lonnet::error(%$consumed_uniqueperiods)) {
Line 846  sub show_choices { Line 871  sub show_choices {
       (keys(%slots)))  {        (keys(%slots)))  {
   
  &Apache::lonxml::debug("Checking Slot $slot");   &Apache::lonxml::debug("Checking Slot $slot");
  next if (!&allowed_slot($slot,$slots{$slot},undef,\%slots,   next if (!&allowed_slot($slot,$slots{$slot},$symb,\%slots,
  $consumed_uniqueperiods));   $consumed_uniqueperiods));
   
         push(@available,$slot);          push(@available,$slot);
     }      }
     if (!@available) {      if (!@available) {
         $output = &mt('No available times.');          $output = '<div class="LC_info">'.&mt('No available times.');
         if ($env{'form.command'} ne 'manageresv') {          if ($env{'form.command'} ne 'manageresv') {
             $output .= ' <a href="/adm/flip?postdata=return:">'.              $output .= ' <a href="/adm/flip?postdata=return:">'.
                        &mt('Return to last resource').'</a>';                         &mt('Return to last resource').'</a>';
         }          }
           $output .= '</div>';
         $r->print($output);          $r->print($output);
         return;          return;
     }      }
Line 1025  sub show_table { Line 1051  sub show_table {
     my ($r,$mgr)=@_;      my ($r,$mgr)=@_;
   
     my ($cnum,$cdom)=&get_course();      my ($cnum,$cdom)=&get_course();
       my $crstype=&Apache::loncommon::course_type($cdom.'_'.$cnum);
     my %slots=&Apache::lonnet::dump('slots',$cdom,$cnum);      my %slots=&Apache::lonnet::dump('slots',$cdom,$cnum);
     if ( (keys(%slots))[0] =~ /^error: 2 /) {      if ( (keys(%slots))[0] =~ /^error: 2 /) {
  undef(%slots);   undef(%slots);
Line 1048  sub show_table { Line 1075  sub show_table {
     }      }
   
     if (!keys(%slots)) {      if (!keys(%slots)) {
         $r->print('<div>'.&mt('No slots have been created in this course.').'</div>');          if ($crstype eq 'Community') {
               $r->print('<div>'.&mt('No slots have been created in this community.').'</div>');
           } else {
               $r->print('<div>'.&mt('No slots have been created in this course.').'</div>');
           }
         return;          return;
     }      }
           
Line 1075  sub show_table { Line 1106  sub show_table {
      'starttime'       => 'Start time',       'starttime'       => 'Start time',
      'endtime'         => 'End Time',       'endtime'         => 'End Time',
              'startreserve'    => 'Time students can start reserving',               'startreserve'    => 'Time students can start reserving',
                'endreserve'      => 'Time students can no longer reserve',
                'reservationmsg'  => 'Message triggered by reservation',
      'secret'          => 'Secret Word',       'secret'          => 'Secret Word',
      'space'           => '# of students/max',       'space'           => '# of students/max',
      'ip'              => 'IP or DNS restrictions',       'ip'              => 'IP or DNS restrictions',
Line 1084  sub show_table { Line 1117  sub show_table {
      'uniqueperiod'    => 'Period of time slot is unique',       'uniqueperiod'    => 'Period of time slot is unique',
      'scheduled'       => 'Scheduled Students',       'scheduled'       => 'Scheduled Students',
      'proctor'         => 'List of proctors');       'proctor'         => 'List of proctors');
       if ($crstype eq 'Community') {
           $show_fields{'startreserve'} = &mt('Time members can start reserving');
           $show_fields{'endreserve'} = &mt('Time members can no longer reserve');
           $show_fields{'scheduled'} = &mt('Scheduled Members');
       }
     my @show_order=('name','description','type','starttime','endtime',      my @show_order=('name','description','type','starttime','endtime',
     'startreserve','secret','space','ip','symb',      'startreserve','endreserve','reservationmsg','secret','space',
     'allowedsections','allowedusers','uniqueperiod',      'ip','symb','allowedsections','allowedusers','uniqueperiod',
     'scheduled','proctor');      'scheduled','proctor');
     my @show =       my @show = 
  (exists($env{'form.show'})) ? &Apache::loncommon::get_env_multiple('form.show')   (exists($env{'form.show'})) ? &Apache::loncommon::get_env_multiple('form.show')
Line 1159  sub show_table { Line 1197  sub show_table {
     6,\%stu_display_fields,      6,\%stu_display_fields,
     \@stu_display_order).'      \@stu_display_order).'
            </td>             </td>
            <td valign="top">'.&Apache::loncommon::select_form($when,'when',%when_fields).             <td valign="top">'.&Apache::loncommon::select_form($when,'when',\%when_fields).
           '</td>            '</td>
            <td valign="top">'.&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 />'.
       &Apache::lonhtmlcommon::textbox('name_filter_value',        &Apache::lonhtmlcommon::textbox('name_filter_value',
       $env{'form.name_filter_value'},        $env{'form.name_filter_value'},
Line 1197  sub show_table { Line 1235  sub show_table {
   
     my %name_cache;      my %name_cache;
     my $slotsort = sub {      my $slotsort = sub {
  if ($env{'form.order'}=~/^(type|description|endtime|startreserve|ip|symb|allowedsections|allowedusers)$/) {   if ($env{'form.order'}=~/^(type|description|endtime|startreserve|endreserve|ip|symb|allowedsections|allowedusers|reservationmsg)$/) {
     if (lc($slots{$a}->{$env{'form.order'}})      if (lc($slots{$a}->{$env{'form.order'}})
  ne lc($slots{$b}->{$env{'form.order'}})) {   ne lc($slots{$b}->{$env{'form.order'}})) {
  return (lc($slots{$a}->{$env{'form.order'}})    return (lc($slots{$a}->{$env{'form.order'}}) 
Line 1234  sub show_table { Line 1272  sub show_table {
  if ($tmp =~ /^error: /) { undef(%consumed); }   if ($tmp =~ /^error: /) { undef(%consumed); }
     }      }
   
       my %msgops = &slot_reservationmsg_options();
   
     foreach my $slot (sort $slotsort (keys(%slots)))  {      foreach my $slot (sort $slotsort (keys(%slots)))  {
  if (!&to_show($slot,$slots{$slot},$when,   if (!&to_show($slot,$slots{$slot},$when,
       $env{'form.deleted'},$name_filter)) { next; }        $env{'form.deleted'},$name_filter)) { next; }
           my $reservemsg;
  if (defined($slots{$slot}->{'type'})   if (defined($slots{$slot}->{'type'})
     && $slots{$slot}->{'type'} ne 'schedulable_student') {      && $slots{$slot}->{'type'} eq 'schedulable_student') {
     #next;      $reservemsg = $msgops{$slots{$slot}->{'reservationmsg'}};
  }   }
  my $description=&get_description($slot,$slots{$slot});   my $description=&get_description($slot,$slots{$slot});
  my ($id_count,$ids);   my ($id_count,$ids);
Line 1276  sub show_table { Line 1317  sub show_table {
  &Apache::lonlocal::locallocaltime($slots{$slot}->{'endtime'}):'');   &Apache::lonlocal::locallocaltime($slots{$slot}->{'endtime'}):'');
  my $start_reserve=($slots{$slot}->{'startreserve'}?   my $start_reserve=($slots{$slot}->{'startreserve'}?
    &Apache::lonlocal::locallocaltime($slots{$slot}->{'startreserve'}):'');     &Apache::lonlocal::locallocaltime($slots{$slot}->{'startreserve'}):'');
           my $end_reserve=($slots{$slot}->{'endreserve'}?
                            &Apache::lonlocal::locallocaltime($slots{$slot}->{'endreserve'}):'');
   
  my $unique;   my $unique;
  if (ref($slots{$slot}{'uniqueperiod'})) {   if (ref($slots{$slot}{'uniqueperiod'})) {
Line 1383  LOGLINK Line 1426  LOGLINK
  if (exists($show{'startreserve'})) {   if (exists($show{'startreserve'})) {
     $colspan++;$r->print("<td>$start_reserve</td>\n");      $colspan++;$r->print("<td>$start_reserve</td>\n");
  }   }
           if (exists($show{'endreserve'})) {
               $colspan++;$r->print("<td>$end_reserve</td>\n");
           }
           if (exists($show{'reservationmsg'})) {
               $colspan++;$r->print("<td>$reservemsg</td>\n");
           }
  if (exists($show{'secret'})) {   if (exists($show{'secret'})) {
     $colspan++;$r->print("<td>$slots{$slot}{'secret'}</td>\n");      $colspan++;$r->print("<td>$slots{$slot}{'secret'}</td>\n");
  }   }
Line 1428  STUFF Line 1477  STUFF
 }  }
   
 sub manage_reservations {  sub manage_reservations {
     my ($r,$type) = @_;      my ($r,$crstype) = @_;
     my $navmap = Apache::lonnavmaps::navmap->new();      my $navmap = Apache::lonnavmaps::navmap->new();
     $r->print('<p>'      $r->print('<p>'
              .&mt('Instructors may use a reservation system to place restrictions on when and where assignments can be worked on.')               .&mt('Instructors may use a reservation system to place restrictions on when and where assignments can be worked on.')
              .'<br />'               .'<br />'
              .&mt('One example is for management of laboratory space, which is only available at certain times, and has a limited number of seats.')               .&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>'               .'</p>'
     );      );
     if (!defined($navmap)) {      if (!defined($navmap)) {
         $r->print('<div class="LC_error">'.          $r->print('<div class="LC_error">');
                   &mt('Unable to retrieve information about course contents').          if ($crstype eq 'Community') {
                   '</div>');              $r->print(&mt('Unable to retrieve information about community contents'));
         &Apache::lonnet::logthis('Manage Reservations - could not create navmap object in '.lc($type).':'.$env{'request.course.id'});          } else {
               $r->print(&mt('Unable to retrieve information about course contents'));
           }
           $r->print('</div>');
           &Apache::lonnet::logthis('Manage Reservations - could not create navmap object in '.lc($crstype).':'.$env{'request.course.id'});
         return;          return;
     }      }
     my (%parent,%shownparent,%container,%container_title,%contents);      my (%parent,%shownparent,%container,%container_title,%contents);
Line 1450  sub manage_reservations { Line 1501  sub manage_reservations {
     my @backgrounds = ("LC_odd_row","LC_even_row");      my @backgrounds = ("LC_odd_row","LC_even_row");
     my $numcolors = scalar(@backgrounds);      my $numcolors = scalar(@backgrounds);
     my $location=&Apache::loncommon::lonhttpdurl("/adm/lonIcons/whitespace_21.gif");      my $location=&Apache::loncommon::lonhttpdurl("/adm/lonIcons/whitespace_21.gif");
     $r->print('<table class="LC_data_table LC_tableOfContent">'."\n");      my $slotheader = '<p>'.
                    &mt('Your reservation status for any such assignments is listed below:').
                    '</p>'.
                    '<table class="LC_data_table LC_tableOfContent">'."\n";
       my $shownheader = 0;
     my $it=$navmap->getIterator(undef,undef,undef,1,undef,undef);      my $it=$navmap->getIterator(undef,undef,undef,1,undef,undef);
     while (my $resource = $it->next()) {      while (my $resource = $it->next()) {
         if ($resource == $it->BEGIN_MAP()) {          if ($resource == $it->BEGIN_MAP()) {
Line 1512  sub manage_reservations { Line 1567  sub manage_reservations {
                 } elsif ($slot_status == $resource->RESERVABLE) {                  } elsif ($slot_status == $resource->RESERVABLE) {
                     $msg=&mt('Reservation needed');                      $msg=&mt('Reservation needed');
                     $get_choices = 1;                      $get_choices = 1;
                   } elsif ($slot_status == $resource->RESERVABLE_LATER) {
                       $msg=&mt('Reservation needed: will be reservable later.');
                 } elsif ($slot_status == $resource->NOTRESERVABLE) {                  } elsif ($slot_status == $resource->NOTRESERVABLE) {
                     $msg=&mt('Reservation needed: none available.');                      $msg=&mt('Reservation needed: none available.');
                 } elsif ($slot_status == $resource->UNKNOWN) {                  } elsif ($slot_status == $resource->UNKNOWN) {
Line 1545  sub manage_reservations { Line 1602  sub manage_reservations {
                     foreach my $item (@maprows) {                      foreach my $item (@maprows) {
                         $rownum ++;                          $rownum ++;
                         my $bgcolor = $backgrounds[$rownum % $numcolors];                          my $bgcolor = $backgrounds[$rownum % $numcolors];
                           if (!$shownheader) {
                               $r->print($slotheader);
                               $shownheader = 1;
                           }
                         $r->print('<tr class="'.$bgcolor.'">'.$item.'</tr>'."\n");                          $r->print('<tr class="'.$bgcolor.'">'.$item.'</tr>'."\n");
                     }                      }
                 }                  }
                 $rownum ++;                  $rownum ++;
                 my $bgcolor = $backgrounds[$rownum % $numcolors];                  my $bgcolor = $backgrounds[$rownum % $numcolors];
                   if (!$shownheader) {
                       $r->print($slotheader);
                       $shownheader = 1;
                   }
                 $r->print('<tr class="'.$bgcolor.'"><td>'."\n");                  $r->print('<tr class="'.$bgcolor.'"><td>'."\n");
                 for (my $i=0; $i<$depth; $i++) {                  for (my $i=0; $i<$depth; $i++) {
                     $r->print('<img src="'.$location.'" alt="" />');                      $r->print('<img src="'.$location.'" alt="" />');
Line 1584  sub manage_reservations { Line 1649  sub manage_reservations {
             }              }
         }          }
     }      }
       if ($shownheader) {
           $r->print('</table>');
       }
     if (!$reservable) {      if (!$reservable) {
         $r->print('<span class="LC_info">'.&mt('No course items currently require a reservation to gain access.').'</span>');          $r->print('<span class="LC_info">');
           if ($crstype eq 'Community') {
               $r->print(&mt('No community items currently require a reservation to gain access.'));
           } else {
               $r->print(&mt('No course items currently require a reservation to gain access.'));
           }
           $r->print('</span>');
     }      }
     $r->print('</table>'.      $r->print('<p><a href="/adm/slotrequest?command=showresv">'.
               '<p><a href="/adm/slotrequest?command=showresv">'.  
               &mt('Reservation History').'</a></p>');                &mt('Reservation History').'</a></p>');
 }  }
   
Line 1599  sub show_map_row { Line 1672  sub show_map_row {
         $output .= '<img src="'.$location.'" alt="" />';          $output .= '<img src="'.$location.'" alt="" />';
     }      }
     if ($type eq 'page') {      if ($type eq 'page') {
         $output .= '<img src="/adm/lonIcons/navmap.page.open.gif">&nbsp;'."\n";          $output .= '<img src="/adm/lonIcons/navmap.page.open.gif" alt="" />&nbsp;'."\n";
     } else {      } else {
         $output .= '<img src="/adm/lonIcons/navmap.folder.open.gif">&nbsp;'."\n";          $output .= '<img src="/adm/lonIcons/navmap.folder.open.gif" alt="" />&nbsp;'."\n";
     }      }
     $output .= $title.'</td><td colspan="2">&nbsp;</td>'."\n";      $output .= $title.'</td><td colspan="2">&nbsp;</td>'."\n";
     unshift (@{$maprows},$output);      unshift (@{$maprows},$output);
Line 1619  sub show_reservations { Line 1692  sub show_reservations {
     my $formname = 'slotlog';      my $formname = 'slotlog';
     my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};      my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
     my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};      my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
       my $crstype = &Apache::loncommon::course_type();
     my %log=&Apache::lonnet::dump('nohist_'.$cdom.'_'.$cnum.'_slotlog',$udom,$uname);      my %log=&Apache::lonnet::dump('nohist_'.$cdom.'_'.$cnum.'_slotlog',$udom,$uname);
     if ($env{'form.origin'} eq 'aboutme') {      if ($env{'form.origin'} eq 'aboutme') {
         $r->print('<div class="LC_fontsize_large">'.          $r->print('<div class="LC_fontsize_large">');
                   &mt('History of student-reservable slots for: [_1]',          my $name = &Apache::loncommon::plainname($env{'form.uname'},$env{'form.udom'},
                       &Apache::loncommon::plainname($env{'form.uname'},$env{'form.udom'},                                                      'firstname');
                                                     'firstname')).'</div>');          if ($crstype eq 'Community') {
               $r->print(&mt('History of member-reservable slots for: [_1]',
                             $name));
           } else {
               $r->print(&mt('History of student-reservable slots for: [_1]',
                             $name));
   
           }
           $r->print('</div>');
     }      }
     $r->print('<form action="/adm/slotrequest" method="post" name="'.$formname.'">');      $r->print('<form action="/adm/slotrequest" method="post" name="'.$formname.'">');
     # set defaults      # set defaults
Line 1673  sub show_reservations { Line 1755  sub show_reservations {
         }          }
     }      }
     my (%titles,%maptitles);      my (%titles,%maptitles);
     my %lt = &reservationlog_contexts();      my %lt = &reservationlog_contexts($crstype);
     foreach my $id (sort { $log{$b}{'exe_time'}<=>$log{$a}{'exe_time'} } (keys(%log))) {      foreach my $id (sort { $log{$b}{'exe_time'}<=>$log{$a}{'exe_time'} } (keys(%log))) {
         next if (($log{$id}{'exe_time'} < $curr{'log_start_date'}) ||          next if (($log{$id}{'exe_time'} < $curr{'log_start_date'}) ||
                  ($log{$id}{'exe_time'} > $curr{'log_end_date'}));                   ($log{$id}{'exe_time'} > $curr{'log_end_date'}));
Line 1735  ENDSCRIPT Line 1817  ENDSCRIPT
         }          }
     } else {      } else {
         $r->print('<span class="LC_info">'          $r->print('<span class="LC_info">'
                  .&mt('There are no transactions to display')                   .&mt('There are no transactions to display.')
                  .'</span>'                   .'</span>'
         );          );
     }      }
Line 1753  ENDSCRIPT Line 1835  ENDSCRIPT
 sub show_reservations_log {  sub show_reservations_log {
     my ($r) = @_;      my ($r) = @_;
     my $badslot;      my $badslot;
       my $crstype = &Apache::loncommon::course_type();
     if ($env{'form.slotname'} eq '') {      if ($env{'form.slotname'} eq '') {
         $r->print('<div class="LC_warning">'.&mt('No slot name provided').'</div>');          $r->print('<div class="LC_warning">'.&mt('No slot name provided').'</div>');
         $badslot = 1;          $badslot = 1;
Line 1763  sub show_reservations_log { Line 1846  sub show_reservations_log {
             $badslot = 1;              $badslot = 1;
         } elsif ($slot{type} ne 'schedulable_student') {          } elsif ($slot{type} ne 'schedulable_student') {
             my $description = &get_description($env{'form.slotname'},\%slot);              my $description = &get_description($env{'form.slotname'},\%slot);
             $r->print('<div class="LC_warning">'.&mt('Reservation history unavailable for non-student-reservable slot: [_1].',$description).'</div>');              $r->print('<div class="LC_warning">');
               if ($crstype eq 'Community') {
                   $r->print(&mt('Reservation history unavailable for non-member-reservable slot: [_1].',$description));
               } else {
                   $r->print(&mt('Reservation history unavailable for non-student-reservable slot: [_1].',$description));
               }
               $r->print('</div>');
             $badslot = 1;              $badslot = 1;
         }          }
     }      }
Line 1834  sub show_reservations_log { Line 1923  sub show_reservations_log {
   
     my %slot=&Apache::lonnet::get_slot($env{'form.slotname'});      my %slot=&Apache::lonnet::get_slot($env{'form.slotname'});
     my $description = $slot{'description'};      my $description = $slot{'description'};
     $r->print('<span class="LC_fontsize_large">'.      $r->print('<span class="LC_fontsize_large">');
               &mt('Reservation changes for student-reservable slot: [_1]',$description).'</span><br />');      if ($crstype eq 'Community') {
           $r->print(&mt('Reservation changes for member-reservable slot: [_1]',$description));
       } else {
           $r->print(&mt('Reservation changes for student-reservable slot: [_1]',$description));
       }
       $r->print('</span><br />');
     $r->print(&display_filter($formname,$cdom,$cnum,\%curr,$version,\@allsymbs));      $r->print(&display_filter($formname,$cdom,$cnum,\%curr,$version,\@allsymbs));
     my $showntablehdr = 0;      my $showntablehdr = 0;
     my $tablehdr = &Apache::loncommon::start_data_table().      my $tablehdr = &Apache::loncommon::start_data_table().
Line 1854  sub show_reservations_log { Line 1947  sub show_reservations_log {
             $minshown = 1 + ($curr{'page'} - 1) * $curr{'show'};              $minshown = 1 + ($curr{'page'} - 1) * $curr{'show'};
         }          }
     }      }
     my %lt = &reservationlog_contexts();      my %lt = &reservationlog_contexts($crstype);
     my (%titles,%maptitles);      my (%titles,%maptitles);
     foreach my $id (sort { $log{$b}{'exe_time'}<=>$log{$a}{'exe_time'} } (keys(%log))) {      foreach my $id (sort { $log{$b}{'exe_time'}<=>$log{$a}{'exe_time'} } (keys(%log))) {
         next if (($log{$id}{'exe_time'} < $curr{'log_start_date'}) ||          next if (($log{$id}{'exe_time'} < $curr{'log_start_date'}) ||
Line 1932  function chgPage(caller) { Line 2025  function chgPage(caller) {
 ENDSCRIPT  ENDSCRIPT
         }          }
     } else {      } else {
         $r->print(&mt('There are no records to display'));          $r->print(&mt('There are no records to display.'));
     }      }
     $r->print('<input type="hidden" name="page" value="'.$curr{'page'}.'" />'.      $r->print('<input type="hidden" name="page" value="'.$curr{'page'}.'" />'.
               '<input type="hidden" name="slotname" value="'.$env{'form.slotname'}.'" />'.                '<input type="hidden" name="slotname" value="'.$env{'form.slotname'}.'" />'.
Line 1974  sub get_resource_title { Line 2067  sub get_resource_title {
 }  }
   
 sub reservationlog_contexts {  sub reservationlog_contexts {
       my ($crstype) = @_;
     my %lt = &Apache::lonlocal::texthash (      my %lt = &Apache::lonlocal::texthash (
                                              any        => 'Any',                                               any        => 'Any',
                                              user       => 'By student',                                               user       => 'By student',
Line 1983  sub reservationlog_contexts { Line 2077  sub reservationlog_contexts {
                                              release    => 'Dropped reservation',                                               release    => 'Dropped reservation',
                                              usermanage => 'By student',                                                usermanage => 'By student', 
                                          );                                           );
       if ($crstype eq 'Community') {
           $lt{'user'} = &mt('By member');
           $lt{'usermanage'} = $lt{'user'};
       }
     return %lt;      return %lt;
 }  }
   
Line 2003  sub display_filter { Line 2101  sub display_filter {
         &Apache::lonhtmlcommon::date_setter($formname,'log_end_date',          &Apache::lonhtmlcommon::date_setter($formname,'log_end_date',
                                             $curr->{'log_end_date'},undef,                                              $curr->{'log_end_date'},undef,
                                             undef,undef,undef,undef,undef,undef,$nolink);                                              undef,undef,undef,undef,undef,undef,$nolink);
     my %lt = &reservationlog_contexts();      my $crstype = &Apache::loncommon::course_type();
       my %lt = &reservationlog_contexts($crstype);
     $output .= '<td valign="top"><b>'.&mt('Window during which changes occurred:').      $output .= '<td valign="top"><b>'.&mt('Window during which changes occurred:').
                '</b><br /><table><tr><td>'.&mt('After:').                 '</b><br /><table><tr><td>'.&mt('After:').
                '</td><td>'.$startform.'</td></tr><tr><td>'.&mt('Before:').'</td><td>'.                 '</td><td>'.$startform.'</td></tr><tr><td>'.&mt('Before:').'</td><td>'.
Line 2051  sub display_filter { Line 2150  sub display_filter {
     }      }
     $output .= '<td>&nbsp;&nbsp;</td><td valign="middle"><input type="submit" value="'.      $output .= '<td>&nbsp;&nbsp;</td><td valign="middle"><input type="submit" value="'.
                &mt('Update Display').'" /></tr></table>'.                 &mt('Update Display').'" /></tr></table>'.
                '<span class="LC_roleslog_note">'.                 '<p class="LC_info">'.
                &mt('[_1]Note:[_2] Only changes made from servers running LON-CAPA 2.8.99.0 or later are displayed.');                 &mt('Only changes made from servers running LON-CAPA [_1] or later are displayed.'
                     ,'2.9.0');
     if ($version) {      if ($version) {
         $output .= ' '.&mt('This server is version [_3].','<b>','</b>',$version);          $output .= ' '.&mt('This LON-CAPA server is version [_1]',$version);
     }      }
     $output .= '</span><hr noshade><br />';      $output .= '</p><hr /><br />';
     return $output;      return $output;
 }  }
   
   sub slot_change_messaging {
       my ($setting,$subject,$msg,$action) = @_;
       my $user = $env{'user.name'};
       my $domain = $env{'user.domain'};
       my ($message_status,$comment_status);
       if ($setting eq 'only_student'
           || $setting eq 'student_and_user_notes_screen') {
           $message_status =
               &Apache::lonmsg::user_normal_msg($user,$domain,$subject,$msg);
           $message_status = '<li>'.&mt('Sent to you: [_1]',
                                       $message_status).' </li>';
       }
       if ($setting eq 'student_and_user_notes_screen') {
           $comment_status =
               &Apache::lonmsg::store_instructor_comment($subject.'<br />'.
                                                         $msg,$user,$domain);
           $comment_status = '<li>'.&mt('Entry added to course record (viewable by instructor): [_1]',
                                       $comment_status).'</li>';
       }
       if ($message_status || $comment_status) {
           my $msgtitle;
           if ($action eq 'reserve') {
               $msgtitle = &mt('Status of messages about saved reservation');
           } elsif ($action eq 'release') {
               $msgtitle = &mt('Status of messages about dropped reservation');
           } elsif ($action eq 'nochange') {
               $msgtitle = &mt('Status of messages about unchanged existing reservation');
           }
           return '<span class="LC_info">'.$msgtitle.'</span>'
                  .'<ul>'
                  .$message_status
                  .$comment_status
                  .'</ul><hr />';
       }
   }
   
 sub upload_start {  sub upload_start {
     my ($r)=@_;          my ($r)=@_;    
     $r->print(&Apache::grades::checkforfile_js());      $r->print(
     my $result.='<table width=100% border=0><tr bgcolor="#e6ffff"><td>'."\n";          &Apache::grades::checkforfile_js()
     $result.='&nbsp;<b>'.         .'<h3>'.&mt('Specify a file containing the slot definitions.').'</h3>'
  &mt('Specify a file containing the slot definitions.').         .'<form method="post" enctype="multipart/form-data"'
  '</b></td></tr>'."\n";         .' action="/adm/slotrequest" name="slotupload">'
     $result.='<tr bgcolor="#ffffe6"><td>'."\n";         .'<input type="hidden" name="command" value="csvuploadmap" />'
     my $upfile_select=&Apache::loncommon::upfile_select_html();         .&Apache::lonhtmlcommon::start_pick_box()
     my $ignore=&mt('Ignore First Line');         .&Apache::lonhtmlcommon::row_title(&mt('File'))
     $result.=<<ENDUPFORM;         .&Apache::loncommon::upfile_select_html()
 <form method="post" enctype="multipart/form-data" action="/adm/slotrequest" name="slotupload">         .&Apache::lonhtmlcommon::row_closure()
 <input type="hidden" name="command" value="csvuploadmap" />         .&Apache::lonhtmlcommon::row_title(
 $upfile_select              '<label for="noFirstLine">'
 <br /><input type="button" onClick="javascript:checkUpload(this.form);" value="Upload Data" />             .&mt('Ignore First Line')
 <label><input type="checkbox" name="noFirstLine" />$ignore</label>             .'</label>')
 </form>         .'<input type="checkbox" name="noFirstLine" id="noFirstLine" />'
 ENDUPFORM         .&Apache::lonhtmlcommon::row_closure(1)
     $result.='</td></tr></table>'."\n";         .&Apache::lonhtmlcommon::end_pick_box()
     $result.='</td></tr></table>'."\n";         .'<p>'
     $r->print($result);         .'<input type="button" onclick="javascript:checkUpload(this.form);"'
          .' value="'.&mt('Next').'" />'
          .'</p>'
         .'</form>'
       );
 }  }
   
 sub csvuploadmap_header {  sub csvuploadmap_header {
Line 2102  sub csvuploadmap_header { Line 2242  sub csvuploadmap_header {
 Total number of records found in file: $distotal <hr />  Total number of records found in file: $distotal <hr />
 Enter as many fields as you can. The system will inform you and bring you back  Enter as many fields as you can. The system will inform you and bring you back
 to this page if the data selected is insufficient to create the slots.<hr />  to this page if the data selected is insufficient to create the slots.<hr />
 <input type="button" value="Reverse Association" onClick="javascript:this.form.associate.value='Reverse Association';submit(this.form);" />  <input type="button" value="Reverse Association" onclick="javascript:this.form.associate.value='Reverse Association';submit(this.form);" />
 <label><input type="checkbox" name="noFirstLine" $checked />$ignore</label>  <label><input type="checkbox" name="noFirstLine"$checked />$ignore</label>
 <input type="hidden" name="associate"  value="" />  <input type="hidden" name="associate"  value="" />
 <input type="hidden" name="datatoken"  value="$datatoken" />  <input type="hidden" name="datatoken"  value="$datatoken" />
 <input type="hidden" name="fileupload" value="$env{'form.fileupload'}" />  <input type="hidden" name="fileupload" value="$env{'form.fileupload'}" />
Line 2127  sub csvuploadmap_footer { Line 2267  sub csvuploadmap_footer {
 </table>  </table>
 <input type="hidden" name="nfields" value="$i" />  <input type="hidden" name="nfields" value="$i" />
 <input type="hidden" name="keyfields" value="$keyfields" />  <input type="hidden" name="keyfields" value="$keyfields" />
 <input type="button" onClick="javascript:verify(this.form)" value="$buttontext" /><br />  <input type="button" onclick="javascript:verify(this.form)" value="$buttontext" /><br />
 </form>  </form>
 ENDPICK  ENDPICK
 }  }
Line 2226  sub csvupload_fields { Line 2366  sub csvupload_fields {
     ['starttime','Start Time of slot'],      ['starttime','Start Time of slot'],
     ['endtime','End Time of slot'],      ['endtime','End Time of slot'],
     ['startreserve','Reservation Start Time'],      ['startreserve','Reservation Start Time'],
               ['endreserve','Reservation End Time'],
               ['reservationmsg','Message when reservation changed'],
     ['ip','IP or DNS restriction'],      ['ip','IP or DNS restriction'],
     ['proctor','List of proctor ids'],      ['proctor','List of proctor ids'],
     ['description','Slot Description'],      ['description','Slot Description'],
Line 2307  sub csv_upload_assign { Line 2449  sub csv_upload_assign {
     next;      next;
  }   }
   
           if ($entries{$fields{'endreserve'}}) {
               $slot{'endreserve'}=
                   &UnixDate($entries{$fields{'endreserve'}},"%s");
           }
           if (defined($slot{'endreserve'})
               && $slot{'endreserve'} > $slot{'starttime'}) {
               push(@errors,"$name not created -- Slot's reservation end time is after the slot's start time.");
               next;
           }
   
           if ($slot{'type'} eq 'schedulable_student') {
               if ($entries{$fields{'reservationmsg'}}) {
                    if (($entries{$fields{'reservationmsg'}} eq 'only_student') ||
                        ($entries{$fields{'reservationmsg'}} eq 'student_and_user_notes_screen')) {
                         $slot{'reservationmsg'}=$entries{$fields{'reservationmsg'}};
                    } else {
                         unless (($entries{$fields{'reservationmsg'}} eq 'none') ||
                                 ($entries{$fields{'reservationmsg'}} eq '')) {
                             push(@errors,"$name -- Slot's reservationmsg setting ignored - not one of: 'only_student', 'student_and_user_notes_screen', 'none' or ''");
                         }
                    }
               }
           }
   
  foreach my $key ('ip','proctor','description','maxspace',   foreach my $key ('ip','proctor','description','maxspace',
  'secret','symb') {   'secret','symb') {
     if ($entries{$fields{$key}}) {      if ($entries{$fields{$key}}) {
Line 2331  sub csv_upload_assign { Line 2497  sub csv_upload_assign {
  $r->rflush();   $r->rflush();
  $countdone++;   $countdone++;
     }      }
       if ($countdone) {
           &Apache::lonnet::devalidate_slots_cache($cname,$cdom); 
       }
     $r->print('<p>'.&mt('Created [quant,_1,slot]',$countdone)."\n".'</p>');      $r->print('<p>'.&mt('Created [quant,_1,slot]',$countdone)."\n".'</p>');
     foreach my $error (@errors) {      foreach my $error (@errors) {
  $r->print('<p><span class="LC_warning">'.$error.'</span></p>'."\n");   $r->print('<p><span class="LC_warning">'.$error.'</span></p>'."\n");
Line 2356  sub slot_command_titles { Line 2525  sub slot_command_titles {
     return %titles;      return %titles;
 }  }
   
   sub slot_reservationmsg_options {
       my %options = &Apache::lonlocal::texthash (
                           only_student  => 'Sent to student',
           student_and_user_notes_screen => 'Sent to student and added to user notes',
                                    none => 'None sent and no record in user notes',
       );
       return %options;
   }
   
 sub handler {  sub handler {
     my $r=shift;      my $r=shift;
   
Line 2415  sub handler { Line 2593  sub handler {
             if (ref($brcrum) eq 'ARRAY') {              if (ref($brcrum) eq 'ARRAY') {
                 push(@{$brcrum},{href=>"/adm/slotrequest?command=$env{'form.command'}",text=>$crumb_titles{$env{'form.command'}}});                  push(@{$brcrum},{href=>"/adm/slotrequest?command=$env{'form.command'}",text=>$crumb_titles{$env{'form.command'}}});
             }              }
               
         }          }
       } else {
           $brcrum =[];
     }      }
     &start_page($r,$title,$brcrum);      &start_page($r,$title,$brcrum);
   
Line 2485  sub handler { Line 2664  sub handler {
  } elsif ($env{'form.command'} eq 'get') {   } elsif ($env{'form.command'} eq 'get') {
     &get_slot($r,$symb);      &get_slot($r,$symb);
  } elsif ($env{'form.command'} eq 'change') {   } elsif ($env{'form.command'} eq 'change') {
     if (&get_slot($r,$symb,$env{'form.releaseslot'},1)) {              if ($env{'form.nochange'}) {
                   my $slot_name = $env{'form.releaseslot'};
                   my @slots = &check_for_reservation($symb,'allslots');
                   my $msg;
                   if (($slot_name ne '') && (grep(/^\Q$slot_name\E/,@slots))) { 
                        my %slot=&Apache::lonnet::get_slot($env{'form.releaseslot'});
                        my $description=&get_description($slot_name,\%slot);
                        $msg = '<span style="font-weight: bold;">'.
                               &mt('Unchanged reservation: [_1]',$description).'</span><br /><br />';
                        my $person = 
                            &Apache::loncommon::plainname($env{'user.name'},$env{'user.domain'});
                        my $subject = &mt('Reservation unchanged: [_1]',$description);
                        my $msgbody = &mt('No change to existing registration by [_1] for [_2].',$person,$description);
                        $msg .= &slot_change_messaging($slot{'reservationmsg'},$subject,$msgbody,'nochange');
                   } else {
                       $msg = '<span class="LC_warning">'.&mt('Reservation no longer reported as available.').'</span>';
                   }
                   $r->print($msg);
                   &return_link($r);
       } elsif (&get_slot($r,$symb,$env{'form.releaseslot'},1)) {
  &release_slot($r,$symb,$env{'form.releaseslot'});   &release_slot($r,$symb,$env{'form.releaseslot'});
     }      }
  } else {   } else {

Removed from v.1.94  
changed lines
  Added in v.1.115


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