');
+ $r->print($output);
+ return;
}
sub to_show {
@@ -946,7 +1041,7 @@ sub remove_link {
$symb = &escape($symb);
return <<"END_LINK";
- ($remove)
END_LINK
@@ -956,6 +1051,7 @@ sub show_table {
my ($r,$mgr)=@_;
my ($cnum,$cdom)=&get_course();
+ my $crstype=&Apache::loncommon::course_type($cdom.'_'.$cnum);
my %slots=&Apache::lonnet::dump('slots',$cdom,$cnum);
if ( (keys(%slots))[0] =~ /^error: 2 /) {
undef(%slots);
@@ -963,7 +1059,8 @@ sub show_table {
my $available;
if ($mgr eq 'F') {
# FIXME: This line should be deleted once Slots uses breadcrumbs
- $r->print(&Apache::loncommon::help_open_topic('Slot About', 'Help on slots'));
+ $r->print(' '.&Apache::loncommon::help_open_topic(
+ 'Slot About', &mt('Help on slots')));
$r->print('
');
$r->print('
');
}
+
+ if (!keys(%slots)) {
+ $r->print(
+ '
'
+ .&mt('No slots have been created in this '.lc($crstype).'.')
+ .'
'
+ );
+ return;
+ }
my %Saveable_Parameters = ('show' => 'array',
'when' => 'scalar',
@@ -1001,6 +1107,8 @@ 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',
@@ -1010,9 +1118,14 @@ sub show_table {
'uniqueperiod' => 'Period of time slot is unique',
'scheduled' => 'Scheduled Students',
'proctor' => 'List of proctors');
+ 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','symb','allowedsections','allowedusers','uniqueperiod',
'scheduled','proctor');
my @show =
(exists($env{'form.show'})) ? &Apache::loncommon::get_env_multiple('form.show')
@@ -1078,31 +1191,31 @@ sub show_table {
'
+ .&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;
+ }
+ 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");
+ my $slotheader = '
'.
+ &mt('Your reservation status for any such assignments is listed below:').
+ '
'.
+ '
'."\n";
+ my $shownheader = 0;
+ 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=''.&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');
+ }
+ }
+ $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];
+ if (!$shownheader) {
+ $r->print($slotheader);
+ $shownheader = 1;
+ }
+ $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('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('Upload a file containing the slot definitions').'
'
+ .''
+ );
}
sub csvuploadmap_header {
@@ -1373,16 +2235,40 @@ sub csvuploadmap_header {
my $checked=(($env{'form.noFirstLine'})?' checked="checked"':'');
my $ignore=&mt('Ignore First Line');
- my $help_field = &Apache::loncommon::help_open_topic('Slot SelectingField');
+ my $buttontext = &mt('Reverse Association');
+
+ $r->print(
+ '
ENDPICK
}
sub csvupload_javascript_reverse_associate {
- my $error1=&mt('You need to specify the name, starttime, endtime and a type');
+ my $error1=&mt('You need to specify the name, start time, end time and a type.');
return(<print('
Creating Slots
');
+ $r->print('
'.&mt('Creating Slots').'
');
my $cname=$env{'course.'.$env{'request.course.id'}.'.num'};
my $cdom=$env{'course.'.$env{'request.course.id'}.'.domain'};
my $countdone=0;
@@ -1585,6 +2474,30 @@ sub csv_upload_assign {
next;
}
+ if ($entries{$fields{'endreserve'}}) {
+ $slot{'endreserve'}=
+ &UnixDate($entries{$fields{'endreserve'}},"%s");
+ }
+ if (defined($slot{'endreserve'})
+ && $slot{'endreserve'} > $slot{'starttime'}) {
+ push(@errors,"$name not created -- Slot's reservation end time is after the slot's start time.");
+ next;
+ }
+
+ if ($slot{'type'} eq 'schedulable_student') {
+ if ($entries{$fields{'reservationmsg'}}) {
+ if (($entries{$fields{'reservationmsg'}} eq 'only_student') ||
+ ($entries{$fields{'reservationmsg'}} eq 'student_and_user_notes_screen')) {
+ $slot{'reservationmsg'}=$entries{$fields{'reservationmsg'}};
+ } else {
+ unless (($entries{$fields{'reservationmsg'}} eq 'none') ||
+ ($entries{$fields{'reservationmsg'}} eq '')) {
+ push(@errors,"$name -- Slot's reservationmsg setting ignored - not one of: 'only_student', 'student_and_user_notes_screen', 'none' or ''");
+ }
+ }
+ }
+ }
+
foreach my $key ('ip','proctor','description','maxspace',
'secret','symb') {
if ($entries{$fields{$key}}) {
@@ -1609,14 +2522,43 @@ sub csv_upload_assign {
$r->rflush();
$countdone++;
}
- $r->print("