--- loncom/interface/slotrequest.pm	2006/05/12 05:12:27	1.61
+++ loncom/interface/slotrequest.pm	2006/10/31 15:58:41	1.68.2.2
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Handler for requesting to have slots added to a students record
 #
-# $Id: slotrequest.pm,v 1.61 2006/05/12 05:12:27 albertel Exp $
+# $Id: slotrequest.pm,v 1.68.2.2 2006/10/31 15:58:41 albertel Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -36,6 +36,8 @@ use Apache::lonlocal;
 use Apache::lonnet;
 use Apache::lonnavmaps();
 use Date::Manip;
+use lib '/home/httpd/lib/perl/';
+use LONCAPA;
 
 sub fail {
     my ($r,$code)=@_;
@@ -88,7 +90,7 @@ sub get_reservation_ids {
 
     my %consumed=&Apache::lonnet::dump('slot_reservations',$cdom,$cnum,
 				       "^$slot_name\0");
-    if (&network_error(%consumed)) { 
+    if (&Apache::lonnet::error(%consumed)) { 
 	return 'error: Unable to determine current status';
     }
     my ($tmp)=%consumed;
@@ -125,8 +127,9 @@ sub check_for_reservation {
     my ($cnum,$cdom)=&get_course();
     my %slots=&Apache::lonnet::get('slots', [@slots], $cdom, $cnum);
 
-    if (&network_error($student) || &network_error($course)  ||
-	&network_error(%slots)) {
+    if (&Apache::lonnet::error($student) 
+	|| &Apache::lonnet::error($course)
+	|| &Apache::lonnet::error(%slots)) {
 	return 'error: Unable to determine current status';
     }    
     my @got;
@@ -173,7 +176,8 @@ sub get_consumed_uniqueperiods {
 	my $course =  &Apache::lonnet::EXT("resource.0.available",
 					   $symb, $env{'user.domain'},
 					   $env{'user.name'});
-	if (&network_error($student) || &network_error($course)) {
+	if (&Apache::lonnet::error($student) 
+	    || &Apache::lonnet::error($course)) {
 	    return 'error: Unable to determine current status';
 	}
 	foreach my $slot (split(/:/,$student), split(/:/, $course)) {
@@ -184,7 +188,7 @@ sub get_consumed_uniqueperiods {
     if (!ref($slots)) {
 	my ($cnum,$cdom)=&get_course();
 	my %slots=&Apache::lonnet::get('slots', [keys(%used_slots)], $cdom, $cnum);
-	if (&network_error(%slots)) {
+	if (&Apache::lonnet::error(%slots)) {
 	    return 'error: Unable to determine current status';
 	}
 	$slots = \%slots;
@@ -210,7 +214,7 @@ sub check_for_conflict {
 
     if (!ref($consumed_uniqueperiods)) {
 	$consumed_uniqueperiods = &get_consumed_uniqueperiods($slots);
-	if (&network_error(%$consumed_uniqueperiods)) {
+	if (&Apache::lonnet::error(%$consumed_uniqueperiods)) {
 	    return 'error: Unable to determine current status';
 	}
     }
@@ -228,14 +232,6 @@ sub check_for_conflict {
 
 }
 
-sub network_error {
-    my ($result) = @_;
-    if ($result =~ /^(con_lost|no_such_host|error: [^2])/) {
-	return 1;
-    }
-    return 0;
-}
-
 sub make_reservation {
     my ($slot_name,$slot,$symb)=@_;
 
@@ -248,13 +244,14 @@ sub make_reservation {
     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)) { 
+    if (&Apache::lonnet::error($value) 
+	|| &Apache::lonnet::error($use_slots)) { 
 	return 'error: Unable to determine current status';
     }
 
     my $parm_symb  = $symb;
     my $parm_level = 1;
-    if ($use_slots eq 'map') {
+    if ($use_slots eq 'map' || $use_slots eq 'map_map') {
 	my ($map) = &Apache::lonnet::decode_symb($symb);
 	$parm_symb = &Apache::lonnet::symbread($map);
 	$parm_level = 2;
@@ -264,7 +261,7 @@ sub make_reservation {
 	if ($other_slot eq $slot_name) {
 	    my %consumed=&Apache::lonnet::dump('slot_reservations', $cdom,
 					       $cnum, "^$slot_name\0");   
-	    if (&network_error($value)) { 
+	    if (&Apache::lonnet::error($value)) { 
 		return 'error: Unable to determine current status';
 	    }
 	    my $me=$env{'user.name'}.':'.$env{'user.domain'};
@@ -281,7 +278,7 @@ sub make_reservation {
     if (!defined($max)) { $max=99999; }
 
     my (@ids)=&get_reservation_ids($slot_name);
-    if (&network_error(@ids)) { 
+    if (&Apache::lonnet::error(@ids)) { 
 	return 'error: Unable to determine current status';
     }
     my $last=0;
@@ -336,7 +333,7 @@ sub remove_registration {
     my ($cnum,$cdom)=&get_course();
     my %consumed=&Apache::lonnet::dump('slot_reservations',$cdom,$cnum,
 				       "^$slot_name\0");
-    if (&network_error(%consumed)) {
+    if (&Apache::lonnet::error(%consumed)) {
 	$r->print("<p>".&mt('A network error has occured.').'</p>');
 	return;
     }
@@ -383,13 +380,13 @@ sub remove_registration_confirmation {
 					 'no'  => 'No',);
     $r->print(<<"END_CONFIRM");
 <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="button" value="yes" />
     $hidden_input
     <input type="submit" value="$lt{'yes'}" />
 </form>
-<form action="/adm/slotrequest" method="POST">
+<form action="/adm/slotrequest" method="post">
     <input type="hidden" name="command" value="showslots" />
     <input type="submit" value="$lt{'no'}" />
 </form>
@@ -436,7 +433,7 @@ sub release_slot {
 
     if ($mgr eq 'F' 
 	&& defined($env{'form.symb'})) {
-	$symb = $env{'form.symb'};
+	$symb = &unescape($env{'form.symb'});
     }
 
     my ($result,$msg) =
@@ -488,12 +485,12 @@ sub release_reservation {
     my $use_slots = &Apache::lonnet::EXT("resource.0.useslots");
     &Apache::lonxml::debug("use_slots is  $use_slots<br />");
 
-    if (&network_error($use_slots)) { 
+    if (&Apache::lonnet::error($use_slots)) { 
 	return (0,'error: Unable to determine current status');
     }
 
     my $parm_level = 1;
-    if ($use_slots eq 'map') {
+    if ($use_slots eq 'map' || $use_slots eq 'map_map') {
 	$parm_level = 2;
     }
     # store new parameter string
@@ -569,7 +566,7 @@ sub get_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">
+<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" />
@@ -614,7 +611,7 @@ STUFF
     $r->print(<<STUFF);
 <p> <font color="red">Failed</font> to reserve a spot for $description. </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="hidden" name="symb" value="$env{'form.symb'}" />
    <input type="hidden" name="slotname" value="$env{'form.slotname'}" />
@@ -624,7 +621,7 @@ STUFF
 </p>
 <p>
 or
-<form method="POST" action="/adm/slotrequest">
+<form method="post" action="/adm/slotrequest">
     <input type="hidden" name="symb" value="$env{'form.symb'}" />
     <input type="submit" name="requestattempt" value="$lt{'request'}" />
 </form>
@@ -678,6 +675,16 @@ sub allowed_slot {
 		    split(',',$slot->{'allowedsections'}))) {
 	    $userallowed=1;
 	}
+	if (defined($env{'request.course.groups'})) {
+	    my @groups = split(/:/,$env{'request.course.groups'});
+	    my @allowed_sec = split(',',$slot->{'allowedsections'});
+	    foreach my $group (@groups) {
+		if (grep {$_ eq $group} (@allowed_sec)) {
+		    $userallowed=1;
+		    last;
+		}
+	    }
+	}
     }
     &Apache::lonxml::debug("$slot_name sections is $userallowed");
 
@@ -752,7 +759,7 @@ sub show_choices {
 	    my $text=&mt('Select');
 	    my $command='get';
 	    if (grep(/^\Q$slot\E$/,@got_slots)) {
-		$text=&mt('Free Reservation');
+		$text=&mt('Drop Reservation');
 		$command='release';
 	    } else {
 		my $conflict = &check_for_conflict($symb,$slot,$slots{$slot},
@@ -763,9 +770,9 @@ sub show_choices {
 		    $command='get';
 		}
 	    }
-	    my $escsymb=&Apache::lonnet::escape($symb);
+	    my $escsymb=&escape($symb);
 	    $form=<<STUFF;
-   <form method="POST" action="/adm/slotrequest">
+   <form method="post" action="/adm/slotrequest">
      <input type="submit" name="Select" value="$text" />
      <input type="hidden" name="symb" value="$escsymb" />
      <input type="hidden" name="slotname" value="$slot" />
@@ -862,14 +869,14 @@ sub remove_link {
 	undef($udom);
     }
 
-    $slotname  = &Apache::lonnet::escape($slotname);
-    $entry     = &Apache::lonnet::escape($entry);
-    $uname     = &Apache::lonnet::escape($uname);
-    $udom      = &Apache::lonnet::escape($udom);
-    $symb      = &Apache::lonnet::escape($symb);
+    $slotname  = &escape($slotname);
+    $entry     = &escape($entry);
+    $uname     = &escape($uname);
+    $udom      = &escape($udom);
+    $symb      = &escape($symb);
 
     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>
 END_LINK
 
@@ -886,11 +893,11 @@ sub show_table {
     my $available;
     if ($mgr eq 'F') {
 	$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="submit" name="start" value="'.&mt('Upload Slot List').'" />
 </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').'" />
 </form>');
 	$r->print('</div>');
@@ -977,13 +984,16 @@ sub show_table {
     my $name_filter = {'type'  => $name_filter_type,
 		       'value' => $env{'form.name_filter_value'},};
 
+    
     #deleted slot filtering
+    #default to hide if no value
+    $env{'form.deleted'} ||= 'hide';
     my $hide_radio = 
 	&Apache::lonhtmlcommon::radio('deleted',$env{'form.deleted'},'hide');
     my $show_radio = 
 	&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" />');
     $r->print('<div>');
     $r->print('<table class="inline">
@@ -1026,14 +1036,15 @@ sub show_table {
     $r->print('</div>');
     $r->print('<p><input type="submit" name="start" value="'.&mt('Update Display').'" /></p>');
     my $linkstart='<a href="/adm/slotrequest?command=showslots&amp;order=';
-    $r->print('<table class="thinborder">
-<tr>
-  <th></th>');
+    $r->print(&Apache::loncommon::start_data_table().
+	      &Apache::loncommon::start_data_table_header_row().'
+	       <th></th>');
     foreach my $which (@show_order) {
 	if ($which ne 'proctor' && exists($show{$which})) {
 	    $r->print('<th>'.$linkstart.$which.'">'.$show_fields{$which}.'</a></th>');
 	}
     }
+    $r->print(&Apache::loncommon::end_data_table_header_row());
 
     my %name_cache;
     my $slotsort = sub {
@@ -1106,7 +1117,7 @@ sub show_table {
 	
 	my $unique;
 	if (ref($slots{$slot}{'uniqueperiod'})) {
-	    $unique=localtime($slots{$slot}{'uniqueperiod'}[0]).','.
+	    $unique=localtime($slots{$slot}{'uniqueperiod'}[0]).', '.
 		localtime($slots{$slot}{'uniqueperiod'}[1]);
 	}
 
@@ -1147,7 +1158,7 @@ sub show_table {
 	if (exists($show{'proctor'})) {
 	    $rowspan=2;
 	    @proctors= map {
-		my ($uname,$udom)=split(/@/,$_);
+		my ($uname,$udom)=split(/:/,$_);
 		my $fullname=$name_cache{$_};
 		if (!defined($fullname)) {
 		    $fullname = &Apache::loncommon::plainname($uname,$udom);
@@ -1164,7 +1175,7 @@ sub show_table {
 EDITLINK
 
 	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
 
         my $remove_all=&remove_link($slot,'remove all').'<br />';
@@ -1175,7 +1186,10 @@ DELETELINK
 	    undef($remove_all);
 	}
 
-        $r->print("<tr>\n<td rowspan=\"$rowspan\">$edit $delete</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'})) {
 	    $colspan++;$r->print("<td>$slot</td>");
 	}
@@ -1212,18 +1226,22 @@ DELETELINK
 	if (exists($show{'allowedusers'})) {
 	    $colspan++;$r->print("<td>$allowedusers</td>\n");
 	}
+	if (exists($show{'uniqueperiod'})) {
+	    $colspan++;$r->print("<td>$unique</td>\n");
+	}
 	if (exists($show{'scheduled'})) {
-	    $colspan++;$r->print("<td>$remove_all $ids</td>\n</tr>\n");
+	    $colspan++;$r->print("<td>$remove_all $ids</td>\n");
 	}
+	$r->print("$row_end\n");
 	if (exists($show{'proctor'})) {
 	    $r->print(<<STUFF);
-<tr>
+$row_start
  <td colspan="$colspan">$proctors</td>
-</tr>
+$row_end
 STUFF
         }
     }
-    $r->print('</table>');
+    $r->print('</table></form>');
 }
 
 sub upload_start {
@@ -1550,14 +1568,16 @@ sub handler {
 	    &csv_upload_map($r);
 	}
     } 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 $useslots = &Apache::lonnet::EXT("resource.0.useslots",$symb);
-	if ($useslots ne 'resource' && $useslots ne 'map') {
+	if ($useslots ne 'resource' 
+	    && $useslots ne 'map' 
+	    && $useslots ne 'map_map') {
 	    &fail($r,'not_available');
 	    return OK;
 	}