Diff for /loncom/interface/slotrequest.pm between versions 1.55 and 1.65

version 1.55, 2006/03/30 04:35:58 version 1.65, 2006/06/16 19:54:02
Line 36  use Apache::lonlocal; Line 36  use Apache::lonlocal;
 use Apache::lonnet;  use Apache::lonnet;
 use Apache::lonnavmaps();  use Apache::lonnavmaps();
 use Date::Manip;  use Date::Manip;
   use lib '/home/httpd/lib/perl/';
   use LONCAPA;
   
 sub fail {  sub fail {
     my ($r,$code)=@_;      my ($r,$code)=@_;
     if ($code eq 'not_valid') {      if ($code eq 'not_valid') {
  $r->print('<p>'.&mt('Unable to understand what resource you wanted to sign up for.').'</p>');   $r->print('<p>'.&mt('Unable to understand what resource you wanted to sign up for.').'</p>');
       } elsif ($code eq 'not_available') {
    $r->print('<p>'.&mt('No slots are available.').'</p>');
     } elsif ($code eq 'not_allowed') {      } elsif ($code eq 'not_allowed') {
  $r->print('<p>'.&mt('Not allowed to sign up or change reservations at this time.').'</p>');   $r->print('<p>'.&mt('Not allowed to sign up or change reservations at this time.').'</p>');
     } else {      } else {
Line 243  sub make_reservation { Line 246  sub make_reservation {
     my $value=&Apache::lonnet::EXT("resource.0.availablestudent",$symb,      my $value=&Apache::lonnet::EXT("resource.0.availablestudent",$symb,
    $env{'user.domain'},$env{'user.name'});     $env{'user.domain'},$env{'user.name'});
     &Apache::lonxml::debug("value is  $value<br />");      &Apache::lonxml::debug("value is  $value<br />");
     if (&network_error($value)) {   
       my $use_slots = &Apache::lonnet::EXT("resource.0.useslots");
       &Apache::lonxml::debug("use_slots is  $use_slots<br />");
   
       if (&network_error($value) || &network_error($use_slots)) { 
  return 'error: Unable to determine current status';   return 'error: Unable to determine current status';
     }      }
   
       my $parm_symb  = $symb;
       my $parm_level = 1;
       if ($use_slots eq 'map') {
    my ($map) = &Apache::lonnet::decode_symb($symb);
    $parm_symb = &Apache::lonnet::symbread($map);
    $parm_level = 2;
       }
   
     foreach my $other_slot (split(/:/, $value)) {      foreach my $other_slot (split(/:/, $value)) {
  if ($other_slot eq $slot_name) {   if ($other_slot eq $slot_name) {
     my %consumed=&Apache::lonnet::dump('slot_reservations', $cdom,      my %consumed=&Apache::lonnet::dump('slot_reservations', $cdom,
Line 254  sub make_reservation { Line 269  sub make_reservation {
     if (&network_error($value)) {       if (&network_error($value)) { 
  return 'error: Unable to determine current status';   return 'error: Unable to determine current status';
     }      }
     my $me=$env{'user.name'}.'@'.$env{'user.domain'};      my $me=$env{'user.name'}.':'.$env{'user.domain'};
     foreach my $key (keys(%consumed)) {      foreach my $key (keys(%consumed)) {
  if ($consumed{$key}->{'name'} eq $me) {   if ($consumed{$key}->{'name'} eq $me) {
     my $num=(split('\0',$key))[1];      my $num=(split('\0',$key))[1];
Line 284  sub make_reservation { Line 299  sub make_reservation {
  return undef;   return undef;
     }      }
           
     my %reservation=('name'      => $env{'user.name'}.'@'.$env{'user.domain'},      my %reservation=('name'      => $env{'user.name'}.':'.$env{'user.domain'},
      'timestamp' => time,       'timestamp' => time,
      'symb'      => $symb);       'symb'      => $parm_symb);
   
     my $success=&Apache::lonnet::newput('slot_reservations',      my $success=&Apache::lonnet::newput('slot_reservations',
  {"$slot_name\0$wanted" =>   {"$slot_name\0$wanted" =>
Line 300  sub make_reservation { Line 315  sub make_reservation {
  }   }
  my $result=&Apache::lonparmset::storeparm_by_symb($symb,   my $result=&Apache::lonparmset::storeparm_by_symb($symb,
       '0_availablestudent',        '0_availablestudent',
        1, $new_value, 'string',         $parm_level, $new_value,
          'string',
        $env{'user.name'},         $env{'user.name'},
                $env{'user.domain'});                 $env{'user.domain'});
  &Apache::lonxml::debug("hrrm $result");   &Apache::lonxml::debug("hrrm $result");
Line 369  sub remove_registration_confirmation { Line 385  sub remove_registration_confirmation {
  'no'  => 'No',);   'no'  => 'No',);
     $r->print(<<"END_CONFIRM");      $r->print(<<"END_CONFIRM");
 <p> $msg </p>  <p> $msg </p>
 <form action="/adm/slotrequest" method="POST">  <form action="/adm/slotrequest" method="post">
     <input type="hidden" name="command" value="release" />      <input type="hidden" name="command" value="release" />
     <input type="hidden" name="button" value="yes" />      <input type="hidden" name="button" value="yes" />
     $hidden_input      $hidden_input
     <input type="submit" value="$lt{'yes'}" />      <input type="submit" value="$lt{'yes'}" />
 </form>  </form>
 <form action="/adm/slotrequest" method="POST">  <form action="/adm/slotrequest" method="post">
     <input type="hidden" name="command" value="showslots" />      <input type="hidden" name="command" value="showslots" />
     <input type="submit" value="$lt{'no'}" />      <input type="submit" value="$lt{'no'}" />
 </form>  </form>
Line 397  sub release_all_slot { Line 413  sub release_all_slot {
   
     foreach my $entry (sort { $consumed{$a}{'name'} cmp       foreach my $entry (sort { $consumed{$a}{'name'} cmp 
   $consumed{$b}{'name'} } (keys(%consumed))) {    $consumed{$b}{'name'} } (keys(%consumed))) {
  my ($uname,$udom) = split('@',$consumed{$entry}{'name'});   my ($uname,$udom) = split(':',$consumed{$entry}{'name'});
  my ($result,$msg) =   my ($result,$msg) =
     &release_reservation($slot_name,$uname,$udom,      &release_reservation($slot_name,$uname,$udom,
  $consumed{$entry}{'symb'},$mgr);   $consumed{$entry}{'symb'},$mgr);
Line 465  sub release_reservation { Line 481  sub release_reservation {
     my %consumed=&Apache::lonnet::dump('slot_reservations',$cdom,$cnum,      my %consumed=&Apache::lonnet::dump('slot_reservations',$cdom,$cnum,
        "^$slot_name\0");         "^$slot_name\0");
     foreach my $entry (keys(%consumed)) {      foreach my $entry (keys(%consumed)) {
  if ( $consumed{$entry}->{'name'} eq ($uname.'@'.$udom) ) {   if ( $consumed{$entry}->{'name'} eq ($uname.':'.$udom) ) {
     &Apache::lonnet::del('slot_reservations',[$entry],      &Apache::lonnet::del('slot_reservations',[$entry],
  $cdom,$cnum);   $cdom,$cnum);
  }   }
     }      }
   
       my $use_slots = &Apache::lonnet::EXT("resource.0.useslots");
       &Apache::lonxml::debug("use_slots is  $use_slots<br />");
   
       if (&network_error($use_slots)) { 
    return (0,'error: Unable to determine current status');
       }
   
       my $parm_level = 1;
       if ($use_slots eq 'map') {
    $parm_level = 2;
       }
     # store new parameter string      # store new parameter string
     my $result=&Apache::lonparmset::storeparm_by_symb($symb,      my $result=&Apache::lonparmset::storeparm_by_symb($symb,
       '0_availablestudent',        '0_availablestudent',
       1, $new_param, 'string',        $parm_level, $new_param,
       $uname,$udom);        'string', $uname, $udom);
   
     my $msg;      my $msg;
     if ($mgr eq 'F') {      if ($mgr eq 'F') {
Line 544  sub get_slot { Line 571  sub get_slot {
  $r->print("<p>Already have a reservation: $description1</p>");   $r->print("<p>Already have a reservation: $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">
    <input type="hidden" name="symb" value="$env{'form.symb'}" />     <input type="hidden" name="symb" value="$env{'form.symb'}" />
    <input type="hidden" name="slotname" value="$env{'form.slotname'}" />     <input type="hidden" name="slotname" value="$env{'form.slotname'}" />
    <input type="hidden" name="releaseslot" value="$slot_name" />     <input type="hidden" name="releaseslot" value="$slot_name" />
Line 589  STUFF Line 616  STUFF
     $r->print(<<STUFF);      $r->print(<<STUFF);
 <p> <font color="red">Failed</font> to reserve a spot for $description. </p>  <p> <font color="red">Failed</font> to reserve a spot for $description. </p>
 <p>  <p>
 <form method="POST" action="/adm/slotrequest">  <form method="post" action="/adm/slotrequest">
    <input type="submit" name="Try Again" value="$lt{'try'}" />     <input type="submit" name="Try Again" value="$lt{'try'}" />
    <input type="hidden" name="symb" value="$env{'form.symb'}" />     <input type="hidden" name="symb" value="$env{'form.symb'}" />
    <input type="hidden" name="slotname" value="$env{'form.slotname'}" />     <input type="hidden" name="slotname" value="$env{'form.slotname'}" />
Line 599  STUFF Line 626  STUFF
 </p>  </p>
 <p>  <p>
 or  or
 <form method="POST" action="/adm/slotrequest">  <form method="post" action="/adm/slotrequest">
     <input type="hidden" name="symb" value="$env{'form.symb'}" />      <input type="hidden" name="symb" value="$env{'form.symb'}" />
     <input type="submit" name="requestattempt" value="$lt{'request'}" />      <input type="submit" name="requestattempt" value="$lt{'request'}" />
 </form>  </form>
Line 738  sub show_choices { Line 765  sub show_choices {
     $command='get';      $command='get';
  }   }
     }      }
     my $escsymb=&Apache::lonnet::escape($symb);      my $escsymb=&escape($symb);
     $form=<<STUFF;      $form=<<STUFF;
    <form method="POST" action="/adm/slotrequest">     <form method="post" action="/adm/slotrequest">
      <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" />
Line 837  sub remove_link { Line 864  sub remove_link {
  undef($udom);   undef($udom);
     }      }
   
     $slotname  = &Apache::lonnet::escape($slotname);      $slotname  = &escape($slotname);
     $entry     = &Apache::lonnet::escape($entry);      $entry     = &escape($entry);
     $uname     = &Apache::lonnet::escape($uname);      $uname     = &escape($uname);
     $udom      = &Apache::lonnet::escape($udom);      $udom      = &escape($udom);
     $symb      = &Apache::lonnet::escape($symb);      $symb      = &escape($symb);
   
     return <<"END_LINK";      return <<"END_LINK";
  <a href="/adm/slotrequest?command=remove_registration&slotname=$slotname&entry=$entry&uname=$uname&udom=$udom&symb=$symb"   <a href="/adm/slotrequest?command=remove_registration&amp;slotname=$slotname&amp;entry=$entry&amp;uname=$uname&amp;udom=$udom&amp;symb=$symb"
    >($remove)</a>     >($remove)</a>
 END_LINK  END_LINK
   
Line 861  sub show_table { Line 888  sub show_table {
     my $available;      my $available;
     if ($mgr eq 'F') {      if ($mgr eq 'F') {
  $r->print('<div>');   $r->print('<div>');
  $r->print('<form method="POST" action="/adm/slotrequest">   $r->print('<form method="post" action="/adm/slotrequest">
 <input type="hidden" name="command" value="uploadstart" />  <input type="hidden" name="command" value="uploadstart" />
 <input type="submit" name="start" value="'.&mt('Upload Slot List').'" />  <input type="submit" name="start" value="'.&mt('Upload Slot List').'" />
 </form>');  </form>');
  $r->print('<form method="POST" action="/adm/helper/newslot.helper">   $r->print('<form method="post" action="/adm/helper/newslot.helper">
 <input type="submit" name="newslot" value="'.&mt('Create a New Slot').'" />  <input type="submit" name="newslot" value="'.&mt('Create a New Slot').'" />
 </form>');  </form>');
  $r->print('</div>');   $r->print('</div>');
Line 952  sub show_table { Line 979  sub show_table {
     my $name_filter = {'type'  => $name_filter_type,      my $name_filter = {'type'  => $name_filter_type,
        'value' => $env{'form.name_filter_value'},};         'value' => $env{'form.name_filter_value'},};
   
       
     #deleted slot filtering      #deleted slot filtering
       #default to hide if no value
       $env{'form.deleted'} ||= 'hide';
     my $hide_radio =       my $hide_radio = 
  &Apache::lonhtmlcommon::radio('deleted',$env{'form.deleted'},'hide');   &Apache::lonhtmlcommon::radio('deleted',$env{'form.deleted'},'hide');
     my $show_radio =       my $show_radio = 
  &Apache::lonhtmlcommon::radio('deleted',$env{'form.deleted'},'show');   &Apache::lonhtmlcommon::radio('deleted',$env{'form.deleted'},'show');
   
     $r->print('<form method="POST" action="/adm/slotrequest">      $r->print('<form method="post" action="/adm/slotrequest">
 <input type="hidden" name="command" value="showslots" />');  <input type="hidden" name="command" value="showslots" />');
     $r->print('<div>');      $r->print('<div>');
     $r->print('<table class="inline">      $r->print('<table class="inline">
Line 1001  sub show_table { Line 1031  sub show_table {
     $r->print('</div>');      $r->print('</div>');
     $r->print('<p><input type="submit" name="start" value="'.&mt('Update Display').'" /></p>');      $r->print('<p><input type="submit" name="start" value="'.&mt('Update Display').'" /></p>');
     my $linkstart='<a href="/adm/slotrequest?command=showslots&amp;order=';      my $linkstart='<a href="/adm/slotrequest?command=showslots&amp;order=';
     $r->print('<table class="thinborder">      $r->print(&Apache::loncommon::start_data_table().
 <tr>        &Apache::loncommon::start_data_table_header_row().'
   <th></th>');         <th></th>');
     foreach my $which (@show_order) {      foreach my $which (@show_order) {
  if ($which ne 'proctor' && exists($show{$which})) {   if ($which ne 'proctor' && exists($show{$which})) {
     $r->print('<th>'.$linkstart.$which.'">'.$show_fields{$which}.'</a></th>');      $r->print('<th>'.$linkstart.$which.'">'.$show_fields{$which}.'</a></th>');
  }   }
     }      }
       $r->print(&Apache::loncommon::end_data_table_header_row());
   
     my %name_cache;      my %name_cache;
     my $slotsort = sub {      my $slotsort = sub {
Line 1055  sub show_table { Line 1086  sub show_table {
       $consumed{$b}{name} }        $consumed{$b}{name} }
    (keys(%consumed))) {     (keys(%consumed))) {
     my (undef,$id)=split("\0",$entry);      my (undef,$id)=split("\0",$entry);
     my ($uname,$udom) = split('@',$consumed{$entry}{'name'});      my ($uname,$udom) = split(':',$consumed{$entry}{'name'});
     $ids.= '<nobr>';      $ids.= '<nobr>';
     foreach my $item (@stu_display_order) {      foreach my $item (@stu_display_order) {
  if ($stu_display{$item}) {   if ($stu_display{$item}) {
     if ($item eq 'fullname') {      if ($item eq 'fullname') {
  $ids.=$fullname->{"$uname:$udom"}.' ';   $ids.=$fullname->{"$uname:$udom"}.' ';
     } elsif ($item eq 'username') {      } elsif ($item eq 'username') {
  $ids.="<tt>$uname\@$udom</tt> ";   $ids.="<tt>$uname:$udom</tt> ";
     }      }
  }   }
     }      }
Line 1081  sub show_table { Line 1112  sub show_table {
   
  my $unique;   my $unique;
  if (ref($slots{$slot}{'uniqueperiod'})) {   if (ref($slots{$slot}{'uniqueperiod'})) {
     $unique=localtime($slots{$slot}{'uniqueperiod'}[0]).','.      $unique=localtime($slots{$slot}{'uniqueperiod'}[0]).', '.
  localtime($slots{$slot}{'uniqueperiod'}[1]);   localtime($slots{$slot}{'uniqueperiod'}[1]);
  }   }
   
Line 1122  sub show_table { Line 1153  sub show_table {
  if (exists($show{'proctor'})) {   if (exists($show{'proctor'})) {
     $rowspan=2;      $rowspan=2;
     @proctors= map {      @proctors= map {
  my ($uname,$udom)=split(/@/,$_);   my ($uname,$udom)=split(/:/,$_);
  my $fullname=$name_cache{$_};   my $fullname=$name_cache{$_};
  if (!defined($fullname)) {   if (!defined($fullname)) {
     $fullname = &Apache::loncommon::plainname($uname,$udom);      $fullname = &Apache::loncommon::plainname($uname,$udom);
Line 1139  sub show_table { Line 1170  sub show_table {
 EDITLINK  EDITLINK
   
  my $delete=(<<"DELETELINK");   my $delete=(<<"DELETELINK");
 <a href="/adm/slotrequest?command=delete&slotname=$slot">Delete</a>  <a href="/adm/slotrequest?command=delete&amp;slotname=$slot">Delete</a>
 DELETELINK  DELETELINK
   
         my $remove_all=&remove_link($slot,'remove all');          my $remove_all=&remove_link($slot,'remove all').'<br />';
   
         if ($ids ne '') { undef($delete); }          if ($ids ne '') { undef($delete); }
  if ($slots{$slot}{'type'} ne 'schedulable_student') {    if ($slots{$slot}{'type'} ne 'schedulable_student' 
       || $ids eq '') { 
     undef($remove_all);      undef($remove_all);
  }   }
   
         $r->print("<tr>\n<td rowspan=\"$rowspan\">$edit $delete $remove_all</td>\n");   my $row_start=&Apache::loncommon::start_data_table_row();
    my $row_end=&Apache::loncommon::end_data_table_row();
           $r->print($row_start.
     "\n<td rowspan=\"$rowspan\">$edit $delete</td>\n");
  if (exists($show{'name'})) {   if (exists($show{'name'})) {
     $colspan++;$r->print("<td>$slot</td>");      $colspan++;$r->print("<td>$slot</td>");
  }   }
Line 1186  DELETELINK Line 1221  DELETELINK
  if (exists($show{'allowedusers'})) {   if (exists($show{'allowedusers'})) {
     $colspan++;$r->print("<td>$allowedusers</td>\n");      $colspan++;$r->print("<td>$allowedusers</td>\n");
  }   }
    if (exists($show{'uniqueperiod'})) {
       $colspan++;$r->print("<td>$unique</td>\n");
    }
  if (exists($show{'scheduled'})) {   if (exists($show{'scheduled'})) {
     $colspan++;$r->print("<td>$ids</td>\n</tr>\n");      $colspan++;$r->print("<td>$remove_all $ids</td>\n");
  }   }
    $r->print("$row_end\n");
  if (exists($show{'proctor'})) {   if (exists($show{'proctor'})) {
     $r->print(<<STUFF);      $r->print(<<STUFF);
 <tr>  $row_start
  <td colspan="$colspan">$proctors</td>   <td colspan="$colspan">$proctors</td>
 </tr>  $row_end
 STUFF  STUFF
         }          }
     }      }
     $r->print('</table>');      $r->print('</table></form>');
 }  }
   
 sub upload_start {  sub upload_start {
Line 1419  sub csv_upload_assign { Line 1458  sub csv_upload_assign {
  if ($entries{$fields{'endtime'}}) {   if ($entries{$fields{'endtime'}}) {
     $slot{'endtime'}=&UnixDate($entries{$fields{'endtime'}},"%s");      $slot{'endtime'}=&UnixDate($entries{$fields{'endtime'}},"%s");
  }   }
   
    # start/endtime must be defined and greater than zero
    if (!$slot{'starttime'}) {
       push(@errors,"$name not created -- Invalid start time");
       next;
    }
    if (!$slot{'endtime'}) {
       push(@errors,"$name not created -- Invalid end time");
       next;
    }
    if ($slot{'starttime'} > $slot{'endtime'}) {
       push(@errors,"$name not created -- Slot starts after it ends");
       next;
    }
   
  if ($entries{$fields{'startreserve'}}) {   if ($entries{$fields{'startreserve'}}) {
     $slot{'startreserve'}=      $slot{'startreserve'}=
  &UnixDate($entries{$fields{'startreserve'}},"%s");   &UnixDate($entries{$fields{'startreserve'}},"%s");
  }   }
    if (defined($slot{'startreserve'})
       && $slot{'startreserve'} > $slot{'starttime'}) {
       push(@errors,"$name not created -- Slot's reservation start time is after the slot's start time.");
       next;
    }
   
  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}}) {
  $slot{$key}=$entries{$fields{$key}};   $slot{$key}=$entries{$fields{$key}};
     }      }
  }   }
   
  if ($entries{$fields{'uniqueperiod'}}) {   if ($entries{$fields{'uniqueperiod'}}) {
     my ($start,$end)=split(',',$entries{$fields{'uniqueperiod'}});      my ($start,$end)=split(',',$entries{$fields{'uniqueperiod'}});
     my @times=(&UnixDate($start,"%s"),      my @times=(&UnixDate($start,"%s"),
        &UnixDate($end,"%s"));         &UnixDate($end,"%s"));
     $slot{'uniqueperiod'}=\@times;      $slot{'uniqueperiod'}=\@times;
  }   }
    if (defined($slot{'uniqueperiod'})
       && $slot{'uniqueperiod'}[0] > $slot{'uniqueperiod'}[1]) {
       push(@errors,"$name not created -- Slot's unique period start time is later than the unique period's end time.");
       next;
    }
   
  &Apache::lonnet::cput('slots',{$name=>\%slot},$cdom,$cname);   &Apache::lonnet::cput('slots',{$name=>\%slot},$cdom,$cname);
  $r->print('.');   $r->print('.');
Line 1497  sub handler { Line 1563  sub handler {
     &csv_upload_map($r);      &csv_upload_map($r);
  }   }
     } else {      } else {
  my $symb=&Apache::lonnet::unescape($env{'form.symb'});   my $symb=&unescape($env{'form.symb'});
    if (!defined($symb)) {
       &fail($r,'not_valid');
       return OK;
    }
  my (undef,undef,$res)=&Apache::lonnet::decode_symb($symb);   my (undef,undef,$res)=&Apache::lonnet::decode_symb($symb);
  my $useslots = &Apache::lonnet::EXT("resource.0.useslots",$symb);   my $useslots = &Apache::lonnet::EXT("resource.0.useslots",$symb);
  if ($useslots ne 'resource') {   if ($useslots ne 'resource' && $useslots ne 'map') {
     &fail($r,'not_valid');      &fail($r,'not_available');
     return OK;      return OK;
  }   }
  $env{'request.symb'}=$symb;   $env{'request.symb'}=$symb;

Removed from v.1.55  
changed lines
  Added in v.1.65


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