'
+ .&mt('No slots have been created in this '.lc($crstype).'.')
+ .'
'
+ );
+ return;
+ }
+
my %Saveable_Parameters = ('show' => 'array',
'when' => 'scalar',
'order' => 'scalar',
@@ -1005,18 +1754,26 @@ sub show_table {
'starttime' => 'Start time',
'endtime' => 'End Time',
'startreserve' => 'Time students can start reserving',
+ 'endreserve' => 'Time students can no longer reserve',
+ 'reservationmsg' => 'Message triggered by reservation',
'secret' => 'Secret Word',
'space' => '# of students/max',
'ip' => 'IP or DNS restrictions',
- 'symb' => 'Resource slot is restricted to.',
+ 'symb' => 'Resource(s)/Map(s) slot is restricted to.',
'allowedsections' => 'Sections slot is restricted to.',
'allowedusers' => 'Users slot is restricted to.',
'uniqueperiod' => 'Period of time slot is unique',
'scheduled' => 'Scheduled Students',
- 'proctor' => 'List of proctors');
+ 'proctor' => 'List of proctors',
+ 'iptied' => 'Unique IP each student',);
+ if ($crstype eq 'Community') {
+ $show_fields{'startreserve'} = &mt('Time members can start reserving');
+ $show_fields{'endreserve'} = &mt('Time members can no longer reserve');
+ $show_fields{'scheduled'} = &mt('Scheduled Members');
+ }
my @show_order=('name','description','type','starttime','endtime',
- 'startreserve','secret','space','ip','symb',
- 'allowedsections','allowedusers','uniqueperiod',
+ 'startreserve','endreserve','reservationmsg','secret','space',
+ 'ip','iptied','symb','allowedsections','allowedusers','uniqueperiod',
'scheduled','proctor');
my @show =
(exists($env{'form.show'})) ? &Apache::loncommon::get_env_multiple('form.show')
@@ -1063,7 +1820,7 @@ 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';
@@ -1082,31 +1839,31 @@ sub show_table {
'.&Apache::loncommon::multiple_select_form('show',\@show,6,\%show_fields,\@show_order).
' |
-
+ |
'.&Apache::loncommon::multiple_select_form('studisplay',\@stu_display,
6,\%stu_display_fields,
\@stu_display_order).'
|
- '.&Apache::loncommon::select_form($when,'when',%when_fields).
+ | '.&Apache::loncommon::select_form($when,'when',\%when_fields).
' |
- '.&Apache::loncommon::select_form($name_filter_type,
+ | '.&Apache::loncommon::select_form($name_filter_type,
'name_filter_type',
- %name_filter_type_fields).
+ \%name_filter_type_fields).
' '.
&Apache::lonhtmlcommon::textbox('name_filter_value',
$env{'form.name_filter_value'},
15).
' |
-
+ |
- Deleted slots: |
- |
+ '.&mt('Deleted slots:').' |
+ |
- |
+ |
|
@@ -1115,19 +1872,20 @@ sub show_table {
$r->print('');
$r->print('');
my $linkstart=''.$show_fields{$which}.'');
+ $tableheader .= ''.$linkstart.$which.'">'.$show_fields{$which}.' | ';
}
}
- $r->print(&Apache::loncommon::end_data_table_header_row());
+ $tableheader .= &Apache::loncommon::end_data_table_header_row();
+ my $shownheader = 0;
my %name_cache;
my $slotsort = sub {
- if ($env{'form.order'}=~/^(type|description|endtime|startreserve|ip|symb|allowedsections|allowedusers)$/) {
+ if ($env{'form.order'}=~/^(type|description|endtime|startreserve|endreserve|ip|symb|allowedsections|allowedusers|reservationmsg)$/) {
if (lc($slots{$a}->{$env{'form.order'}})
ne lc($slots{$b}->{$env{'form.order'}})) {
return (lc($slots{$a}->{$env{'form.order'}})
@@ -1142,7 +1900,7 @@ sub show_table {
return lc($a) cmp lc($b);
}
} elsif ($env{'form.order'} eq 'uniqueperiod') {
-
+
if ($slots{$a}->{'uniqueperiod'}[0]
ne $slots{$b}->{'uniqueperiod'}[0]) {
return ($slots{$a}->{'uniqueperiod'}[0]
@@ -1164,16 +1922,19 @@ sub show_table {
if ($tmp =~ /^error: /) { undef(%consumed); }
}
+ my %msgops = &slot_reservationmsg_options();
+
foreach my $slot (sort $slotsort (keys(%slots))) {
if (!&to_show($slot,$slots{$slot},$when,
$env{'form.deleted'},$name_filter)) { next; }
+ my $reservemsg;
if (defined($slots{$slot}->{'type'})
- && $slots{$slot}->{'type'} ne 'schedulable_student') {
- #next;
+ && $slots{$slot}->{'type'} eq 'schedulable_student') {
+ $reservemsg = $msgops{$slots{$slot}->{'reservationmsg'}};
}
my $description=&get_description($slot,$slots{$slot});
my ($id_count,$ids);
-
+
if (exists($show{'scheduled'}) || exists($show{'space'}) ) {
my $re_str = "$slot\0";
my @this_slot = grep(/^\Q$re_str\E/,keys(%consumed));
@@ -1206,6 +1967,8 @@ sub show_table {
&Apache::lonlocal::locallocaltime($slots{$slot}->{'endtime'}):'');
my $start_reserve=($slots{$slot}->{'startreserve'}?
&Apache::lonlocal::locallocaltime($slots{$slot}->{'startreserve'}):'');
+ my $end_reserve=($slots{$slot}->{'endreserve'}?
+ &Apache::lonlocal::locallocaltime($slots{$slot}->{'endreserve'}):'');
my $unique;
if (ref($slots{$slot}{'uniqueperiod'})) {
@@ -1213,13 +1976,21 @@ sub show_table {
localtime($slots{$slot}{'uniqueperiod'}[1]);
}
- my $title;
+ my @titles;
if (exists($slots{$slot}{'symb'})) {
- my (undef,undef,$res)=
- &Apache::lonnet::decode_symb($slots{$slot}{'symb'});
- $res = &Apache::lonnet::clutter($res);
- $title = &Apache::lonnet::gettitle($slots{$slot}{'symb'});
- $title=''.$title.'';
+ my @symbs;
+ if ($slots{$slot}{'symb'} =~ /,/) {
+ @symbs = split(/\s*,\s*/,$slots{$slot}{'symb'});
+ } else {
+ @symbs = ($slots{$slot}{'symb'});
+ }
+ foreach my $reqsymb (@symbs) {
+ my (undef,undef,$res) =
+ &Apache::lonnet::decode_symb($reqsymb);
+ $res = &Apache::lonnet::clutter($res);
+ my $title = &Apache::lonnet::gettitle($reqsymb);
+ push(@titles,''.$title.'');
+ }
}
my $allowedsections;
@@ -1262,26 +2033,48 @@ sub show_table {
}
my $proctors=join(', ',@proctors);
- my $edit=(<<"EDITLINK");
-Edit
+ my %lt = &Apache::lonlocal::texthash (
+ edit => 'Edit',
+ delete => 'Delete',
+ slotlog => 'History',
+ );
+ my ($edit,$delete,$showlog,$remove_all);
+ if ($mgr) {
+ $edit=(<<"EDITLINK");
+$lt{'edit'}
EDITLINK
- my $delete=(<<"DELETELINK");
-Delete
+ $delete=(<<"DELETELINK");
+$lt{'delete'}
DELETELINK
- my $remove_all=&remove_link($slot,'remove all').'
';
+ $remove_all=&remove_link($slot,'remove all').'
';
- if ($ids ne '') { undef($delete); }
- if ($slots{$slot}{'type'} ne 'schedulable_student'
- || $ids eq '') {
+ if ($ids eq '') {
+ undef($remove_all);
+ } else {
+ undef($delete);
+ }
+ }
+
+ $showlog=(<<"LOGLINK");
+$lt{'slotlog'}
+LOGLINK
+
+ if ($slots{$slot}{'type'} ne 'schedulable_student') {
+ undef($showlog);
undef($remove_all);
}
+ unless ($shownheader) {
+ $r->print($tableheader);
+ $shownheader = 1;
+ }
+
my $row_start=&Apache::loncommon::start_data_table_row();
my $row_end=&Apache::loncommon::end_data_table_row();
$r->print($row_start.
- "\n$edit $delete | \n");
+ "\n$edit $delete $showlog | \n");
if (exists($show{'name'})) {
$colspan++;$r->print("$slot | ");
}
@@ -1300,6 +2093,12 @@ DELETELINK
if (exists($show{'startreserve'})) {
$colspan++;$r->print("$start_reserve | \n");
}
+ if (exists($show{'endreserve'})) {
+ $colspan++;$r->print("$end_reserve | \n");
+ }
+ if (exists($show{'reservationmsg'})) {
+ $colspan++;$r->print("$reservemsg | \n");
+ }
if (exists($show{'secret'})) {
$colspan++;$r->print("$slots{$slot}{'secret'} | \n");
}
@@ -1316,8 +2115,18 @@ DELETELINK
if (exists($show{'ip'})) {
$colspan++;$r->print("$slots{$slot}{'ip'} | \n");
}
+ if (exists($show{'iptied'})) {
+ $colspan++;
+ if ($slots{$slot}{'iptied'} eq 'yes') {
+ $r->print(''.&mt('Yes')." | \n");
+ } elsif ($slots{$slot}{'iptied'} eq 'answer') {
+ $r->print(''.&mt('Yes, including post-answer date')." | \n");
+ } else {
+ $r->print(''.&mt('No')." | \n");
+ }
+ }
if (exists($show{'symb'})) {
- $colspan++;$r->print("$title | \n");
+ $colspan++;$r->print("".join(' ',@titles)." | \n");
}
if (exists($show{'allowedsections'})) {
$colspan++;$r->print("$allowedsections | \n");
@@ -1340,30 +2149,905 @@ $row_end
STUFF
}
}
- $r->print('');
+ if ($shownheader) {
+ $r->print(&Apache::loncommon::end_data_table());
+ } else {
+ $r->print(''.&mt('No slots meet the criteria for display').'
');
+ }
+ $r->print('');
+ return;
+}
+
+sub manage_reservations {
+ my ($r,$crstype,$slots,$consumed_uniqueperiods,$allavailable) = @_;
+ my ($cnum,$cdom)=&get_course();
+ my $navmap = Apache::lonnavmaps::navmap->new();
+ $r->print(''
+ .&mt('Instructors may use a reservation system to place restrictions on when and where assignments can be worked on.')
+ .'
'
+ .&mt('One example is for management of laboratory space, which is only available at certain times, and has a limited number of seats.')
+ .'
'
+ );
+ if (!defined($navmap)) {
+ $r->print('');
+ if ($crstype eq 'Community') {
+ $r->print(&mt('Unable to retrieve information about community contents'));
+ } else {
+ $r->print(&mt('Unable to retrieve information about course contents'));
+ }
+ $r->print('
');
+ &Apache::lonnet::logthis('Manage Reservations - could not create navmap object in '.lc($crstype).':'.$env{'request.course.id'});
+ return;
+ }
+ if (ref($consumed_uniqueperiods) eq 'HASH') {
+ if (&Apache::lonnet::error(%$consumed_uniqueperiods)) {
+ $r->print(''.
+ &mt('An error occurred determining slot availability.').
+ '');
+ return;
+ }
+ } elsif ($consumed_uniqueperiods =~ /^error: /) {
+ $r->print(''.
+ &mt('An error occurred determining slot availability.').
+ '');
+ return;
+ }
+ my (%output,%slotinfo,%statusbymap,%repsymbs,%shownmaps);
+ my @possibles = $navmap->retrieveResources(undef,
+ sub { $_[0]->is_problem() || $_[0]->is_tool() },1,0);
+
+ foreach my $resource (@possibles) {
+ my ($useslots) = $resource->slot_control();
+ next if (($useslots eq '') || ($useslots =~ /^\s*no\s*$/i));
+ my $symb = $resource->symb();
+ my ($slot_status,$date,$slot_name) = $resource->check_for_slot('0');
+ my ($msg,$get_choices,$slotdescription);
+ my $status = $resource->simpleStatus('0');
+ my ($msg,$get_choices,$slotdescription);
+ 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=''.&mt('Reserved:').
+ ' '.$slotdescription.'
'.
+ &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=''.&mt('Reserved:').
+ ' '.$slotdescription.'
'.
+ &mt('Problem is currently available.');
+ } elsif ($slot_status == $resource->RESERVED_LOCATION) {
+ $msg=''.&mt('Reserved:').
+ ' '.$slotdescription.'
'.
+ &mt('Problem is available at a different location.');
+ $get_choices = 1;
+ } elsif ($slot_status == $resource->RESERVED_LATER) {
+ $msg=''.&mt('Reserved:').
+ ' '.$slotdescription.'
'.
+ &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->RESERVABLE_LATER) {
+ $msg=&mt('Reservation needed: will be reservable later.');
+ } 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');
+ }
+ }
+ $output{$symb}{'msg'} = $msg;
+ if (($status == $resource->OPEN) && ($get_choices)) {
+ $output{$symb}{'hasaction'} = 1;
+ }
+ my ($mapurl,$id,$resurl) = &Apache::lonnet::decode_symb($symb);
+ $mapurl = &Apache::lonnet::clutter($mapurl);
+ unless ($mapurl =~ /default\.sequence$/) {
+ $shownmaps{$mapurl} = 1;
+ my $map = $navmap->getResourceByUrl($mapurl);
+ if (ref($map)) {
+ my @pcs = split(/,/,$map->map_hierarchy());
+ shift(@pcs);
+ shift(@pcs);
+ if (@pcs) {
+ map { $shownmaps{$navmap->getByMapPc($_)->src()} = 1; } reverse(@pcs);
+ }
+ }
+ }
+ if (($useslots eq 'map_map') || ($useslots eq 'map')) {
+ if ($slot_status ne '') {
+ if (ref($statusbymap{$mapurl}{$slot_status}) eq 'ARRAY') {
+ push(@{$statusbymap{$mapurl}{$slot_status}},$symb);
+ } else {
+ $statusbymap{$mapurl}{$slot_status} = [$symb];
+ }
+ }
+ }
+ }
+
+ foreach my $mapurl (keys(%statusbymap)) {
+ if (ref($statusbymap{$mapurl}) eq 'HASH') {
+ if (keys(%{$statusbymap{$mapurl}}) == 1) {
+ my @values = values(%{$statusbymap{$mapurl}});
+ my $repsymb = $values[0][0];
+ if (ref($output{$repsymb}) eq 'HASH') {
+ $output{$mapurl}{'msg'} = $output{$repsymb}{'msg'};
+ $output{$mapurl}{'hasaction'} = $output{$repsymb}{'hasaction'};
+ }
+ $repsymbs{$mapurl} = $repsymb;
+ }
+ }
+ }
+
+ my (%parent,%container,%container_title);
+ my ($depth,$count,$reservable,$currcontainer,$rownum,$mapnum,$shown) = (0,0,0,0,0,0,0);
+ my @backgrounds = ("LC_even_row","LC_odd_row");
+ my $numcolors = scalar(@backgrounds);
+ my $location=&Apache::loncommon::lonhttpdurl("/adm/lonIcons/whitespace_21.gif");
+ my $slotheader = ''.
+ &mt('Your reservation status for any such assignments is listed below:').
+ '
'.
+ ''."\n";
+ my $shownheader = 0;
+ my $currmap;
+ my $it=$navmap->getIterator(undef,undef,undef,1,undef,undef);
+ while (my $resource = $it->next()) {
+ if ($resource == $it->BEGIN_MAP()) {
+ $depth++;
+ $parent{$depth} = $currcontainer;
+ if (ref($container{$currcontainer})) {
+ my $currmapres = $container{$currcontainer};
+ my $currmaptitle = $container_title{$currcontainer};
+ $currmap = $currmapres->src();
+ my $currmaptype = 'sequence';
+ if ($currmapres->is_page()) {
+ $currmaptype = 'page';
+ }
+ if ($shownmaps{$currmap}) {
+ $mapnum ++;
+ $rownum ++;
+ $shown ++;
+ if (!$shownheader) {
+ $r->print($slotheader);
+ $shownheader = 1;
+ }
+ my $bgcolor = $backgrounds[$shown % $numcolors];
+ my ($spacers,$icon);
+ my $row = '';
+ if (ref($statusbymap{$currmap}) eq 'HASH') {
+ my ($spacers,$icon) = &show_map_row($depth-1,$location,$currmaptype,$currmaptitle);
+ my $arrowstate = 'open';
+ if (keys(%{$statusbymap{$currmap}}) == 1) {
+ $arrowstate = 'closed';
+ }
+ $row .= ''.$spacers.''.
+ $icon.(' ' x6).' | '."\n";
+ if (ref($output{$currmap}) eq 'HASH') {
+ my $formnum = $mapnum.'_'.$reservable+1;
+ my $class = 'LC_slotmaptext_'.$mapnum;
+ if ($output{$currmap}{'hasaction'}) {
+ $row .= ''.
+ $output{$currmap}{'msg'}.
+ ' | '.
+ &slot_chooser($repsymbs{$currmap},$class,$formnum,
+ $allavailable,$slots,$consumed_uniqueperiods).
+ ' | ';
+ } else {
+ $row .= ''.
+ $output{$currmap}{'msg'}.
+ ' | ';
+ }
+ $row .= '
'."\n";
+ } else {
+ $row .= ' | '."\n";
+ }
+ } else {
+ my ($spacers,$icon) = &show_map_row($depth,$location,$currmaptype,$currmaptitle);
+ $row .= ''.$spacers.$icon.(' ' x6).' | | '."\n";
+ }
+ $r->print($row);
+ }
+ }
+ } elsif ($resource == $it->END_MAP()) {
+ $depth--;
+ $currcontainer = $parent{$depth};
+ } elsif (ref($resource)) {
+ my $symb = $resource->symb();
+ next if (!$resource->is_problem() && !$resource->is_tool() &&
+ !$resource->is_sequence() && !$resource->is_page());
+ $count ++;
+ if (($resource->is_sequence()) || ($resource->is_page())) {
+ $currcontainer = $count;
+ $container{$currcontainer} = $resource;
+ $container_title{$currcontainer} = $resource->compTitle();
+ }
+ if ($resource->is_problem() || $resource->is_tool()) {
+ next unless (exists($output{$symb}));
+ $reservable ++;
+ $rownum ++;
+ if (!$shownheader) {
+ $r->print($slotheader);
+ $shownheader = 1;
+ }
+ my $style;
+ if (exists($output{$currmap})) {
+ $style = 'none';
+ } else {
+ $style = 'table-row';
+ $shown ++;
+ }
+ my $title = $resource->compTitle();
+ my $bgcolor = $backgrounds[$shown % $numcolors];
+ $r->print(''.
+ '');
+ for (my $i=0; $i<$depth; $i++) {
+ $r->print('');
+ }
+ $r->print(''.
+ ''.$title.''.(' ' x6).' | ');
+ my $class = 'LC_slottext_'.$mapnum;
+ if ($output{$symb}{'hasaction'}) {
+ $r->print(''.$output{$symb}{'msg'}.' | '.
+ ''.
+ &slot_chooser($symb,$class,$reservable,$allavailable,$slots,
+ $consumed_uniqueperiods).' | ');
+ } else {
+ $r->print(''.
+ ''.$output{$symb}{'msg'}.''.
+ ' | ');
+ }
+ $r->print('
'."\n");
+ }
+ }
+ }
+ if ($shownheader) {
+ $r->print('
');
+ }
+ if (!$reservable) {
+ $r->print('');
+ if ($crstype eq 'Community') {
+ $r->print(&mt('No community items currently require a reservation to gain access.'));
+ } else {
+ $r->print(&mt('No course items currently require a reservation to gain access.'));
+ }
+ $r->print('');
+ }
+ $r->print(''.
+ &mt('Reservation History').'
');
+}
+
+sub show_map_row {
+ my ($depth,$location,$type,$title) = @_;
+ my $spacers;
+ for (my $i=0; $i<$depth-1; $i++) {
+ $spacers .= '';
+ }
+ my $icon;
+ if ($type eq 'page') {
+ $icon = ' '."\n";
+ } else {
+ $icon = ' '."\n";
+ }
+ $icon .= $title;
+ return ($spacers,$icon);
+}
+
+sub slot_chooser {
+ my ($symb,$class,$formnum,$allavailable,$slots,$consumed_uniqueperiods) = @_;
+ my $output;
+ my @got_slots=&check_for_reservation($symb,'allslots');
+ if ($got_slots[0] =~ /^error: /) {
+ $output = ''.
+ &mt('An error occurred determining slot availability.').
+ '';
+ } else {
+ my $formname = 'manageres_'.$formnum;
+ if (ref($allavailable) eq 'ARRAY') {
+ my @available;
+ if (ref($slots) eq 'HASH') {
+ foreach my $slot (@{$allavailable}) {
+ # not allowed for this resource
+ if (ref($slots->{$slot}) eq 'HASH') {
+ if ($slots->{$slot}->{'symb'} ne '') {
+ my ($map,$id,$url) = &Apache::lonnet::decode_symb($symb);
+ my $exclude = 1;
+ my @reqsymbs = split(/\s*,\s*/,$slots->{$slot}->{'symb'});
+ if (@reqsymbs) {
+ if (grep(/^\Q$symb\E$/,@reqsymbs)) {
+ $exclude = 0;
+ } else {
+ foreach my $reqsymb (@reqsymbs) {
+ my (undef,undef,$sloturl) = &Apache::lonnet::decode_symb($reqsymb);
+ if ($sloturl=~/\.(page|sequence)$/) {
+ if (($map ne '') && ($map eq $sloturl)) {
+ $exclude = 0;
+ last;
+ }
+ }
+ }
+ }
+ next if ($exclude);
+ }
+ }
+ }
+ push(@available,$slot);
+ }
+ }
+ $output .= &show_choices($symb,$formname,$formnum,$class,
+ $slots,$consumed_uniqueperiods,
+ \@available,\@got_slots);
+ }
+ }
+ return $output;
+}
+
+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 ($cnum,$cdom)=&get_course();
+ my $crstype = &Apache::loncommon::course_type();
+ my %log=&Apache::lonnet::dump('nohist_'.$cdom.'_'.$cnum.'_slotlog',$udom,$uname);
+ if ($env{'form.origin'} eq 'aboutme') {
+ $r->print('');
+ my $name = &Apache::loncommon::plainname($env{'form.uname'},$env{'form.udom'},
+ 'firstname');
+ if ($crstype eq 'Community') {
+ $r->print(&mt('History of member-reservable slots for: [_1]',
+ $name));
+ } else {
+ $r->print(&mt('History of student-reservable slots for: [_1]',
+ $name));
+
+ }
+ $r->print('
');
+ }
+ $r->print('');
+ return;
+}
+
+sub show_reservations_log {
+ my ($r) = @_;
+ my $badslot;
+ my $crstype = &Apache::loncommon::course_type();
+ if ($env{'form.slotname'} eq '') {
+ $r->print(''.&mt('No slot name provided').'
');
+ $badslot = 1;
+ } else {
+ my %slot=&Apache::lonnet::get_slot($env{'form.slotname'});
+ if (keys(%slot) == 0) {
+ $r->print(''.&mt('Invalid slot name: [_1]',$env{'form.slotname'}).'
');
+ $badslot = 1;
+ } elsif ($slot{type} ne 'schedulable_student') {
+ my $description = &get_description($env{'form.slotname'},\%slot);
+ $r->print('');
+ if ($crstype eq 'Community') {
+ $r->print(&mt('Reservation history unavailable for non-member-reservable slot: [_1].',$description));
+ } else {
+ $r->print(&mt('Reservation history unavailable for non-student-reservable slot: [_1].',$description));
+ }
+ $r->print('
');
+ $badslot = 1;
+ }
+ }
+ if ($badslot) {
+ $r->print(''.
+ &mt('Return to slot list').'
');
+ return;
+ }
+ my $formname = 'reservationslog';
+ my ($cnum,$cdom)=&get_course();
+ 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(''.
+ ''.
+ &mt('Return to slot list').'
');
+ 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 Content');
+ } 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 ($crstype) = @_;
+ 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',
+ );
+ if ($crstype eq 'Community') {
+ $lt{'user'} = &mt('By member');
+ $lt{'usermanage'} = $lt{'user'};
+ }
+ return %lt;
+}
+
+sub display_filter {
+ my ($formname,$cdom,$cnum,$curr,$version,$allsymbs) = @_;
+ my $nolink = 1;
+ my (%titles,%maptitles);
+ my $output = '
'.
+ ''.&mt('Changes/page:').' '.
+ &Apache::lonmeta::selectbox('show',$curr->{'show'},'',undef,
+ (&mt('all'),5,10,20,50,100,1000,10000)).
+ ' | | ';
+ 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 $crstype = &Apache::loncommon::course_type();
+ my %lt = &reservationlog_contexts($crstype);
+ $output .= ''.&mt('Window during which changes occurred:').
+ '
'.&mt('After:').
+ ' | '.$startform.' | '.&mt('Before:').' | '.
+ $endform.' |
| | ';
+ if (ref($allsymbs) eq 'ARRAY') {
+ $output .= ''.&mt('Resource').' '.
+ ' | | '.
+ &mt('Context:').'
| ';
+ } else {
+ $output .= ''.&mt('Action').' '.
+ ' | ';
+ }
+ $output .= ' |
'.
+ ''.
+ ''.
+ &mt('Only changes made from servers running LON-CAPA [_1] or later are displayed.'
+ ,'2.9.0');
+ if ($version) {
+ $output .= ' '.&mt('This LON-CAPA server is version [_1]',$version);
+ }
+ $output .= '
';
+ return $output;
+}
+
+sub slot_change_messaging {
+ my ($setting,$subject,$msg,$action) = @_;
+ my $user = $env{'user.name'};
+ my $domain = $env{'user.domain'};
+ my ($message_status,$comment_status);
+ if ($setting eq 'only_student'
+ || $setting eq 'student_and_user_notes_screen') {
+ $message_status =
+ &Apache::lonmsg::user_normal_msg($user,$domain,$subject,$msg);
+ $message_status = ''.&mt('Sent to you: [_1]',
+ $message_status).' ';
+ }
+ if ($setting eq 'student_and_user_notes_screen') {
+ $comment_status =
+ &Apache::lonmsg::store_instructor_comment($subject.'
'.
+ $msg,$user,$domain);
+ $comment_status = ''.&mt('Entry added to course record (viewable by instructor): [_1]',
+ $comment_status).'';
+ }
+ if ($message_status || $comment_status) {
+ my $msgtitle;
+ if ($action eq 'reserve') {
+ $msgtitle = &mt('Status of messages about saved reservation');
+ } elsif ($action eq 'release') {
+ $msgtitle = &mt('Status of messages about dropped reservation');
+ } elsif ($action eq 'nochange') {
+ $msgtitle = &mt('Status of messages about unchanged existing reservation');
+ }
+ return ''.$msgtitle.''
+ .''
+ .$message_status
+ .$comment_status
+ .'
';
+ }
}
sub upload_start {
- my ($r)=@_;
- $r->print(&Apache::grades::checkforfile_js());
- my $result.=''."\n";
- $result.='
'."\n";
- $r->print($result);
+ my ($r)=@_;
+ $r->print(
+ &Apache::grades::checkforfile_js()
+ .'