Diff for /loncom/interface/slotrequest.pm between versions 1.3 and 1.18

version 1.3, 2005/06/04 07:44:48 version 1.18, 2005/09/13 08:12:03
Line 34  use Apache::Constants qw(:common :http : Line 34  use Apache::Constants qw(:common :http :
 use Apache::loncommon();  use Apache::loncommon();
 use Apache::lonlocal;  use Apache::lonlocal;
 use Apache::lonnet;  use Apache::lonnet;
   use Date::Manip;
   
 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>'.$env{'form.symb'});   $r->print('<p>'.&mt('Unable to understand what resource you wanted to sign up for.').'</p>');
   
       } elsif ($code eq 'not_allowed') {
    $r->print('<p>'.&mt('Not allowed to sign up or change reservations at this time.').'</p>');
       } else {
    $r->print('<p>'.&mt('Failed.').'</p>');
     }      }
       
     $r->print('<p><a href="/adm/flip?postdata=return:">'.      $r->print('<p><a href="/adm/flip?postdata=return:">'.
       &mt('Return to last resource').'</a></p>');        &mt('Return to last resource').'</a></p>');
     &end_page($r);      &end_page($r);
Line 105  sub space_available { Line 111  sub space_available {
     return 0;      return 0;
 }  }
   
 # FIXME - depends on the parameter for the resource to be correct  sub check_for_reservation {
 #         tho prevent multiple reservations      my ($symb)=@_;
       my $student = &Apache::lonnet::EXT("resource.0.availablestudent", $symb,
          $env{'user.domain'}, $env{'user.name'});
   
       my $course = &Apache::lonnet::EXT("resource.0.available", $symb,
       $env{'user.domain'}, $env{'user.name'});
       my @slots = (split(/:/,$student), split(/:/, $course));
   
       &Apache::lonxml::debug(" slot list is ".join(':',@slots));
   
       my ($cnum,$cdom)=&get_course();
       my %slots=&Apache::lonnet::get('slots', [@slots], $cdom, $cnum);
   
       foreach my $slot_name (@slots) {
    next if (!defined($slots{$slot_name}) ||
    !ref($slots{$slot_name}));
    &Apache::lonxml::debug(time." $slot_name ".
          $slots{$slot_name}->{'starttime'}." -- ".
          $slots{$slot_name}->{'startreserve'});
    if ($slots{$slot_name}->{'endtime'} > time &&
       $slots{$slot_name}->{'startreserve'} < time) {
       # between start of reservation times and end of slot
       return($slot_name, $slots{$slot_name});
    }
       }
       return (undef,undef);
   }
   
   sub check_for_conflict {
       my ($symb,$new_slot_name)=@_;
       my $student = &Apache::lonnet::EXT("resource.0.availablestudent", $symb,
          $env{'user.domain'}, $env{'user.name'});
       my $course = &Apache::lonnet::EXT("resource.0.available", $symb,
         $env{'user.domain'}, $env{'user.name'});
       my @slots = (split(/:/,$student), split(/:/, $course));
       my ($cnum,$cdom)=&get_course();
       my %slots=&Apache::lonnet::get('slots', [@slots], $cdom, $cnum);
       foreach my $slot_name (@slots) {
    next if (!defined($slots{$slot_name}) ||
    !ref($slots{$slot_name}));
   
           next if (!defined($slots{$slot_name}->{'uniqueperiod'}) ||
    !ref($slots{$slot_name}->{'uniqueperiod'}));
    my ($start,$end)=@{$slots{$slot_name}->{'uniqueperiod'}};
    if ($start<time && time < $end) {
       return $slot_name;
    }
       }
       return undef;
   
   }
   
 sub make_reservation {  sub make_reservation {
     my ($slot_name,$slot,$symb)=@_;      my ($slot_name,$slot,$symb)=@_;
Line 136  sub make_reservation { Line 192  sub make_reservation {
   
     my (@ids)=&get_reservation_ids($slot_name);      my (@ids)=&get_reservation_ids($slot_name);
   
     # FIXME we could end up having holes...   
     my $last=0;      my $last=0;
     foreach my $id (@ids) {      foreach my $id (@ids) {
  my $num=(split('\0',$id))[1];   my $num=(split('\0',$id))[1];
Line 145  sub make_reservation { Line 200  sub make_reservation {
           
     my $wanted=$last+1;      my $wanted=$last+1;
     &Apache::lonxml::debug("wanted $wanted<br />");      &Apache::lonxml::debug("wanted $wanted<br />");
     if ($wanted >= $max) {      if (scalar(@ids) >= $max) {
  # full up   # full up
  return -1;   return undef;
     }      }
           
     my %reservation=('name'      => $env{'user.name'}.'@'.$env{'user.domain'},      my %reservation=('name'      => $env{'user.name'}.'@'.$env{'user.domain'},
Line 160  sub make_reservation { Line 215  sub make_reservation {
  $cdom, $cnum);   $cdom, $cnum);
   
     if ($success eq 'ok') {      if ($success eq 'ok') {
  #FIXME need to set the parm  
  my $new_value=$slot_name;   my $new_value=$slot_name;
  if ($value) {   if ($value) {
     $new_value=$value.':'.$new_value;      $new_value=$value.':'.$new_value;
Line 178  sub make_reservation { Line 232  sub make_reservation {
     return undef;      return undef;
 }  }
   
   sub release_slot {
       my ($r,$symb,$slot_name,$inhibit_return_link)=@_;
   
       if ($slot_name eq '') { $slot_name=$env{'form.slotname'}; }
       my ($cnum,$cdom)=&get_course();
   
       # get parameter string, check for existance, rebuild string with the slot
          
       my @slots = split(/:/,&Apache::lonnet::EXT("resource.0.availablestudent",
          $symb,$env{'user.domain'},
          $env{'user.name'}));
       my @new_slots;
       foreach my $exist_slot (@slots) {
    if ($exist_slot eq $slot_name) { next; }
    push(@new_slots,$exist_slot);
       }
       my $new_param = join(':',@new_slots);
   
       # get slot reservations, check if user has one, if so remove reservation
       my %consumed=&Apache::lonnet::dump('slot_reservations',$cdom,$cnum,
          "^$slot_name\0");
       foreach my $entry (keys(%consumed)) {
    if ( $consumed{$entry}->{'name'} eq 
        ($env{'user.name'}.'@'.$env{'user.domain'}) ) {
       &Apache::lonnet::del('slot_reservations',[$entry],
    $cdom,$cnum);
    }
       }
       # store new parameter string
       my $result=&Apache::lonparmset::storeparm_by_symb($symb,
         '0_availablestudent',
         1, $new_param, 'string',
         $env{'user.name'},
         $env{'user.domain'});
       my %slot=&Apache::lonnet::get_slot($slot_name);
       my $description=&get_description($env{'form.slotname'},\%slot);
       $r->print("<p>Released Reservation: $description</p>");
       if (!$inhibit_return_link) {
    $r->print('<p><a href="/adm/flip?postdata=return:">'.
     &mt('Return to last resource').'</a></p>');
       }
       return 1;
   }
   
 sub get_slot {  sub get_slot {
     my ($r,$symb)=@_;      my ($r,$symb)=@_;
   
       my $slot_name=&check_for_conflict($symb,$env{'form.slotname'});
       if ($slot_name) {
    my %slot=&Apache::lonnet::get_slot($slot_name);
    my $description1=&get_description($slot_name,\%slot);
    %slot=&Apache::lonnet::get_slot($env{'form.slotname'});
    my $description2=&get_description($env{'form.slotname'},\%slot);
    $r->print("<p>Already have a reservation: $description1</p>");
    if ($slot_name ne $env{'form.slotname'}) {
       $r->print(<<STUFF);
   <form method="POST" action="/adm/slotrequest">
      <input type="hidden" name="symb" value="$env{'form.symb'}" />
      <input type="hidden" name="slotname" value="$env{'form.slotname'}" />
      <input type="hidden" name="releaseslot" value="$slot_name" />
      <input type="hidden" name="command" value="change" />
   STUFF
               $r->print("<p>You can either ");
       $r->print(<<STUFF);
      <input type="submit" name="change" value="Change" />
   STUFF
       $r->print(' your reservation from <b>'.$description1.'</b> to <b>'.
         $description2.
         '</b> <br />or <a href="/adm/flip?postdata=return:">'.
         &mt('Return to last resource').'</a></p>');
       $r->print(<<STUFF);
   </form>
   STUFF
           } else {
       $r->print('<p><a href="/adm/flip?postdata=return:">'.
         &mt('Return to last resource').'</a></p>');
    }
    return;
       }
     my %slot=&Apache::lonnet::get_slot($env{'form.slotname'});      my %slot=&Apache::lonnet::get_slot($env{'form.slotname'});
     my $reserved=&make_reservation($env{'form.slotname'},      my $reserved=&make_reservation($env{'form.slotname'},
    \%slot,$symb);     \%slot,$symb);
     my $description=&get_description($env{'form.slotname'},\%slot);      my $description=&get_description($env{'form.slotname'},\%slot);
     if ($reserved > -1) {      if (defined($reserved)) {
  $r->print("<p>Success: $description</p>");   if ($reserved > -1) {
  $r->print('<p><a href="/adm/flip?postdata=return:">'.      $r->print("<p>Success: $description</p>");
   &mt('Return to last resource').'</a></p>');      $r->print('<p><a href="/adm/flip?postdata=return:">'.
  return;        &mt('Return to last resource').'</a></p>');
     } elsif ($reserved < 0) {      return;
  $r->print("<p>Already reserved: $description</p>");   } elsif ($reserved < 0) {
  $r->print('<p><a href="/adm/flip?postdata=return:">'.      $r->print("<p>Already reserved: $description</p>");
   &mt('Return to last resource').'</a></p>');      $r->print('<p><a href="/adm/flip?postdata=return:">'.
  return;        &mt('Return to last resource').'</a></p>');
       return;
    }
     }      }
   
     my %lt=('request'=>"Request another attempt",      my %lt=('request'=>"Availibility list",
     'try'    =>'Try again');      'try'    =>'Try again');
     %lt=&Apache::lonlocal::texthash(%lt);      %lt=&Apache::lonlocal::texthash(%lt);
   
Line 230  sub allowed_slot { Line 362  sub allowed_slot {
     my ($slot_name,$slot,$symb)=@_;      my ($slot_name,$slot,$symb)=@_;
     #already started      #already started
     if ($slot->{'starttime'} < time) {      if ($slot->{'starttime'} < time) {
  return 0;   # all open slot to be schedulable
    #return 0;
     }      }
       &Apache::lonxml::debug("$slot_name starttime good");
     #already ended      #already ended
     if ($slot->{'endtime'} < time) {      if ($slot->{'endtime'} < time) {
  return 0;   return 0;
     }      }
       &Apache::lonxml::debug("$slot_name endtime good");
     # not allowed to pick this one      # not allowed to pick this one
     if (defined($slot->{'type'})      if (defined($slot->{'type'})
  && $slot->{'type'} ne 'schedulable_student') {   && $slot->{'type'} ne 'schedulable_student') {
  return 0;   return 0;
     }      }
       &Apache::lonxml::debug("$slot_name type good");
     # not allowed for this resource      # not allowed for this resource
     if (defined($slot->{'symb'})      if (defined($slot->{'symb'})
  && $slot->{'symb'} ne $symb) {   && $slot->{'symb'} ne $symb) {
  return 0;   return 0;
     }      }
       &Apache::lonxml::debug("$slot_name symb good");
     return 1;      return 1;
 }  }
   
Line 257  sub get_description { Line 390  sub get_description {
     my ($slot_name,$slot)=@_;      my ($slot_name,$slot)=@_;
     my $description=$slot->{'description'};      my $description=$slot->{'description'};
     if (!defined($description)) {      if (!defined($description)) {
  $description=&mt('[_1] From [_2] to [_3]',$slot,   $description=&mt('[_1] From [_2] to [_3]',$slot_name,
  &Apache::lonlocal::locallocaltime($slot->{'starttime'}),   &Apache::lonlocal::locallocaltime($slot->{'starttime'}),
  &Apache::lonlocal::locallocaltime($slot->{'endtime'}));   &Apache::lonlocal::locallocaltime($slot->{'endtime'}));
     }      }
Line 271  sub show_choices { Line 404  sub show_choices {
     my %slots=&Apache::lonnet::dump('slots',$cdom,$cnum);      my %slots=&Apache::lonnet::dump('slots',$cdom,$cnum);
     my $available;      my $available;
     $r->print('<table border="1">');      $r->print('<table border="1">');
       &Apache::lonxml::debug("Checking Slots");
       my ($got_slot)=&check_for_reservation($symb);
     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)))  {
   
    &Apache::lonxml::debug("Checking Slot $slot");
  next if (!&allowed_slot($slot,$slots{$slot}));   next if (!&allowed_slot($slot,$slots{$slot}));
   
  $available++;   $available++;
Line 282  sub show_choices { Line 418  sub show_choices {
  my $description=&get_description($slot,$slots{$slot});   my $description=&get_description($slot,$slots{$slot});
   
  my $form=&mt('Unavailable');   my $form=&mt('Unavailable');
  if (&space_available($slot,$slots{$slot},$symb)) {   if (($slot eq $got_slot) ||
       &space_available($slot,$slots{$slot},$symb)) {
       my $text=&mt('Select');
       my $command='get';
       if ($slot eq $got_slot) {
    $text=&mt('Free Reservation');
    $command='release';
       }
     my $escsymb=&Apache::lonnet::escape($symb);      my $escsymb=&Apache::lonnet::escape($symb);
     $form=<<STUFF;      $form=<<STUFF;
    <form method="POST" action="/adm/slotrequest">     <form method="POST" action="/adm/slotrequest">
      <input type="submit" name="Select" value="Select" />       <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="get" />       <input type="hidden" name="command" value="$command" />
    </form>     </form>
 STUFF  STUFF
  }   }
Line 302  STUFF Line 445  STUFF
     }      }
   
     if (!$available) {      if (!$available) {
  $r->print('<tr><td>No avaliable times. <a href="/adm/flip?postdata=return:">'.   $r->print('<tr><td>No available times. <a href="/adm/flip?postdata=return:">'.
   &mt('Return to last resource').'</a></td></tr>');    &mt('Return to last resource').'</a></td></tr>');
     }      }
     $r->print('</table>');      $r->print('</table>');
 }  }
   
   sub show_table {
       my ($r,$symb,$mgr)=@_;
   
       my ($cnum,$cdom)=&get_course();
       my %slots=&Apache::lonnet::dump('slots',$cdom,$cnum);
       my $available;
       if ($mgr eq 'F') {
    $r->print('<form method="POST" action="/adm/slotrequest">
   <input type="hidden" name="command" value="uploadstart" />
   <input type="hidden" name="symb" value="'.$env{'form.symb'}.'" />
   <input type="submit" name="start" value="'.&mt('Upload Slot List').'" />
   </form>');
       }
       $r->print('<table border="1">
   <tr>
     <th>Slot name</th>
     <th>Type</th>
     <th>Description</th>
     <th>Start Time</th>
     <th>End Time</th>
     <th>Max space</th>
     <th>Scheduled Students</th>
     <th>Proctors</th>
     <th>Unique Period</th>
   </tr>');
       foreach my $slot (sort 
         { return $slots{$a}->{'starttime'} <=> $slots{$b}->{'starttime'} }
         (keys(%slots)))  {
    if (defined($slots{$slot}->{'type'})
       && $slots{$slot}->{'type'} ne 'schedulable_student') {
       #next;
    }
    my $description=&get_description($slot,$slots{$slot});
    my %consumed=&Apache::lonnet::dump('slot_reservations',$cdom,$cnum,
      "^$slot\0");
    my $ids;
    foreach my $entry (sort(keys(%consumed))) {
       my (undef,$id)=split("\0",$entry);
       $ids.= $id.'-> '.$consumed{$entry}->{'name'}.'<br />';
    }
    my $start=localtime($slots{$slot}->{'starttime'});
    my $end=localtime($slots{$slot}->{'endtime'});
    my $unique;
    if (ref($slots{$slot}{'uniqueperiod'})) {
       $unique=localtime($slots{$slot}{'uniqueperiod'}[0]).','.
    localtime($slots{$slot}{'uniqueperiod'}[1]);
    }
   
    $r->print(<<STUFF);
   <tr>
    <td>$slot</td>
    <td>$slots{$slot}->{'type'}</td>
    <td>$description</td>
    <td>$start</td>
    <td>$end</td>
    <td>$slots{$slot}->{'maxspace'}</td>
    <td>$ids</td>
    <td>$slots{$slot}->{'proctor'}</td>
    <td>$unique</td>
   </tr>
   STUFF
       }
       $r->print('</table>');
   }
   
   sub upload_start {
       my ($r,$symb)=@_;    
       $r->print(&Apache::grades::checkforfile_js());
       my $result.='<table width=100% border=0><tr bgcolor="#e6ffff"><td>'."\n";
       $result.='&nbsp;<b>'.
    &mt('Specify a file containing the slot definitions.').
    '</b></td></tr>'."\n";
       $result.='<tr bgcolor=#ffffe6><td>'."\n";
       my $upfile_select=&Apache::loncommon::upfile_select_html();
       my $ignore=&mt('Ignore First Line');
       $result.=<<ENDUPFORM;
   <form method="post" enctype="multipart/form-data" action="/adm/slotrequest" name="slotupload">
   <input type="hidden" name="symb" value="$symb" />
   <input type="hidden" name="command" value="csvuploadmap" />
   $upfile_select
   <br /><input type="button" onClick="javascript:checkUpload(this.form);" value="Upload Data" />
   <label><input type="checkbox" name="noFirstLine" />$ignore</label>
   </form>
   ENDUPFORM
       $result.='</td></tr></table>'."\n";
       $result.='</td></tr></table>'."\n";
       $r->print($result);
   }
   
   sub csvuploadmap_header {
       my ($r,$symb,$datatoken,$distotal)= @_;
       my $javascript;
       if ($env{'form.upfile_associate'} eq 'reverse') {
    $javascript=&csvupload_javascript_reverse_associate();
       } else {
    $javascript=&csvupload_javascript_forward_associate();
       }
   
       my $checked=(($env{'form.noFirstLine'})?' checked="checked"':'');
       my $ignore=&mt('Ignore First Line');
       $r->print(<<ENDPICK);
   <form method="post" enctype="multipart/form-data" action="/adm/slotrequest" name="slotupload">
   <h3>Identify fields</h3>
   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
   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);" />
   <label><input type="checkbox" name="noFirstLine" $checked />$ignore</label>
   <input type="hidden" name="associate"  value="" />
   <input type="hidden" name="datatoken"  value="$datatoken" />
   <input type="hidden" name="fileupload" value="$env{'form.fileupload'}" />
   <input type="hidden" name="upfiletype" value="$env{'form.upfiletype'}" />
   <input type="hidden" name="upfile_associate" 
                                          value="$env{'form.upfile_associate'}" />
   <input type="hidden" name="symb"       value="$symb" />
   <input type="hidden" name="command"    value="csvuploadassign" />
   <hr />
   <script type="text/javascript" language="Javascript">
   $javascript
   </script>
   ENDPICK
       return '';
   
   }
   
   sub csvuploadmap_footer {
       my ($request,$i,$keyfields) =@_;
       $request->print(<<ENDPICK);
   </table>
   <input type="hidden" name="nfields" value="$i" />
   <input type="hidden" name="keyfields" value="$keyfields" />
   <input type="button" onClick="javascript:verify(this.form)" value="Create Slots" /><br />
   </form>
   ENDPICK
   }
   
   sub csvupload_javascript_reverse_associate {
       my $error1=&mt('You need to specify the name, starttime, endtime and a type');
       return(<<ENDPICK);
     function verify(vf) {
       var foundstart=0;
       var foundend=0;
       var foundname=0;
       var foundtype=0;
       for (i=0;i<=vf.nfields.value;i++) {
         tw=eval('vf.f'+i+'.selectedIndex');
         if (i==0 && tw!=0) { foundname=1; }
         if (i==1 && tw!=0) { foundtype=1; }
         if (i==2 && tw!=0) { foundstat=1; }
         if (i==3 && tw!=0) { foundend=1; }
       }
       if (foundstart==0 && foundend==0 && foundtype==0 && foundname==0) {
    alert('$error1');
    return;
       }
       vf.submit();
     }
     function flip(vf,tf) {
     }
   ENDPICK
   }
   
   sub csvupload_javascript_forward_associate {
       my $error1=&mt('You need to specify the name, starttime, endtime and a type');
     return(<<ENDPICK);
     function verify(vf) {
       var foundstart=0;
       var foundend=0;
       var foundname=0;
       var foundtype=0;
       for (i=0;i<=vf.nfields.value;i++) {
         tw=eval('vf.f'+i+'.selectedIndex');
         if (tw==1) { foundname=1; }
         if (tw==2) { foundtype=1; }
         if (tw==3) { foundstat=1; }
         if (tw==4) { foundend=1; }
       }
       if (foundstart==0 && foundend==0 && foundtype==0 && foundname==0) {
    alert('$error1');
    return;
       }
       vf.submit();
     }
     function flip(vf,tf) {
     }
   ENDPICK
   }
   
   sub csv_upload_map {
       my ($r,$symb)= @_;
   
       my $datatoken;
       if (!$env{'form.datatoken'}) {
    $datatoken=&Apache::loncommon::upfile_store($r);
       } else {
    $datatoken=$env{'form.datatoken'};
    &Apache::loncommon::load_tmp_file($r);
       }
       my @records=&Apache::loncommon::upfile_record_sep();
       if ($env{'form.noFirstLine'}) { shift(@records); }
       &csvuploadmap_header($r,$symb,$datatoken,$#records+1);
       my ($i,$keyfields);
       if (@records) {
    my @fields=&csvupload_fields();
   
    if ($env{'form.upfile_associate'} eq 'reverse') {
       &Apache::loncommon::csv_print_samples($r,\@records);
       $i=&Apache::loncommon::csv_print_select_table($r,\@records,
     \@fields);
       foreach (@fields) { $keyfields.=$_->[0].','; }
       chop($keyfields);
    } else {
       unshift(@fields,['none','']);
       $i=&Apache::loncommon::csv_samples_select_table($r,\@records,
       \@fields);
       my %sone=&Apache::loncommon::record_sep($records[0]);
       $keyfields=join(',',sort(keys(%sone)));
    }
       }
       &csvuploadmap_footer($r,$i,$keyfields);
   
       return '';
   }
   
   sub csvupload_fields {
       return (['name','Slot name'],
       ['type','Type of slot'],
       ['starttime','Start Time of slot'],
       ['endtime','End Time of slot'],
       ['startreserve','Reservation Start Time'],
       ['ip','IP or DNS restriction'],
       ['proctor','List of proctor ids'],
       ['description','Slot Description'],
       ['maxspace','Maximum number of reservations'],
       ['symb','Resource Restriction'],
       ['uniqueperiod','Date range of slot exclusion'],
       ['secret','Secret word proctor uses to validate']);
   }
   
   sub csv_upload_assign {
       my ($r,$symb,$mgr)= @_;
       &Apache::loncommon::load_tmp_file($r);
       my @slotdata = &Apache::loncommon::upfile_record_sep();
       if ($env{'form.noFirstLine'}) { shift(@slotdata); }
       my %fields=&Apache::grades::get_fields();
       $r->print('<h3>Creating Slots</h3>');
       my $cname=$env{'course.'.$env{'request.course.id'}.'.num'};
       my $cdom=$env{'course.'.$env{'request.course.id'}.'.domain'};
       my $countdone=0;
       foreach my $slot (@slotdata) {
    my %slot;
    my %entries=&Apache::loncommon::record_sep($slot);
    my $domain;
    my $name=$entries{$fields{'name'}};
    if ($entries{$fields{'type'}}) {
       $slot{'type'}=$entries{$fields{'type'}};
    } else {
       $slot{'type'}='preassigned';
    }
    if ($entries{$fields{'starttime'}}) {
       $slot{'starttime'}=&UnixDate($entries{$fields{'starttime'}},"%s");
    }
    if ($entries{$fields{'endtime'}}) {
       $slot{'endtime'}=&UnixDate($entries{$fields{'endtime'}},"%s");
    }
    foreach my $key ('ip','proctor','description','maxspace',
    'secret','symb') {
       if ($entries{$fields{$key}}) {
    $slot{$key}=$entries{$fields{$key}};
       }
    }
    if ($entries{$fields{'uniqueperiod'}}) {
       my ($start,$end)=split(',',$entries{$fields{'uniqueperiod'}});
       my @times=(&UnixDate($start,"%s"),
          &UnixDate($end,"%s"));
       $slot{'uniqueperiod'}=\@times;
    }
   
    &Apache::lonnet::cput('slots',{$name=>\%slot},$cdom,$cname);
    $r->print('.');
    $r->rflush();
    $countdone++;
       }
       $r->print("<br />Created $countdone slots\n");
       $r->print("<br />\n");
       &show_table($r,$symb,$mgr);
       return '';
   }
   
 sub handler {  sub handler {
     my $r=shift;      my $r=shift;
   
       &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'});
     &start_page($r);      &start_page($r);
     my $symb=&Apache::lonnet::unescape($env{'form.symb'});      my $symb=&Apache::lonnet::unescape($env{'form.symb'});
     my (undef,undef,$res)=&Apache::lonnet::decode_symb($symb);      my (undef,undef,$res)=&Apache::lonnet::decode_symb($symb);
Line 318  sub handler { Line 751  sub handler {
  &fail($r,'not_valid');   &fail($r,'not_valid');
  return OK;   return OK;
     }      }
           $env{'request.symb'}=$symb;
     if ($env{'form.requestattempt'}) {      my $vgr=&Apache::lonnet::allowed('vgr',$env{'request.course.id'});
  &show_choices($r,$symb);      my $mgr=&Apache::lonnet::allowed('mgr',$env{'request.course.id'});
     } elsif ($env{'form.command'} eq 'get') {      if ($env{'form.command'} eq 'showslots' && $vgr eq 'F') {
  &get_slot($r,$symb);   &show_table($r,$symb,$mgr);
       } elsif ($env{'form.command'} eq 'uploadstart' && $mgr eq 'F') {
    &upload_start($r,$symb);
       } elsif ($env{'form.command'} eq 'csvuploadmap' && $mgr eq 'F') {
    &csv_upload_map($r,$symb);
       } elsif ($env{'form.command'} eq 'csvuploadassign' && $mgr eq 'F') {
    if ($env{'form.associate'} ne 'Reverse Association') {
       &csv_upload_assign($r,$symb,$mgr);
    } else {
       if ( $env{'form.upfile_associate'} ne 'reverse' ) {
    $env{'form.upfile_associate'} = 'reverse';
       } else {
    $env{'form.upfile_associate'} = 'forward';
       }
       &csv_upload_map($r,$symb);
    }
       } else {
    my ($status) = &Apache::lonhomework::check_task_access('0');
    if ($status eq 'CAN_ANSWER' ||
       $status eq 'NEEDS_CHECKIN' ||
       $status eq 'WAITING_FOR_GRADE') {
       &fail($r,'not_allowed');
       return OK;
    }
    if ($env{'form.requestattempt'}) {
       &show_choices($r,$symb);
    } elsif ($env{'form.command'} eq 'release') {
       &release_slot($r,$symb);
    } elsif ($env{'form.command'} eq 'get') {
       &get_slot($r,$symb);
    } elsif ($env{'form.command'} eq 'change') {
       &release_slot($r,$symb,$env{'form.releaseslot'},1);
       &get_slot($r,$symb);
    } else {
       $r->print("<p>Unknown command: ".$env{'form.command'}."</p>");
    }
     }      }
     &end_page($r);      &end_page($r);
     return OK;      return OK;

Removed from v.1.3  
changed lines
  Added in v.1.18


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>
500 Internal Server Error

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.