--- loncom/interface/lonnavmaps.pm 2011/10/21 10:13:57 1.465 +++ loncom/interface/lonnavmaps.pm 2011/12/25 19:39:08 1.476 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Navigate Maps Handler # -# $Id: lonnavmaps.pm,v 1.465 2011/10/21 10:13:57 foxr Exp $ +# $Id: lonnavmaps.pm,v 1.476 2011/12/25 19:39:08 raeburn Exp $ # # Copyright Michigan State University Board of Trustees @@ -225,7 +225,7 @@ automatically. =over 4 -=item * B: default: constructs one from %env +=item * Bsymb(),'opendate'),$part); } if ($status == $res->OPEN_LATER) { - return &mt("Open [_1]",&Apache::lonhtmlcommon::direct_parm_link(&timeToHumanString($open,'start')),$res->symb(),'opendate',$part); + return &mt("Open [_1]",&Apache::lonhtmlcommon::direct_parm_link(&timeToHumanString($open,'start'),$res->symb(),'opendate',$part)); } if ($res->simpleStatus($part) == $res->OPEN) { unless (&Apache::lonnet::allowed('mgr',$env{'request.course.id'})) { @@ -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'); @@ -652,22 +649,22 @@ sub getDescription { if ($status == $res->OPEN) { if ($due) { if ($res->is_practice()) { - return &mt("Closes [_1]",&Apache::lonhtmlcommon::direct_parm_link(&timeToHumanString($due,'start')),$res->symb(),'duedate',$part); + return &mt("Closes [_1]",&Apache::lonhtmlcommon::direct_parm_link(&timeToHumanString($due,'start'),$res->symb(),'duedate',$part)); } else { - return &mt("Due [_1]",&Apache::lonhtmlcommon::direct_parm_link(&timeToHumanString($due,'end')),$res->symb(),'duedate',$part); + return &mt("Due [_1]",&Apache::lonhtmlcommon::direct_parm_link(&timeToHumanString($due,'end'),$res->symb(),'duedate',$part)); } } else { return &Apache::lonhtmlcommon::direct_parm_link(&mt("Open, no due date"),$res->symb(),'duedate',$part); } } if ($status == $res->PAST_DUE_ANSWER_LATER) { - return &mt("Answer open [_1]",&Apache::lonhtmlcommon::direct_parm_link(&timeToHumanString($answer,'start')),$res->symb(),'answerdate',$part); + return &mt("Answer open [_1]",&Apache::lonhtmlcommon::direct_parm_link(&timeToHumanString($answer,'start'),$res->symb(),'answerdate',$part)); } if ($status == $res->PAST_DUE_NO_ANSWER) { if ($res->is_practice()) { - return &mt("Closed [_1]",&Apache::lonhtmlcommon::direct_parm_link(&timeToHumanString($due,'start')),$res->symb(),'answerdate,duedate',$part); + return &mt("Closed [_1]",&Apache::lonhtmlcommon::direct_parm_link(&timeToHumanString($due,'start'),$res->symb(),'answerdate,duedate',$part)); } else { - return &mt("Was due [_1]",&Apache::lonhtmlcommon::direct_parm_link(&timeToHumanString($due,'end')),$res->symb(),'answerdate,duedate',$part); + return &mt("Was due [_1]",&Apache::lonhtmlcommon::direct_parm_link(&timeToHumanString($due,'end'),$res->symb(),'answerdate,duedate',$part)); } } if (($status == $res->ANSWER_OPEN || $status == $res->PARTIALLY_CORRECT) @@ -700,7 +697,7 @@ sub getDescription { } } if ($due) { - return &mt("Due [_1]",&Apache::lonhtmlcommon::direct_parm_link(&timeToHumanString($due,'end')),$res->symb(),'duedate',$part) . + return &mt("Due [_1]",&Apache::lonhtmlcommon::direct_parm_link(&timeToHumanString($due,'end'),$res->symb(),'duedate',$part)) . " $triesString"; } else { return &Apache::lonhtmlcommon::direct_parm_link(&mt("No due date"),$res->symb(),'duedate',$part)." $triesString"; @@ -1013,8 +1010,8 @@ sub render_resource { # Is this the current resource? if (!$params->{'displayedHereMarker'} && $resource->symb() eq $params->{'here'} ) { - $curMarkerBegin = ''; - $curMarkerEnd = ''; + $curMarkerBegin = ''; + $curMarkerEnd = ''; $params->{'displayedHereMarker'} = 1; } @@ -1135,6 +1132,14 @@ 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()); } @@ -1389,6 +1394,7 @@ sub render { } } + # (re-)Locate the jump point, if any # Note this does not take filtering or hidden into account... need # to be fixed? @@ -1497,19 +1503,20 @@ END } } $result.=''; + if (&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','direct');", + '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'}; } @@ -1641,6 +1648,7 @@ END $curRes = shift(@resources); } else { $curRes = $it->next($closeAllPages); + } if (!$curRes) { last; } @@ -1846,37 +1854,52 @@ sub add_linkitem { } sub show_linkitems_toolbar { - my ($linkitems,$condition)=@_; - my @linkorder = ('firsthomework','everything','uncompleted', - 'changefolder','clearbubbles'); - my $result .=''."\n". - ''."\n". - '
    '; - foreach my $link (@linkorder) { - my $link_id = 'LC_content_toolbar_'.$link; - if (defined($linkitems->{$link})) { - if ($linkitems->{$link}{'text'} ne '') { - $linkitems->{$link}{'cmd'}=~s/"/'/g; - if ($linkitems->{$link}{'cmd'}) { - if ($link eq 'changefolder') { - if ($condition) { - $link_id='LC_content_toolbar_changefolder_toggled'; - } else { - $link_id='LC_content_toolbar_changefolder'; + my ($args,$condition) = @_; + my $result = + ''. + ''. + ''; + if (ref($args) eq 'HASH') { + if (ref($args->{'linkitems'}) eq 'HASH') { + my @linkorder = ('firsthomework','everything','uncompleted', + 'changefolder','clearbubbles','edittoplevel'); + $result .=''."\n"; + } + if ($args->{'sort_html'}) { + $result .= ''. + ''; } } - $result .= ''. - ''."\n"; + $result .= '
    '. + &Apache::loncommon::help_open_menu('Navigation Screen','Navigation_Screen',undef,'RAT'). + ' '.&mt('Tools:').''."\n". + ''."\n". + '
      '; + foreach my $link (@linkorder) { + my $link_id = 'LC_content_toolbar_'.$link; + if (ref($args->{'linkitems'}{$link}) eq 'HASH') { + if ($args->{'linkitems'}{$link}{'text'} ne '') { + $args->{'linkitems'}{$link}{'cmd'}=~s/"/'/g; + if ($args->{'linkitems'}{$link}{'cmd'}) { + if ($link eq 'changefolder') { + if ($condition) { + $link_id='LC_content_toolbar_changefolder_toggled'; + } else { + $link_id='LC_content_toolbar_changefolder'; + } + } + $result .= '
    • '. + '
    • '."\n"; } } - $result .= '
    • '. - '
    • '."\n"; } } + $result .= '
    '. + '
       '.$args->{'sort_html'}.'
    '; return $result; } @@ -1987,7 +2010,7 @@ sub new { # assume there are course hashes for the specific requested user@domamin: # - if (($self->{USERNAME} eq $env{'user.name'}) && ($self->{DOMAIN} eq $env{'user.domain'})) { + if ( ($self->{USERNAME} eq $env{'user.name'}) && ($self->{DOMAIN} eq $env{'user.domain'})) { # tie the nav hash @@ -2012,7 +2035,9 @@ sub new { } else { $self->change_user($self->{USERNAME}, $self->{DOMAIN}); } - + + my $d = Data::Dumper->new([$self]); + return $self; } @@ -2047,6 +2072,8 @@ sub change_user { &Apache::lonmap::loadmap($cnum, $cdom, $self->{USERNAME}, $self->{DOMAIN}, \%big_hash); $self->{NAV_HASH} = \%big_hash; + + # Now clear the parm cache and reconstruct the parm hash fromt he big_hash # param.xxxx keys. @@ -2062,6 +2089,7 @@ sub change_user { } $self->{PARM_HASH} = \%parm_hash; + @@ -3054,12 +3082,15 @@ sub new { if ($resourceCount == 1 && $resource->is_sequence() && !$self->{FORCE_TOP}) { my $firstResource = $resource->map_start(); my $finishResource = $resource->map_finish(); - return - Apache::lonnavmaps::iterator->new($self->{NAV_MAP}, $firstResource, - $finishResource, $self->{FILTER}, - $self->{ALREADY_SEEN}, - $self->{CONDITION}, - $self->{FORCE_TOP}); + my $result; + my $rdump = Data::Dumper->new([$result]); + $result = Apache::lonnavmaps::iterator->new($self->{NAV_MAP}, $firstResource, + $finishResource, $self->{FILTER}, + $self->{ALREADY_SEEN}, + $self->{CONDITION}, + $self->{FORCE_TOP}); + return $result; + } @@ -3079,6 +3110,7 @@ sub new { $self->{ALREADY_SEEN}->{$self->{FIRST_RESOURCE}->{ID}} = 1; bless ($self); + my $selfDump = Data::Dumper->new([$self]); return $self; } @@ -3094,6 +3126,8 @@ sub next { # do so. if ($self->{RETURN_0} && !$self->{HAVE_RETURNED_0}) { $self->{HAVE_RETURNED_0} = 1; + my $nextTopLevel = $self->{NAV_MAP}->getById('0.0'); + return $self->{NAV_MAP}->getById('0.0'); } if ($self->{RETURN_0} && !$self->{HAVE_RETURNED_0_BEGIN_MAP}) { @@ -3113,13 +3147,13 @@ sub next { if ($self->{RECURSIVE_DEPTH} == 0) { $self->{RECURSIVE_ITERATOR_FLAG} = 0; } - return $next; } if (defined($self->{FORCE_NEXT})) { my $tmp = $self->{FORCE_NEXT}; $self->{FORCE_NEXT} = undef; + return $tmp; } @@ -3189,6 +3223,8 @@ sub next { # So we need to look at all the resources we can get to from here, # categorize them if we haven't seen them, remember if we have a new my $nextUnfiltered = $here->getNext(); + + my $maxDepthAdded = -1; for (@$nextUnfiltered) { @@ -3222,7 +3258,6 @@ sub next { $self->{RECURSIVE_ITERATOR_FLAG} = 1; my $firstResource = $self->{HERE}->map_start(); my $finishResource = $self->{HERE}->map_finish(); - $self->{RECURSIVE_ITERATOR} = Apache::lonnavmaps::iterator->new($self->{NAV_MAP}, $firstResource, $finishResource, $self->{FILTER}, @@ -3240,6 +3275,8 @@ sub next { return $self->next($closeAllPages); } + my $hereResource = $self->{HERE}; + return $self->{HERE}; } @@ -3406,6 +3443,7 @@ sub next { my $nextUnfiltered; if ($self->{DIRECTION} == FORWARD()) { $nextUnfiltered = $self->{HERE}->getNext(); + } else { $nextUnfiltered = $self->{HERE}->getPrevious(); } @@ -3819,7 +3857,7 @@ sub is_practice { sub is_problem { my $self=shift; my $src = $self->src(); - if ($src =~ /\.(problem|exam|quiz|assess|survey|form|library|task)$/) { + if ($src =~ /$LONCAPA::assess_re/) { return !($self->is_practice()); } return 0; @@ -3854,7 +3892,7 @@ sub is_incomplete { sub is_raw_problem { my $self=shift; my $src = $self->src(); - if ($src =~ /\.(problem|exam|quiz|assess|survey|form|library|task)$/) { + if ($src =~ /$LONCAPA::assess_re/) { return 1; } return 0; @@ -5065,12 +5103,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)); @@ -5078,50 +5117,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); @@ -5142,32 +5176,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; }