--- loncom/interface/lonnavmaps.pm 2011/11/29 11:58:53 1.470 +++ loncom/interface/lonnavmaps.pm 2012/04/04 15:00:17 1.482 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Navigate Maps Handler # -# $Id: lonnavmaps.pm,v 1.470 2011/11/29 11:58:53 foxr Exp $ +# $Id: lonnavmaps.pm,v 1.482 2012/04/04 15:00:17 raeburn Exp $ # # Copyright Michigan State University Board of Trustees @@ -225,7 +225,7 @@ automatically. =over 4 -=item * B A reference to a fresh ::iterator to use from the navmaps. The rendering will reflect the options passed to the iterator, so you can @@ -464,7 +464,7 @@ returns 4 =item add_linkitem() -=item show_linkitems() +=item show_linkitems_toolbar() =back @@ -542,9 +542,6 @@ my %colormap = # is not yet done and due in less than 24 hours my $hurryUpColor = "#FF0000"; -my $future_slots_checked = 0; -my $future_slots = 0; - sub addToFilter { my $hashIn = shift; my $addition = shift; @@ -635,10 +632,10 @@ sub getDescription { return &mt('Reserved - next open [_1]', timeToHumanString($slot_time,'start')); } elsif ($slot_status == $res->RESERVABLE) { - return &mt('Reservable ending [_1]', + return &mt('Reservable, reservations close [_1]', timeToHumanString($slot_time,'end')); } elsif ($slot_status == $res->RESERVABLE_LATER) { - return &mt('Reservable starting [_1]', + return &mt('Reservable, reservations open [_1]', timeToHumanString($slot_time,'start')); } elsif ($slot_status == $res->NOT_IN_A_SLOT) { return &mt('Reserve a time/place to work'); @@ -899,6 +896,7 @@ sub part_status_summary { return 4; } sub render_resource { my ($resource, $part, $params) = @_; + my $editmapLink; my $nonLinkedText = ''; # stuff after resource title not in link my $link = $params->{"resourceLink"}; @@ -980,6 +978,14 @@ sub render_resource { $linkopen = ""; $linkclose = ""; } + if ((&Apache::lonnet::allowed('mdc',$env{'request.course.id'})) && + ($resource->symb=~/\_\_\_[^\_]+\_\_\_uploaded/)) { + my $icon = &Apache::loncommon::lonhttpdurl('/res/adm/pages').'/editmap.png'; + $editmapLink=' '. + ''. + ''.&mt('Edit Content').''. + ''; + } } if ($resource->randomout()) { @@ -1013,8 +1019,10 @@ sub render_resource { # Is this the current resource? if (!$params->{'displayedHereMarker'} && $resource->symb() eq $params->{'here'} ) { - $curMarkerBegin = ''; - $curMarkerEnd = ''; + unless ($resource->is_map()) { + $curMarkerBegin = ''; + $curMarkerEnd = ''; + } $params->{'displayedHereMarker'} = 1; } @@ -1033,7 +1041,7 @@ sub render_resource { if (!$params->{'resource_nolink'} && !$resource->is_sequence() && !$resource->is_empty_sequence) { $result .= "$curMarkerBegin$title$partLabel$curMarkerEnd$nonLinkedText"; } else { - $result .= "$curMarkerBegin$linkopen$title$partLabel$curMarkerEnd$nonLinkedText"; + $result .= "$curMarkerBegin$linkopen$title$partLabel$curMarkerEnd$editmapLink$nonLinkedText"; } return $result; @@ -1047,6 +1055,7 @@ sub render_communication_status { my $linkopen = ""; my $linkclose = ""; my $location=&Apache::loncommon::lonhttpdurl("/adm/lonMisc"); + if ($resource->hasDiscussion()) { $discussionHTML = $linkopen . ''.&mt('New Discussion').'' . @@ -1135,14 +1144,6 @@ sub render_long_status { $result .= getDescription($resource, $part); if ($color) {$result .= ""; } } - if ($resource->is_map()) { - if (&Apache::lonnet::allowed('mdc')) { - if ($resource->symb=~/\_\_\_[^\_]+\_\_\_uploaded/) { - $result.=" ". - "".&mt("Edit Content").' '; - } - } - } if ($resource->is_map() && &advancedUser() && $resource->randompick()) { $result .= &mt('(randomly select [_1])', $resource->randompick()); } @@ -1465,8 +1466,10 @@ sub render { $link .= '&register='.$env{'form.register'}; } if ($args->{'caller'} eq 'navmapsdisplay') { - &add_linkitem($args->{'linkitems'},'changefolder', - "location.href='$link'",$text); + unless ($args->{'notools'}) { + &add_linkitem($args->{'linkitems'},'changefolder', + "location.href='$link'",$text); + } } else { $result.= ''.&mt($text).''; } @@ -1474,7 +1477,7 @@ sub render { } # Check for any unread discussions in all resources. - if ($args->{'caller'} eq 'navmapsdisplay') { + if (($args->{'caller'} eq 'navmapsdisplay') && (!$args->{'notools'})) { &add_linkitem($args->{'linkitems'},'clearbubbles', 'document.clearbubbles.submit()', 'Mark all posts read'); @@ -1507,18 +1510,20 @@ END } $result.=''; } + if (($args->{'caller'} eq 'navmapsdisplay') && + (&Apache::lonnet::allowed('mdc',$env{'request.course.id'}))) { + my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; + my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; + if ($env{'course.'.$env{'request.course.id'}.'.url'} eq + "uploaded/$cdom/$cnum/default.sequence") { + &add_linkitem($args->{'linkitems'},'edittoplevel', + "javascript:gocmd('/adm/coursedocs','editdocs');", + 'Content Editor'); + } + } if ($args->{'caller'} eq 'navmapsdisplay') { - $result .= ''; - $result .= ''; - $result.=''; - $result.=&show_linkitems_toolbar($args->{'linkitems'}); - if ($args->{'sort_html'}) { - $result.=''. - ''; - } - $result .= '
'. - &Apache::loncommon::help_open_menu('Navigation Screen','Navigation_Screen',undef,'RAT').' '.&mt('Tools:').'   '.$args->{'sort_html'}.'
'; + $result .= &show_linkitems_toolbar($args,$condition); } elsif ($args->{'sort_html'}) { $result.=$args->{'sort_html'}; } @@ -1856,41 +1861,65 @@ sub add_linkitem { } sub show_linkitems_toolbar { - my ($linkitems,$condition)=@_; - my @linkorder = ('firsthomework','everything','uncompleted', - 'changefolder','clearbubbles'); - my $result .=''."\n". - ''."\n". - ''. - ''."\n"; + if ($result) { + $result = "$result
"; + } return $result; } - 1; @@ -3585,6 +3614,8 @@ sub new { $self->{NAV_MAP}->{RESOURCE_CACHE}->{$self->{ID}} = $self; $self->{RESOURCE_ERROR} = 0; + $self->{DUEDATE_CACHE} = undef; + # A hash that can be used by two-pass algorithms to store data # about this resource in. Not used by the resource object # directly. @@ -4121,7 +4152,7 @@ sub printable { # Get the print open/close dates for the resource. - my $start = $self->parmval("prinstartdate", $part); + my $start = $self->parmval("printstartdate", $part); my $end = $self->parmval("printenddate", $part); # The following cases apply: @@ -4223,6 +4254,9 @@ sub checkedin { sub duedate { (my $self, my $part) = @_; + if (defined ($self->{DUEDATE_CACHE}->{$part})) { + return $self->{DUEDATE_CACHE}->{$part}; + } my $date; my @interval=$self->parmval("interval", $part); my $due_date=$self->parmval("duedate", $part); @@ -4239,6 +4273,7 @@ sub duedate { } else { $date = $due_date; } + $self->{DUEDATE_CACHE}->{$part} = $date; return $date; } sub handgrade { @@ -5090,12 +5125,13 @@ sub status { } # Otherwise, it's untried and open - return OPEN; + return OPEN; } sub check_for_slot { my $self = shift; my $part = shift; + my $symb = $self->symb(); my ($use_slots,$available,$availablestudent) = $self->slot_control($part); if (($use_slots ne '') && ($use_slots !~ /^\s*no\s*$/i)) { my @slots = (split(/:/,$availablestudent),split(/:/,$available)); @@ -5103,50 +5139,45 @@ sub check_for_slot { my $cdom=$env{'course.'.$cid.'.domain'}; my $cnum=$env{'course.'.$cid.'.num'}; my $now = time; + my $num_usable_slots = 0; if (@slots > 0) { my %slots=&Apache::lonnet::get('slots',[@slots],$cdom,$cnum); if (&Apache::lonnet::error(%slots)) { return (UNKNOWN); } - my @sorted_slots = &Apache::loncommon::sorted_slots(\@slots,\%slots); + my @sorted_slots = &Apache::loncommon::sorted_slots(\@slots,\%slots,'starttime'); my ($checkedin,$checkedinslot); foreach my $slot_name (@sorted_slots) { - next if (!defined($slots{$slot_name}) || - !ref($slots{$slot_name})); + next if (!defined($slots{$slot_name}) || !ref($slots{$slot_name})); my $end = $slots{$slot_name}->{'endtime'}; my $start = $slots{$slot_name}->{'starttime'}; my $ip = $slots{$slot_name}->{'ip'}; if ($self->simpleStatus() == OPEN) { - my $startreserve = $slots{$slot_name}->{'startreserve'}; - my @proctors; - if ($slots{$slot_name}->{'proctor'} ne '') { - @proctors = split(',',$slots{$slot_name}->{'proctor'}); - } if ($end > $now) { - ($checkedin,$checkedinslot) = $self->checkedin(); - if ($startreserve < $now) { - if ($start > $now) { - return (RESERVED_LATER,$start,$slot_name); - } else { - if ($ip ne '') { - if (!&Apache::loncommon::check_ip_acc($ip)) { - return (RESERVED_LOCATION,$ip,$slot_name); - } - } - if (@proctors > 0) { - unless ((grep(/^\Q$checkedin\E/,@proctors)) && - ($checkedinslot eq $slot_name)) { - return (NEEDS_CHECKIN,undef,$slot_name); - } + if ($start > $now) { + return (RESERVED_LATER,$start,$slot_name); + } else { + if ($ip ne '') { + if (!&Apache::loncommon::check_ip_acc($ip)) { + return (RESERVED_LOCATION,$ip,$slot_name); } - return (RESERVED,$end,$slot_name); } - } else { - if ($start > $now) { - return (RESERVABLE,$startreserve,$slot_name); + my @proctors; + if ($slots{$slot_name}->{'proctor'} ne '') { + @proctors = split(',',$slots{$slot_name}->{'proctor'}); + } + if (@proctors > 0) { + ($checkedin,$checkedinslot) = $self->checkedin(); + unless ((grep(/^\Q$checkedin\E/,@proctors)) && + ($checkedinslot eq $slot_name)) { + return (NEEDS_CHECKIN,undef,$slot_name); + } } + return (RESERVED,$end,$slot_name); } } + } elsif ($end > $now) { + $num_usable_slots ++; } } my ($is_correct,$got_grade); @@ -5167,32 +5198,33 @@ sub check_for_slot { return (CORRECT); } } - return(NOT_IN_A_SLOT); - } else { - if (!$future_slots_checked) { - $future_slots = &get_future_slots($cdom,$cnum,$now); - $future_slots_checked = 1; - } - if ($future_slots) { + if ($num_usable_slots) { return(NOT_IN_A_SLOT); } - return(NOTRESERVABLE); } - } - return; -} - -sub get_future_slots { - my ($cdom,$cnum,$now) = @_; - my %slots=&Apache::lonnet::dump('slots',$cdom,$cnum); - my $future_slots = 0; - foreach my $slot (keys(%slots)) { - if (($slots{$slot}->{'starttime'} > $now) && - ($slots{$slot}->{'endtime'} > $now)) { - $future_slots ++; + my $reservable = &Apache::lonnet::get_reservable_slots($cnum,$cdom,$env{'user.name'}, + $env{'user.domain'}); + if (ref($reservable) eq 'HASH') { + if ((ref($reservable->{'now_order'}) eq 'ARRAY') && (ref($reservable->{'now'}) eq 'HASH')) { + foreach my $slot (reverse (@{$reservable->{'now_order'}})) { + if (($reservable->{'now'}{$slot}{'symb'} eq '') || + ($reservable->{'now'}{$slot}{'symb'} eq $symb)) { + return(RESERVABLE,$reservable->{'now'}{$slot}{'endreserve'}); + } + } + } + if ((ref($reservable->{'future_order'}) eq 'ARRAY') && (ref($reservable->{'future'}) eq 'HASH')) { + foreach my $slot (@{$reservable->{'future_order'}}) { + if (($reservable->{'future'}{$slot}{'symb'} eq '') || + ($reservable->{'future'}{$slot}{'symb'} eq $symb)) { + return(RESERVABLE_LATER,$reservable->{'future'}{$slot}{'startreserve'}); + } + } + } } + return(NOTRESERVABLE); } - return $future_slots; + return; } sub CLOSED { return 23; }