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