--- loncom/interface/lonnavmaps.pm 2011/11/27 21:33:56 1.467
+++ loncom/interface/lonnavmaps.pm 2012/05/07 19:43:44 1.484
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Navigate Maps Handler
#
-# $Id: lonnavmaps.pm,v 1.467 2011/11/27 21:33:56 www Exp $
+# $Id: lonnavmaps.pm,v 1.484 2012/05/07 19:43:44 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
@@ -464,7 +464,7 @@ returns 4
=item add_linkitem()
-=item show_linkitems()
+=item show_linkitems_toolbar()
=back
@@ -487,7 +487,7 @@ use DateTime();
# For debugging
-use Data::Dumper;
+# use Data::Dumper;
# symbolic constants
@@ -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=' '.
+ ''.
+ '
'.
+ '';
+ }
}
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 .
'
' .
@@ -1456,8 +1465,10 @@ sub render {
$link .= '®ister='.$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).'';
}
@@ -1465,7 +1476,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');
@@ -1498,18 +1509,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 .= '
'.
- &Apache::loncommon::help_open_menu('Navigation Screen','Navigation_Screen',undef,'RAT').' | ';
- $result .= ' | ';
- $result.=''.&mt('Tools:').' | ';
- $result.=&show_linkitems_toolbar($args->{'linkitems'});
- if ($args->{'sort_html'}) {
- $result.=' | | | '.
- ''.$args->{'sort_html'}.' |
';
- }
- $result .= '
';
+ $result .= &show_linkitems_toolbar($args,$condition);
} elsif ($args->{'sort_html'}) {
$result.=$args->{'sort_html'};
}
@@ -1846,41 +1859,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 = "";
+ }
return $result;
}
-
1;
@@ -2012,7 +2049,7 @@ sub new {
} else {
$self->change_user($self->{USERNAME}, $self->{DOMAIN});
}
-
+
return $self;
}
@@ -2047,6 +2084,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.
@@ -3054,13 +3093,13 @@ 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},
+ my $result;
+ return
+ Apache::lonnavmaps::iterator->new($self->{NAV_MAP}, $firstResource,
+ $finishResource, $self->{FILTER},
+ $self->{ALREADY_SEEN},
+ $self->{CONDITION},
$self->{FORCE_TOP});
-
}
# Set up some bookkeeping information.
@@ -3079,7 +3118,6 @@ sub new {
$self->{ALREADY_SEEN}->{$self->{FIRST_RESOURCE}->{ID}} = 1;
bless ($self);
-
return $self;
}
@@ -3094,6 +3132,7 @@ 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,7 +3152,6 @@ sub next {
if ($self->{RECURSIVE_DEPTH} == 0) {
$self->{RECURSIVE_ITERATOR_FLAG} = 0;
}
-
return $next;
}
@@ -3189,6 +3227,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 +3262,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},
@@ -3560,6 +3599,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.
@@ -4096,7 +4137,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:
@@ -4198,6 +4239,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);
@@ -4214,6 +4258,7 @@ sub duedate {
} else {
$date = $due_date;
}
+ $self->{DUEDATE_CACHE}->{$part} = $date;
return $date;
}
sub handgrade {
@@ -5065,12 +5110,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 +5124,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 +5183,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; }